#include <stdio.h> /* Number of double words needed to store all facility bits. */ #define S390_NUM_FACILITY_DW 2 unsigned long long stfle(unsigned long dw, unsigned bit_to_test) { unsigned long long hoststfle[S390_NUM_FACILITY_DW], match; register unsigned long long __nr asm("0") = dw - 1; int cc; asm volatile(" .insn s,0xb2b00000,%0 \n" /* stfle */ "ipm %2\n" "srl %2,28\n" : "=m" (*hoststfle), "+d" (__nr), "=d" (cc) : : "cc", "memory"); printf("the value of cc is %d and #double words is %llu\n", cc, __nr + 1); if (bit_to_test < 64) match = (hoststfle[0] & (1ULL << (63 - bit_to_test))); else if (bit_to_test < 128) match = (hoststfle[1] & (1ULL << (63 - bit_to_test))); else printf("code needs to be updated\n"); return match; } int main() { int dw = S390_NUM_FACILITY_DW; /* Test #1: Make sure STFLE returns sensible values. z/Arch facilities must be present. */ if ((stfle(dw, 1)) && stfle(dw, 2)) printf("The z/Architecture architectural mode is installed and active\n"); else printf("The z/Architecture architectural mode is not installed\n"); /* Test #2: Make sure the STFLE is supported. */ if (stfle(dw, 7)) printf("STFLE facility is installed\n"); else printf("STFLE facility is not installed\n"); /* Test #3: Tell STFLE to only write 1 DW of facility bits. Expected condition code should be 3 because this test is run on those machines only that need 2 do double words to store facility bits. */ dw = 1; if ((stfle(dw, 1)) && stfle(dw, 2)) printf("The z/Architecture architectural mode is installed and active\n"); else printf("The z/Architecture architectural mode is not installed\n"); /* Test #4: Message security assist */ if (stfle(dw, 17)) { printf("MSA facility is present\n"); } else { printf("No MSA facility available\n"); } return 0; }