Commit | Line | Data |
---|---|---|
1965aae3 PA |
1 | #ifndef _ASM_X86_LGUEST_H |
2 | #define _ASM_X86_LGUEST_H | |
625efab1 JS |
3 | |
4 | #define GDT_ENTRY_LGUEST_CS 10 | |
5 | #define GDT_ENTRY_LGUEST_DS 11 | |
6 | #define LGUEST_CS (GDT_ENTRY_LGUEST_CS * 8) | |
7 | #define LGUEST_DS (GDT_ENTRY_LGUEST_DS * 8) | |
8 | ||
9 | #ifndef __ASSEMBLY__ | |
10 | #include <asm/desc.h> | |
11 | ||
12 | #define GUEST_PL 1 | |
13 | ||
14 | /* Every guest maps the core switcher code. */ | |
15 | #define SHARED_SWITCHER_PAGES \ | |
16 | DIV_ROUND_UP(end_switcher_text - start_switcher_text, PAGE_SIZE) | |
17 | /* Pages for switcher itself, then two pages per cpu */ | |
9628937d | 18 | #define TOTAL_SWITCHER_PAGES (SHARED_SWITCHER_PAGES + 2 * nr_cpu_ids) |
625efab1 | 19 | |
2e04ef76 | 20 | /* We map at -4M (-2M for PAE) for ease of mapping (one PTE page). */ |
acdd0b62 MZ |
21 | #ifdef CONFIG_X86_PAE |
22 | #define SWITCHER_ADDR 0xFFE00000 | |
23 | #else | |
625efab1 | 24 | #define SWITCHER_ADDR 0xFFC00000 |
acdd0b62 | 25 | #endif |
625efab1 JS |
26 | |
27 | /* Found in switcher.S */ | |
28 | extern unsigned long default_idt_entries[]; | |
29 | ||
cbc34973 HH |
30 | /* Declarations for definitions in lguest_guest.S */ |
31 | extern char lguest_noirq_start[], lguest_noirq_end[]; | |
32 | extern const char lgstart_cli[], lgend_cli[]; | |
33 | extern const char lgstart_sti[], lgend_sti[]; | |
34 | extern const char lgstart_popf[], lgend_popf[]; | |
35 | extern const char lgstart_pushf[], lgend_pushf[]; | |
36 | extern const char lgstart_iret[], lgend_iret[]; | |
37 | ||
38 | extern void lguest_iret(void); | |
39 | extern void lguest_init(void); | |
40 | ||
fb444c7b | 41 | struct lguest_regs { |
625efab1 | 42 | /* Manually saved part. */ |
4614a3a3 | 43 | unsigned long eax, ebx, ecx, edx; |
625efab1 JS |
44 | unsigned long esi, edi, ebp; |
45 | unsigned long gs; | |
625efab1 JS |
46 | unsigned long fs, ds, es; |
47 | unsigned long trapnum, errcode; | |
48 | /* Trap pushed part */ | |
49 | unsigned long eip; | |
50 | unsigned long cs; | |
51 | unsigned long eflags; | |
52 | unsigned long esp; | |
53 | unsigned long ss; | |
54 | }; | |
55 | ||
56 | /* This is a guest-specific page (mapped ro) into the guest. */ | |
fb444c7b | 57 | struct lguest_ro_state { |
625efab1 JS |
58 | /* Host information we need to restore when we switch back. */ |
59 | u32 host_cr3; | |
6b68f01b GOC |
60 | struct desc_ptr host_idt_desc; |
61 | struct desc_ptr host_gdt_desc; | |
625efab1 JS |
62 | u32 host_sp; |
63 | ||
64 | /* Fields which are used when guest is running. */ | |
6b68f01b GOC |
65 | struct desc_ptr guest_idt_desc; |
66 | struct desc_ptr guest_gdt_desc; | |
ca241c75 | 67 | struct x86_hw_tss guest_tss; |
625efab1 JS |
68 | struct desc_struct guest_idt[IDT_ENTRIES]; |
69 | struct desc_struct guest_gdt[GDT_ENTRIES]; | |
70 | }; | |
71 | ||
fb444c7b | 72 | struct lg_cpu_arch { |
625efab1 JS |
73 | /* The GDT entries copied into lguest_ro_state when running. */ |
74 | struct desc_struct gdt[GDT_ENTRIES]; | |
75 | ||
76 | /* The IDT entries: some copied into lguest_ro_state when running. */ | |
77 | struct desc_struct idt[IDT_ENTRIES]; | |
78 | ||
79 | /* The address of the last guest-visible pagefault (ie. cr2). */ | |
80 | unsigned long last_pagefault; | |
81 | }; | |
82 | ||
83 | static inline void lguest_set_ts(void) | |
84 | { | |
85 | u32 cr0; | |
86 | ||
87 | cr0 = read_cr0(); | |
88 | if (!(cr0 & 8)) | |
fb444c7b | 89 | write_cr0(cr0 | 8); |
625efab1 JS |
90 | } |
91 | ||
92 | /* Full 4G segment descriptors, suitable for CS and DS. */ | |
1e5de182 AM |
93 | #define FULL_EXEC_SEGMENT \ |
94 | ((struct desc_struct)GDT_ENTRY_INIT(0xc09b, 0, 0xfffff)) | |
95 | #define FULL_SEGMENT ((struct desc_struct)GDT_ENTRY_INIT(0xc093, 0, 0xfffff)) | |
625efab1 JS |
96 | |
97 | #endif /* __ASSEMBLY__ */ | |
98 | ||
1965aae3 | 99 | #endif /* _ASM_X86_LGUEST_H */ |