1 #include <stdio.h>
2
3 /* Number of double words needed to store all facility bits. */
4 #define S390_NUM_FACILITY_DW 2
5
6
stfle(unsigned long dw,unsigned bit_to_test)7 unsigned long long stfle(unsigned long dw, unsigned bit_to_test)
8 {
9 unsigned long long hoststfle[S390_NUM_FACILITY_DW], match;
10 register unsigned long long __nr asm("0") = dw - 1;
11 int cc;
12
13 asm volatile(" .insn s,0xb2b00000,%0 \n" /* stfle */
14 "ipm %2\n"
15 "srl %2,28\n"
16 : "=m" (*hoststfle), "+d" (__nr), "=d" (cc) : : "cc", "memory");
17
18 printf("the value of cc is %d and #double words is %llu\n", cc, __nr + 1);
19 if (bit_to_test < 64)
20 match = (hoststfle[0] & (1ULL << (63 - bit_to_test)));
21 else if (bit_to_test < 128)
22 match = (hoststfle[1] & (1ULL << (63 - bit_to_test)));
23 else
24 printf("code needs to be updated\n");
25
26 return match;
27 }
28
main()29 int main()
30 {
31 int dw = S390_NUM_FACILITY_DW;
32
33 /* Test #1: Make sure STFLE returns sensible values. z/Arch facilities
34 must be present. */
35 if ((stfle(dw, 1)) && stfle(dw, 2))
36 printf("The z/Architecture architectural mode is installed and active\n");
37 else
38 printf("The z/Architecture architectural mode is not installed\n");
39
40 /* Test #2: Make sure the STFLE is supported. */
41 if (stfle(dw, 7))
42 printf("STFLE facility is installed\n");
43 else
44 printf("STFLE facility is not installed\n");
45
46 /* Test #3: Tell STFLE to only write 1 DW of facility bits. Expected condition
47 code should be 3 because this test is run on those machines only
48 that need 2 do double words to store facility bits. */
49 dw = 1;
50 if ((stfle(dw, 1)) && stfle(dw, 2))
51 printf("The z/Architecture architectural mode is installed and active\n");
52 else
53 printf("The z/Architecture architectural mode is not installed\n");
54
55 /* Test #4: Message security assist */
56 if (stfle(dw, 17)) {
57 printf("MSA facility is present\n");
58 } else {
59 printf("No MSA facility available\n");
60 }
61 return 0;
62 }
63