diff options
Diffstat (limited to 'include/asm-x86/xen/interface.h')
-rw-r--r-- | include/asm-x86/xen/interface.h | 139 |
1 files changed, 49 insertions, 90 deletions
diff --git a/include/asm-x86/xen/interface.h b/include/asm-x86/xen/interface.h index 6227000a1e84..9d810f2538a2 100644 --- a/include/asm-x86/xen/interface.h +++ b/include/asm-x86/xen/interface.h | |||
@@ -1,13 +1,13 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | * arch-x86_32.h | 2 | * arch-x86_32.h |
3 | * | 3 | * |
4 | * Guest OS interface to x86 32-bit Xen. | 4 | * Guest OS interface to x86 Xen. |
5 | * | 5 | * |
6 | * Copyright (c) 2004, K A Fraser | 6 | * Copyright (c) 2004, K A Fraser |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #ifndef __XEN_PUBLIC_ARCH_X86_32_H__ | 9 | #ifndef __ASM_X86_XEN_INTERFACE_H |
10 | #define __XEN_PUBLIC_ARCH_X86_32_H__ | 10 | #define __ASM_X86_XEN_INTERFACE_H |
11 | 11 | ||
12 | #ifdef __XEN__ | 12 | #ifdef __XEN__ |
13 | #define __DEFINE_GUEST_HANDLE(name, type) \ | 13 | #define __DEFINE_GUEST_HANDLE(name, type) \ |
@@ -57,6 +57,17 @@ DEFINE_GUEST_HANDLE(long); | |||
57 | DEFINE_GUEST_HANDLE(void); | 57 | DEFINE_GUEST_HANDLE(void); |
58 | #endif | 58 | #endif |
59 | 59 | ||
60 | #ifndef HYPERVISOR_VIRT_START | ||
61 | #define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START) | ||
62 | #endif | ||
63 | |||
64 | #ifndef machine_to_phys_mapping | ||
65 | #define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) | ||
66 | #endif | ||
67 | |||
68 | /* Maximum number of virtual CPUs in multi-processor guests. */ | ||
69 | #define MAX_VIRT_CPUS 32 | ||
70 | |||
60 | /* | 71 | /* |
61 | * SEGMENT DESCRIPTOR TABLES | 72 | * SEGMENT DESCRIPTOR TABLES |
62 | */ | 73 | */ |
@@ -71,58 +82,21 @@ DEFINE_GUEST_HANDLE(void); | |||
71 | #define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8) | 82 | #define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8) |
72 | 83 | ||
73 | /* | 84 | /* |
74 | * These flat segments are in the Xen-private section of every GDT. Since these | ||
75 | * are also present in the initial GDT, many OSes will be able to avoid | ||
76 | * installing their own GDT. | ||
77 | */ | ||
78 | #define FLAT_RING1_CS 0xe019 /* GDT index 259 */ | ||
79 | #define FLAT_RING1_DS 0xe021 /* GDT index 260 */ | ||
80 | #define FLAT_RING1_SS 0xe021 /* GDT index 260 */ | ||
81 | #define FLAT_RING3_CS 0xe02b /* GDT index 261 */ | ||
82 | #define FLAT_RING3_DS 0xe033 /* GDT index 262 */ | ||
83 | #define FLAT_RING3_SS 0xe033 /* GDT index 262 */ | ||
84 | |||
85 | #define FLAT_KERNEL_CS FLAT_RING1_CS | ||
86 | #define FLAT_KERNEL_DS FLAT_RING1_DS | ||
87 | #define FLAT_KERNEL_SS FLAT_RING1_SS | ||
88 | #define FLAT_USER_CS FLAT_RING3_CS | ||
89 | #define FLAT_USER_DS FLAT_RING3_DS | ||
90 | #define FLAT_USER_SS FLAT_RING3_SS | ||
91 | |||
92 | /* And the trap vector is... */ | ||
93 | #define TRAP_INSTR "int $0x82" | ||
94 | |||
95 | /* | ||
96 | * Virtual addresses beyond this are not modifiable by guest OSes. The | ||
97 | * machine->physical mapping table starts at this address, read-only. | ||
98 | */ | ||
99 | #ifdef CONFIG_X86_PAE | ||
100 | #define __HYPERVISOR_VIRT_START 0xF5800000 | ||
101 | #else | ||
102 | #define __HYPERVISOR_VIRT_START 0xFC000000 | ||
103 | #endif | ||
104 | |||
105 | #ifndef HYPERVISOR_VIRT_START | ||
106 | #define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START) | ||
107 | #endif | ||
108 | |||
109 | #ifndef machine_to_phys_mapping | ||
110 | #define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) | ||
111 | #endif | ||
112 | |||
113 | /* Maximum number of virtual CPUs in multi-processor guests. */ | ||
114 | #define MAX_VIRT_CPUS 32 | ||
115 | |||
116 | #ifndef __ASSEMBLY__ | ||
117 | |||
118 | /* | ||
119 | * Send an array of these to HYPERVISOR_set_trap_table() | 85 | * Send an array of these to HYPERVISOR_set_trap_table() |
86 | * The privilege level specifies which modes may enter a trap via a software | ||
87 | * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate | ||
88 | * privilege levels as follows: | ||
89 | * Level == 0: Noone may enter | ||
90 | * Level == 1: Kernel may enter | ||
91 | * Level == 2: Kernel may enter | ||
92 | * Level == 3: Everyone may enter | ||
120 | */ | 93 | */ |
121 | #define TI_GET_DPL(_ti) ((_ti)->flags & 3) | 94 | #define TI_GET_DPL(_ti) ((_ti)->flags & 3) |
122 | #define TI_GET_IF(_ti) ((_ti)->flags & 4) | 95 | #define TI_GET_IF(_ti) ((_ti)->flags & 4) |
123 | #define TI_SET_DPL(_ti, _dpl) ((_ti)->flags |= (_dpl)) | 96 | #define TI_SET_DPL(_ti, _dpl) ((_ti)->flags |= (_dpl)) |
124 | #define TI_SET_IF(_ti, _if) ((_ti)->flags |= ((!!(_if))<<2)) | 97 | #define TI_SET_IF(_ti, _if) ((_ti)->flags |= ((!!(_if))<<2)) |
125 | 98 | ||
99 | #ifndef __ASSEMBLY__ | ||
126 | struct trap_info { | 100 | struct trap_info { |
127 | uint8_t vector; /* exception vector */ | 101 | uint8_t vector; /* exception vector */ |
128 | uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */ | 102 | uint8_t flags; /* 0-3: privilege level; 4: clear event enable? */ |
@@ -131,32 +105,21 @@ struct trap_info { | |||
131 | }; | 105 | }; |
132 | DEFINE_GUEST_HANDLE_STRUCT(trap_info); | 106 | DEFINE_GUEST_HANDLE_STRUCT(trap_info); |
133 | 107 | ||
134 | struct cpu_user_regs { | 108 | struct arch_shared_info { |
135 | uint32_t ebx; | 109 | unsigned long max_pfn; /* max pfn that appears in table */ |
136 | uint32_t ecx; | 110 | /* Frame containing list of mfns containing list of mfns containing p2m. */ |
137 | uint32_t edx; | 111 | unsigned long pfn_to_mfn_frame_list_list; |
138 | uint32_t esi; | 112 | unsigned long nmi_reason; |
139 | uint32_t edi; | ||
140 | uint32_t ebp; | ||
141 | uint32_t eax; | ||
142 | uint16_t error_code; /* private */ | ||
143 | uint16_t entry_vector; /* private */ | ||
144 | uint32_t eip; | ||
145 | uint16_t cs; | ||
146 | uint8_t saved_upcall_mask; | ||
147 | uint8_t _pad0; | ||
148 | uint32_t eflags; /* eflags.IF == !saved_upcall_mask */ | ||
149 | uint32_t esp; | ||
150 | uint16_t ss, _pad1; | ||
151 | uint16_t es, _pad2; | ||
152 | uint16_t ds, _pad3; | ||
153 | uint16_t fs, _pad4; | ||
154 | uint16_t gs, _pad5; | ||
155 | }; | 113 | }; |
156 | DEFINE_GUEST_HANDLE_STRUCT(cpu_user_regs); | 114 | #endif /* !__ASSEMBLY__ */ |
157 | 115 | ||
158 | typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */ | 116 | #ifdef CONFIG_X86_32 |
117 | #include "interface_32.h" | ||
118 | #else | ||
119 | #include "interface_64.h" | ||
120 | #endif | ||
159 | 121 | ||
122 | #ifndef __ASSEMBLY__ | ||
160 | /* | 123 | /* |
161 | * The following is all CPU context. Note that the fpu_ctxt block is filled | 124 | * The following is all CPU context. Note that the fpu_ctxt block is filled |
162 | * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. | 125 | * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. |
@@ -173,33 +136,29 @@ struct vcpu_guest_context { | |||
173 | unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ | 136 | unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ |
174 | unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ | 137 | unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ |
175 | unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ | 138 | unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ |
139 | /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ | ||
176 | unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ | 140 | unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ |
177 | unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */ | 141 | unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */ |
142 | #ifdef __i386__ | ||
178 | unsigned long event_callback_cs; /* CS:EIP of event callback */ | 143 | unsigned long event_callback_cs; /* CS:EIP of event callback */ |
179 | unsigned long event_callback_eip; | 144 | unsigned long event_callback_eip; |
180 | unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ | 145 | unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ |
181 | unsigned long failsafe_callback_eip; | 146 | unsigned long failsafe_callback_eip; |
147 | #else | ||
148 | unsigned long event_callback_eip; | ||
149 | unsigned long failsafe_callback_eip; | ||
150 | unsigned long syscall_callback_eip; | ||
151 | #endif | ||
182 | unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ | 152 | unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ |
153 | #ifdef __x86_64__ | ||
154 | /* Segment base addresses. */ | ||
155 | uint64_t fs_base; | ||
156 | uint64_t gs_base_kernel; | ||
157 | uint64_t gs_base_user; | ||
158 | #endif | ||
183 | }; | 159 | }; |
184 | DEFINE_GUEST_HANDLE_STRUCT(vcpu_guest_context); | 160 | DEFINE_GUEST_HANDLE_STRUCT(vcpu_guest_context); |
185 | 161 | #endif /* !__ASSEMBLY__ */ | |
186 | struct arch_shared_info { | ||
187 | unsigned long max_pfn; /* max pfn that appears in table */ | ||
188 | /* Frame containing list of mfns containing list of mfns containing p2m. */ | ||
189 | unsigned long pfn_to_mfn_frame_list_list; | ||
190 | unsigned long nmi_reason; | ||
191 | }; | ||
192 | |||
193 | struct arch_vcpu_info { | ||
194 | unsigned long cr2; | ||
195 | unsigned long pad[5]; /* sizeof(struct vcpu_info) == 64 */ | ||
196 | }; | ||
197 | |||
198 | struct xen_callback { | ||
199 | unsigned long cs; | ||
200 | unsigned long eip; | ||
201 | }; | ||
202 | #endif /* !__ASSEMBLY__ */ | ||
203 | 162 | ||
204 | /* | 163 | /* |
205 | * Prefix forces emulation of some non-trapping instructions. | 164 | * Prefix forces emulation of some non-trapping instructions. |
@@ -213,4 +172,4 @@ struct xen_callback { | |||
213 | #define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" | 172 | #define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" |
214 | #endif | 173 | #endif |
215 | 174 | ||
216 | #endif | 175 | #endif /* __ASM_X86_XEN_INTERFACE_H */ |