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