2 * Jailhouse, a Linux-based partitioning hypervisor
4 * Copyright (c) 2005-2007, Advanced Micro Devices, Inc
5 * Copyright (c) 2004, Intel Corporation.
6 * Copyright (c) Valentine Sinitsyn, 2014
9 * Valentine Sinitsyn <valentine.sinitsyn@gmail.com>
11 * This file is partially derived from
12 * xvisor/arch/x86/cpu/x86_64/include/vm/amd_vmcb.h, which comes with
13 * Xvisor 0.2 (http://xhypervisor.org).
15 * Copyright (c) 2005-2007, Advanced Micro Devices, Inc
16 * Copyright (c) 2004, Intel Corporation.
18 * This work is licensed under the terms of the GNU GPL, version 2. See
19 * the COPYING file in the top-level directory.
22 #ifndef _JAILHOUSE_ASM_SVM_H
23 #define _JAILHOUSE_ASM_SVM_H
25 #include <jailhouse/types.h>
27 #define EFER_SVME (1UL << 12)
28 #define VM_CR_SVMDIS (1UL << 4)
30 #define MSR_VM_CR 0xc0010114
31 #define MSR_VM_HSAVE_PA 0xc0010117
33 #define SVM_MSRPM_0000 0
34 #define SVM_MSRPM_C000 1
35 #define SVM_MSRPM_C001 2
36 #define SVM_MSRPM_RESV 3
38 #define SVM_TLB_FLUSH_ALL 0x01
39 #define SVM_TLB_FLUSH_GUEST 0x03
41 #define NPT_PAGE_DIR_LEVELS 4
48 } __attribute__((packed));
50 /* general 1 intercepts */
51 enum generic_interrupt_1_bits {
52 GENERAL1_INTERCEPT_INTR = 1 << 0,
53 GENERAL1_INTERCEPT_NMI = 1 << 1,
54 GENERAL1_INTERCEPT_SMI = 1 << 2,
55 GENERAL1_INTERCEPT_INIT = 1 << 3,
56 GENERAL1_INTERCEPT_VINTR = 1 << 4,
57 GENERAL1_INTERCEPT_CR0_SEL_WRITE = 1 << 5,
58 GENERAL1_INTERCEPT_IDTR_READ = 1 << 6,
59 GENERAL1_INTERCEPT_GDTR_READ = 1 << 7,
60 GENERAL1_INTERCEPT_LDTR_READ = 1 << 8,
61 GENERAL1_INTERCEPT_TR_READ = 1 << 9,
62 GENERAL1_INTERCEPT_IDTR_WRITE = 1 << 10,
63 GENERAL1_INTERCEPT_GDTR_WRITE = 1 << 11,
64 GENERAL1_INTERCEPT_LDTR_WRITE = 1 << 12,
65 GENERAL1_INTERCEPT_TR_WRITE = 1 << 13,
66 GENERAL1_INTERCEPT_RDTSC = 1 << 14,
67 GENERAL1_INTERCEPT_RDPMC = 1 << 15,
68 GENERAL1_INTERCEPT_PUSHF = 1 << 16,
69 GENERAL1_INTERCEPT_POPF = 1 << 17,
70 GENERAL1_INTERCEPT_CPUID = 1 << 18,
71 GENERAL1_INTERCEPT_RSM = 1 << 19,
72 GENERAL1_INTERCEPT_IRET = 1 << 20,
73 GENERAL1_INTERCEPT_SWINT = 1 << 21,
74 GENERAL1_INTERCEPT_INVD = 1 << 22,
75 GENERAL1_INTERCEPT_PAUSE = 1 << 23,
76 GENERAL1_INTERCEPT_HLT = 1 << 24,
77 GENERAL1_INTERCEPT_INVLPG = 1 << 25,
78 GENERAL1_INTERCEPT_INVLPGA = 1 << 26,
79 GENERAL1_INTERCEPT_IOIO_PROT = 1 << 27,
80 GENERAL1_INTERCEPT_MSR_PROT = 1 << 28,
81 GENERAL1_INTERCEPT_TASK_SWITCH = 1 << 29,
82 GENERAL1_INTERCEPT_FERR_FREEZE = 1 << 30,
83 GENERAL1_INTERCEPT_SHUTDOWN_EVT = 1 << 31
86 /* general 2 intercepts */
87 enum generic_interrupts_2_bits {
88 GENERAL2_INTERCEPT_VMRUN = 1 << 0,
89 GENERAL2_INTERCEPT_VMMCALL = 1 << 1,
90 GENERAL2_INTERCEPT_VMLOAD = 1 << 2,
91 GENERAL2_INTERCEPT_VMSAVE = 1 << 3,
92 GENERAL2_INTERCEPT_STGI = 1 << 4,
93 GENERAL2_INTERCEPT_CLGI = 1 << 5,
94 GENERAL2_INTERCEPT_SKINIT = 1 << 6,
95 GENERAL2_INTERCEPT_RDTSCP = 1 << 7,
96 GENERAL2_INTERCEPT_ICEBP = 1 << 8,
97 GENERAL2_INTERCEPT_WBINVD = 1 << 9,
98 GENERAL2_INTERCEPT_MONITOR = 1 << 10,
99 GENERAL2_INTERCEPT_MWAIT = 1 << 11,
100 GENERAL2_INTERCEPT_MWAIT_CONDITIONAL = 1 << 12
104 /* control register read exitcodes */
115 VMEXIT_CR10_READ = 10,
116 VMEXIT_CR11_READ = 11,
117 VMEXIT_CR12_READ = 12,
118 VMEXIT_CR13_READ = 13,
119 VMEXIT_CR14_READ = 14,
120 VMEXIT_CR15_READ = 15,
122 /* control register write exitcodes */
123 VMEXIT_CR0_WRITE = 16,
124 VMEXIT_CR1_WRITE = 17,
125 VMEXIT_CR2_WRITE = 18,
126 VMEXIT_CR3_WRITE = 19,
127 VMEXIT_CR4_WRITE = 20,
128 VMEXIT_CR5_WRITE = 21,
129 VMEXIT_CR6_WRITE = 22,
130 VMEXIT_CR7_WRITE = 23,
131 VMEXIT_CR8_WRITE = 24,
132 VMEXIT_CR9_WRITE = 25,
133 VMEXIT_CR10_WRITE = 26,
134 VMEXIT_CR11_WRITE = 27,
135 VMEXIT_CR12_WRITE = 28,
136 VMEXIT_CR13_WRITE = 29,
137 VMEXIT_CR14_WRITE = 30,
138 VMEXIT_CR15_WRITE = 31,
140 /* debug register read exitcodes */
141 VMEXIT_DR0_READ = 32,
142 VMEXIT_DR1_READ = 33,
143 VMEXIT_DR2_READ = 34,
144 VMEXIT_DR3_READ = 35,
145 VMEXIT_DR4_READ = 36,
146 VMEXIT_DR5_READ = 37,
147 VMEXIT_DR6_READ = 38,
148 VMEXIT_DR7_READ = 39,
149 VMEXIT_DR8_READ = 40,
150 VMEXIT_DR9_READ = 41,
151 VMEXIT_DR10_READ = 42,
152 VMEXIT_DR11_READ = 43,
153 VMEXIT_DR12_READ = 44,
154 VMEXIT_DR13_READ = 45,
155 VMEXIT_DR14_READ = 46,
156 VMEXIT_DR15_READ = 47,
158 /* debug register write exitcodes */
159 VMEXIT_DR0_WRITE = 48,
160 VMEXIT_DR1_WRITE = 49,
161 VMEXIT_DR2_WRITE = 50,
162 VMEXIT_DR3_WRITE = 51,
163 VMEXIT_DR4_WRITE = 52,
164 VMEXIT_DR5_WRITE = 53,
165 VMEXIT_DR6_WRITE = 54,
166 VMEXIT_DR7_WRITE = 55,
167 VMEXIT_DR8_WRITE = 56,
168 VMEXIT_DR9_WRITE = 57,
169 VMEXIT_DR10_WRITE = 58,
170 VMEXIT_DR11_WRITE = 59,
171 VMEXIT_DR12_WRITE = 60,
172 VMEXIT_DR13_WRITE = 61,
173 VMEXIT_DR14_WRITE = 62,
174 VMEXIT_DR15_WRITE = 63,
176 /* processor exception exitcodes (VMEXIT_EXCP[0-31]) */
177 VMEXIT_EXCEPTION_DE = 64, /* divide-by-zero-error */
178 VMEXIT_EXCEPTION_DB = 65, /* debug */
179 VMEXIT_EXCEPTION_NMI = 66, /* non-maskable-interrupt */
180 VMEXIT_EXCEPTION_BP = 67, /* breakpoint */
181 VMEXIT_EXCEPTION_OF = 68, /* overflow */
182 VMEXIT_EXCEPTION_BR = 69, /* bound-range */
183 VMEXIT_EXCEPTION_UD = 70, /* invalid-opcode*/
184 VMEXIT_EXCEPTION_NM = 71, /* device-not-available */
185 VMEXIT_EXCEPTION_DF = 72, /* double-fault */
186 VMEXIT_EXCEPTION_09 = 73, /* unsupported (reserved) */
187 VMEXIT_EXCEPTION_TS = 74, /* invalid-tss */
188 VMEXIT_EXCEPTION_NP = 75, /* segment-not-present */
189 VMEXIT_EXCEPTION_SS = 76, /* stack */
190 VMEXIT_EXCEPTION_GP = 77, /* general-protection */
191 VMEXIT_EXCEPTION_PF = 78, /* page-fault */
192 VMEXIT_EXCEPTION_15 = 79, /* reserved */
193 VMEXIT_EXCEPTION_MF = 80, /* x87 floating-point exception-pending */
194 VMEXIT_EXCEPTION_AC = 81, /* alignment-check */
195 VMEXIT_EXCEPTION_MC = 82, /* machine-check */
196 VMEXIT_EXCEPTION_XF = 83, /* simd floating-point */
198 /* exceptions 20-31 (exitcodes 84-95) are reserved */
200 /* ...and the rest of the #VMEXITs */
206 VMEXIT_CR0_SEL_WRITE = 101,
207 VMEXIT_IDTR_READ = 102,
208 VMEXIT_GDTR_READ = 103,
209 VMEXIT_LDTR_READ = 104,
210 VMEXIT_TR_READ = 105,
211 VMEXIT_IDTR_WRITE = 106,
212 VMEXIT_GDTR_WRITE = 107,
213 VMEXIT_LDTR_WRITE = 108,
214 VMEXIT_TR_WRITE = 109,
227 VMEXIT_INVLPGA = 122,
230 VMEXIT_TASK_SWITCH = 125,
231 VMEXIT_FERR_FREEZE = 126,
232 VMEXIT_SHUTDOWN = 127,
234 VMEXIT_VMMCALL = 129,
243 VMEXIT_MONITOR = 138,
245 VMEXIT_MWAIT_CONDITIONAL = 140,
247 VMEXIT_NPF = 1024, /* nested paging fault */
252 CLEAN_BITS_I = 1 << 0,
253 CLEAN_BITS_IOPM = 1 << 1,
254 CLEAN_BITS_ASID = 1 << 2,
255 CLEAN_BITS_TPR = 1 << 3,
256 CLEAN_BITS_NP = 1 << 4,
257 CLEAN_BITS_CRX = 1 << 5,
258 CLEAN_BITS_DRX = 1 << 6,
259 CLEAN_BITS_DT = 1 << 7,
260 CLEAN_BITS_SEG = 1 << 8,
261 CLEAN_BITS_CR2 = 1 << 9,
262 CLEAN_BITS_LBR = 1 << 10,
263 CLEAN_BITS_AVIC = 1 << 11
267 typedef u64 eventinj_t;
268 typedef u64 lbrctrl_t;
271 u32 cr_intercepts; /* offset 0x00 */
272 u32 dr_intercepts; /* offset 0x04 */
273 u32 exception_intercepts; /* offset 0x08 */
274 u32 general1_intercepts; /* offset 0x0C */
275 u32 general2_intercepts; /* offset 0x10 */
276 u32 res01; /* offset 0x14 */
277 u64 res02; /* offset 0x18 */
278 u64 res03; /* offset 0x20 */
279 u64 res04; /* offset 0x28 */
280 u64 res05; /* offset 0x30 */
281 u32 res06; /* offset 0x38 */
282 u16 res06a; /* offset 0x3C */
283 u16 pause_filter_count; /* offset 0x3E */
284 u64 iopm_base_pa; /* offset 0x40 */
285 u64 msrpm_base_pa; /* offset 0x48 */
286 u64 tsc_offset; /* offset 0x50 */
287 u32 guest_asid; /* offset 0x58 */
288 u8 tlb_control; /* offset 0x5C */
290 vintr_t vintr; /* offset 0x60 */
291 u64 interrupt_shadow; /* offset 0x68 */
292 u64 exitcode; /* offset 0x70 */
293 u64 exitinfo1; /* offset 0x78 */
294 u64 exitinfo2; /* offset 0x80 */
295 eventinj_t exitintinfo; /* offset 0x88 */
296 u64 np_enable; /* offset 0x90 */
298 eventinj_t eventinj; /* offset 0xA8 */
299 u64 n_cr3; /* offset 0xB0 */
300 lbrctrl_t lbr_control; /* offset 0xB8 */
301 u64 clean_bits; /* offset 0xC0 */
302 u64 nextrip; /* offset 0xC8 */
303 u8 bytes_fetched; /* offset 0xD0 */
305 u64 res10a[100]; /* offset 0xE0 pad to save area */
307 struct svm_segment es; /* offset 1024 */
308 struct svm_segment cs;
309 struct svm_segment ss;
310 struct svm_segment ds;
311 struct svm_segment fs;
312 struct svm_segment gs;
313 struct svm_segment gdtr;
314 struct svm_segment ldtr;
315 struct svm_segment idtr;
316 struct svm_segment tr;
322 u64 efer; /* offset 1024 + 0xD0 */
324 u64 cr4; /* loffset 1024 + 0x148 */
350 u64 lastbranchfromip;
355 } __attribute__((packed));