diff options
Diffstat (limited to 'drivers/kvm/x86.h')
-rw-r--r-- | drivers/kvm/x86.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/drivers/kvm/x86.h b/drivers/kvm/x86.h index 77a4a4ab9391..f1c43cafb0ca 100644 --- a/drivers/kvm/x86.h +++ b/drivers/kvm/x86.h | |||
@@ -267,4 +267,114 @@ static inline int is_paging(struct kvm_vcpu *vcpu) | |||
267 | 267 | ||
268 | int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3); | 268 | int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3); |
269 | int complete_pio(struct kvm_vcpu *vcpu); | 269 | int complete_pio(struct kvm_vcpu *vcpu); |
270 | |||
271 | static inline struct kvm_mmu_page *page_header(hpa_t shadow_page) | ||
272 | { | ||
273 | struct page *page = pfn_to_page(shadow_page >> PAGE_SHIFT); | ||
274 | |||
275 | return (struct kvm_mmu_page *)page_private(page); | ||
276 | } | ||
277 | |||
278 | static inline u16 read_fs(void) | ||
279 | { | ||
280 | u16 seg; | ||
281 | asm("mov %%fs, %0" : "=g"(seg)); | ||
282 | return seg; | ||
283 | } | ||
284 | |||
285 | static inline u16 read_gs(void) | ||
286 | { | ||
287 | u16 seg; | ||
288 | asm("mov %%gs, %0" : "=g"(seg)); | ||
289 | return seg; | ||
290 | } | ||
291 | |||
292 | static inline u16 read_ldt(void) | ||
293 | { | ||
294 | u16 ldt; | ||
295 | asm("sldt %0" : "=g"(ldt)); | ||
296 | return ldt; | ||
297 | } | ||
298 | |||
299 | static inline void load_fs(u16 sel) | ||
300 | { | ||
301 | asm("mov %0, %%fs" : : "rm"(sel)); | ||
302 | } | ||
303 | |||
304 | static inline void load_gs(u16 sel) | ||
305 | { | ||
306 | asm("mov %0, %%gs" : : "rm"(sel)); | ||
307 | } | ||
308 | |||
309 | #ifndef load_ldt | ||
310 | static inline void load_ldt(u16 sel) | ||
311 | { | ||
312 | asm("lldt %0" : : "rm"(sel)); | ||
313 | } | ||
314 | #endif | ||
315 | |||
316 | static inline void get_idt(struct descriptor_table *table) | ||
317 | { | ||
318 | asm("sidt %0" : "=m"(*table)); | ||
319 | } | ||
320 | |||
321 | static inline void get_gdt(struct descriptor_table *table) | ||
322 | { | ||
323 | asm("sgdt %0" : "=m"(*table)); | ||
324 | } | ||
325 | |||
326 | static inline unsigned long read_tr_base(void) | ||
327 | { | ||
328 | u16 tr; | ||
329 | asm("str %0" : "=g"(tr)); | ||
330 | return segment_base(tr); | ||
331 | } | ||
332 | |||
333 | #ifdef CONFIG_X86_64 | ||
334 | static inline unsigned long read_msr(unsigned long msr) | ||
335 | { | ||
336 | u64 value; | ||
337 | |||
338 | rdmsrl(msr, value); | ||
339 | return value; | ||
340 | } | ||
341 | #endif | ||
342 | |||
343 | static inline void fx_save(struct i387_fxsave_struct *image) | ||
344 | { | ||
345 | asm("fxsave (%0)":: "r" (image)); | ||
346 | } | ||
347 | |||
348 | static inline void fx_restore(struct i387_fxsave_struct *image) | ||
349 | { | ||
350 | asm("fxrstor (%0)":: "r" (image)); | ||
351 | } | ||
352 | |||
353 | static inline void fpu_init(void) | ||
354 | { | ||
355 | asm("finit"); | ||
356 | } | ||
357 | |||
358 | static inline u32 get_rdx_init_val(void) | ||
359 | { | ||
360 | return 0x600; /* P6 family */ | ||
361 | } | ||
362 | |||
363 | #define ASM_VMX_VMCLEAR_RAX ".byte 0x66, 0x0f, 0xc7, 0x30" | ||
364 | #define ASM_VMX_VMLAUNCH ".byte 0x0f, 0x01, 0xc2" | ||
365 | #define ASM_VMX_VMRESUME ".byte 0x0f, 0x01, 0xc3" | ||
366 | #define ASM_VMX_VMPTRLD_RAX ".byte 0x0f, 0xc7, 0x30" | ||
367 | #define ASM_VMX_VMREAD_RDX_RAX ".byte 0x0f, 0x78, 0xd0" | ||
368 | #define ASM_VMX_VMWRITE_RAX_RDX ".byte 0x0f, 0x79, 0xd0" | ||
369 | #define ASM_VMX_VMWRITE_RSP_RDX ".byte 0x0f, 0x79, 0xd4" | ||
370 | #define ASM_VMX_VMXOFF ".byte 0x0f, 0x01, 0xc4" | ||
371 | #define ASM_VMX_VMXON_RAX ".byte 0xf3, 0x0f, 0xc7, 0x30" | ||
372 | |||
373 | #define MSR_IA32_TIME_STAMP_COUNTER 0x010 | ||
374 | |||
375 | #define TSS_IOPB_BASE_OFFSET 0x66 | ||
376 | #define TSS_BASE_SIZE 0x68 | ||
377 | #define TSS_IOPB_SIZE (65536 / 8) | ||
378 | #define TSS_REDIRECTION_SIZE (256 / 8) | ||
379 | #define RMODE_TSS_SIZE (TSS_BASE_SIZE + TSS_REDIRECTION_SIZE + TSS_IOPB_SIZE + 1) | ||
270 | #endif | 380 | #endif |