mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
63 lines
1.9 KiB
C
63 lines
1.9 KiB
C
#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;
|
|
}
|