1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef __X86_CONTROL_REGS_H
16#define __X86_CONTROL_REGS_H
17
18
19
20
21
22static inline unsigned long read_cr0(void)
23{
24 unsigned long val;
25
26 asm volatile ("movl %%cr0, %0" : "=r" (val) : : "memory");
27 return val;
28}
29
30static inline void write_cr0(unsigned long val)
31{
32 asm volatile ("movl %0, %%cr0" : : "r" (val) : "memory");
33}
34
35static inline unsigned long read_cr2(void)
36{
37 unsigned long val;
38
39 asm volatile("mov %%cr2,%0\n\t" : "=r" (val) : : "memory");
40 return val;
41}
42
43static inline unsigned long read_cr3(void)
44{
45 unsigned long val;
46
47 asm volatile("mov %%cr3,%0\n\t" : "=r" (val) : : "memory");
48 return val;
49}
50
51static inline unsigned long read_cr4(void)
52{
53 unsigned long val;
54
55 asm volatile("mov %%cr4,%0\n\t" : "=r" (val) : : "memory");
56 return val;
57}
58
59static inline unsigned long get_debugreg(int regno)
60{
61 unsigned long val = 0;
62
63 switch (regno) {
64 case 0:
65 asm("mov %%db0, %0" : "=r" (val));
66 break;
67 case 1:
68 asm("mov %%db1, %0" : "=r" (val));
69 break;
70 case 2:
71 asm("mov %%db2, %0" : "=r" (val));
72 break;
73 case 3:
74 asm("mov %%db3, %0" : "=r" (val));
75 break;
76 case 6:
77 asm("mov %%db6, %0" : "=r" (val));
78 break;
79 case 7:
80 asm("mov %%db7, %0" : "=r" (val));
81 break;
82 default:
83 val = 0;
84 }
85 return val;
86}
87
88#endif
89