This source file includes following definitions.
- invlpg
- lidt
- lldt
- ltr
- lcr0
- rcr0
- rcr2
- lcr3
- rcr3
- lcr4
- rcr4
- tlbflush
- tlbflushg
- disable_intr
- enable_intr
- read_eflags
- write_eflags
- wbinvd
- wrmsr
- rdmsr
- rdmsr_locked
- wrmsr_locked
- breakpoint
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 #ifndef _I386_CPUFUNC_H_
35 #define _I386_CPUFUNC_H_
36
37 #ifdef _KERNEL
38
39
40
41
42
43 #include <sys/cdefs.h>
44 #include <sys/types.h>
45
46 #include <machine/specialreg.h>
47
48 static __inline void invlpg(u_int);
49 static __inline void lidt(void *);
50 static __inline void lldt(u_short);
51 static __inline void ltr(u_short);
52 static __inline void lcr0(u_int);
53 static __inline u_int rcr0(void);
54 static __inline u_int rcr2(void);
55 static __inline void lcr3(u_int);
56 static __inline u_int rcr3(void);
57 static __inline void lcr4(u_int);
58 static __inline u_int rcr4(void);
59 static __inline void tlbflush(void);
60 static __inline void tlbflushg(void);
61 static __inline void disable_intr(void);
62 static __inline void enable_intr(void);
63 static __inline u_int read_eflags(void);
64 static __inline void write_eflags(u_int);
65 static __inline void wbinvd(void);
66 static __inline void wrmsr(u_int, u_int64_t);
67 static __inline u_int64_t rdmsr(u_int);
68 static __inline void breakpoint(void);
69
70 static __inline void
71 invlpg(u_int addr)
72 {
73 __asm __volatile("invlpg (%0)" : : "r" (addr) : "memory");
74 }
75
76 static __inline void
77 lidt(void *p)
78 {
79 __asm __volatile("lidt (%0)" : : "r" (p));
80 }
81
82 static __inline void
83 lldt(u_short sel)
84 {
85 __asm __volatile("lldt %0" : : "r" (sel));
86 }
87
88 static __inline void
89 ltr(u_short sel)
90 {
91 __asm __volatile("ltr %0" : : "r" (sel));
92 }
93
94 static __inline void
95 lcr0(u_int val)
96 {
97 __asm __volatile("movl %0,%%cr0" : : "r" (val));
98 }
99
100 static __inline u_int
101 rcr0(void)
102 {
103 u_int val;
104 __asm __volatile("movl %%cr0,%0" : "=r" (val));
105 return val;
106 }
107
108 static __inline u_int
109 rcr2(void)
110 {
111 u_int val;
112 __asm __volatile("movl %%cr2,%0" : "=r" (val));
113 return val;
114 }
115
116 static __inline void
117 lcr3(u_int val)
118 {
119 __asm __volatile("movl %0,%%cr3" : : "r" (val));
120 }
121
122 static __inline u_int
123 rcr3(void)
124 {
125 u_int val;
126 __asm __volatile("movl %%cr3,%0" : "=r" (val));
127 return val;
128 }
129
130 static __inline void
131 lcr4(u_int val)
132 {
133 __asm __volatile("movl %0,%%cr4" : : "r" (val));
134 }
135
136 static __inline u_int
137 rcr4(void)
138 {
139 u_int val;
140 __asm __volatile("movl %%cr4,%0" : "=r" (val));
141 return val;
142 }
143
144 static __inline void
145 tlbflush(void)
146 {
147 u_int val;
148 __asm __volatile("movl %%cr3,%0" : "=r" (val));
149 __asm __volatile("movl %0,%%cr3" : : "r" (val));
150 }
151
152 static __inline void
153 tlbflushg(void)
154 {
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175 #if defined(I686_CPU)
176 if (cpu_feature & CPUID_PGE) {
177 u_int cr4 = rcr4();
178 lcr4(cr4 & ~CR4_PGE);
179 lcr4(cr4);
180 } else
181 #endif
182 tlbflush();
183 }
184
185 #ifdef notyet
186 void setidt(int idx, caddr_t func, int typ, int dpl);
187 #endif
188
189
190
191
192 static __inline void
193 disable_intr(void)
194 {
195 __asm __volatile("cli");
196 }
197
198 static __inline void
199 enable_intr(void)
200 {
201 __asm __volatile("sti");
202 }
203
204 static __inline u_int
205 read_eflags(void)
206 {
207 u_int ef;
208
209 __asm __volatile("pushfl; popl %0" : "=r" (ef));
210 return (ef);
211 }
212
213 static __inline void
214 write_eflags(u_int ef)
215 {
216 __asm __volatile("pushl %0; popfl" : : "r" (ef));
217 }
218
219 static __inline void
220 wbinvd(void)
221 {
222 __asm __volatile("wbinvd");
223 }
224
225
226 static __inline void
227 wrmsr(u_int msr, u_int64_t newval)
228 {
229 __asm __volatile("wrmsr" : : "A" (newval), "c" (msr));
230 }
231
232 static __inline u_int64_t
233 rdmsr(u_int msr)
234 {
235 u_int64_t rv;
236
237 __asm __volatile("rdmsr" : "=A" (rv) : "c" (msr));
238 return (rv);
239 }
240
241
242
243
244
245
246
247 #define OPTERON_MSR_PASSCODE 0x9c5a203a
248
249 static __inline u_int64_t
250 rdmsr_locked(u_int msr, u_int code)
251 {
252 uint64_t rv;
253 __asm volatile("rdmsr"
254 : "=A" (rv)
255 : "c" (msr), "D" (code));
256 return (rv);
257 }
258
259 static __inline void
260 wrmsr_locked(u_int msr, u_int code, u_int64_t newval)
261 {
262 __asm volatile("wrmsr"
263 :
264 : "A" (newval), "c" (msr), "D" (code));
265 }
266
267
268 static __inline void
269 breakpoint(void)
270 {
271 __asm __volatile("int $3");
272 }
273
274 #ifdef I686_CPU
275 void amd64_errata(struct cpu_info *);
276 #endif
277
278 #endif
279 #endif