1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
#include <stdio.h>
typedef unsigned long long int ULong;
ULong do_clc ( void )
{
ULong res;
__asm__ __volatile__(
"pushq $0x8d5\n\t" /* OSZACP */
"popfq\n\t"
"clc\n\t"
"pushfq\n\t"
"popq %0"
: "=r"(res)
:
: "memory", "cc"
);
return res;
}
ULong do_stc ( void )
{
ULong res;
__asm__ __volatile__(
"pushq $0x0\n\t"
"popfq\n\t"
"stc\n\t"
"pushfq\n\t"
"popq %0"
: "=r"(res)
:
: "memory", "cc"
);
return res;
}
ULong do_cmc ( void )
{
ULong res;
__asm__ __volatile__(
"pushq $0x0\n\t"
"popfq\n\t"
"stc\n\t"
"cmc\n\t"
"pushfq\n\t"
"popq %0"
: "=r"(res)
:
: "memory", "cc"
);
return res;
}
int main ( void )
{
printf("clc: 0x%016llx\n", 0x8d5 & do_clc());
printf("stc: 0x%016llx\n", 0x8d5 & do_stc());
printf("cmc: 0x%016llx\n", 0x8d5 & do_cmc());
return 0;
}
|