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