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