]> rtime.felk.cvut.cz Git - jailhouse.git/blob - hypervisor/arch/x86/include/asm/svm.h
Merge remote-tracking branch 'kiszka/master'
[jailhouse.git] / hypervisor / arch / x86 / include / asm / svm.h
1 /*
2  * Jailhouse, a Linux-based partitioning hypervisor
3  *
4  * Copyright (c) 2005-2007, Advanced Micro Devices, Inc
5  * Copyright (c) 2004, Intel Corporation.
6  * Copyright (c) Valentine Sinitsyn, 2014
7  *
8  * Authors:
9  *  Valentine Sinitsyn <valentine.sinitsyn@gmail.com>
10  *
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).
14  *
15  * Copyright (c) 2005-2007, Advanced Micro Devices, Inc
16  * Copyright (c) 2004, Intel Corporation.
17  *
18  * This work is licensed under the terms of the GNU GPL, version 2.  See
19  * the COPYING file in the top-level directory.
20  */
21
22 #ifndef _JAILHOUSE_ASM_SVM_H
23 #define _JAILHOUSE_ASM_SVM_H
24
25 #include <jailhouse/types.h>
26
27 #define EFER_SVME               (1UL << 12)
28 #define VM_CR_SVMDIS            (1UL << 4)
29
30 #define MSR_VM_CR               0xc0010114
31 #define MSR_VM_HSAVE_PA         0xc0010117
32
33 #define SVM_MSRPM_0000          0
34 #define SVM_MSRPM_C000          1
35 #define SVM_MSRPM_C001          2
36 #define SVM_MSRPM_RESV          3
37
38 #define SVM_TLB_FLUSH_ALL       0x01
39 #define SVM_TLB_FLUSH_GUEST     0x03
40
41 #define SVM_EVENTINJ_EXCEPTION  (3UL << 8)
42 #define SVM_EVENTINJ_ERR_VALID  (1UL << 11)
43 #define SVM_EVENTINJ_VALID      (1UL << 31)
44
45 struct svm_segment {
46         u16 selector;
47         u16 access_rights;
48         u32 limit;
49         u64 base;
50 } __attribute__((packed));
51
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
86 };
87
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
103 };
104
105 enum vm_exit_code {
106         /* control register read exitcodes */
107         VMEXIT_CR0_READ    =   0,
108         VMEXIT_CR1_READ    =   1,
109         VMEXIT_CR2_READ    =   2,
110         VMEXIT_CR3_READ    =   3,
111         VMEXIT_CR4_READ    =   4,
112         VMEXIT_CR5_READ    =   5,
113         VMEXIT_CR6_READ    =   6,
114         VMEXIT_CR7_READ    =   7,
115         VMEXIT_CR8_READ    =   8,
116         VMEXIT_CR9_READ    =   9,
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,
123
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,
141
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,
159
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,
177
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 */
199
200         /* exceptions 20-31 (exitcodes 84-95) are reserved */
201
202         /* ...and the rest of the #VMEXITs */
203         VMEXIT_INTR                     =  96,
204         VMEXIT_NMI                      =  97,
205         VMEXIT_SMI                      =  98,
206         VMEXIT_INIT                     =  99,
207         VMEXIT_VINTR                    = 100,
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,
217         VMEXIT_RDTSC                    = 110,
218         VMEXIT_RDPMC                    = 111,
219         VMEXIT_PUSHF                    = 112,
220         VMEXIT_POPF                     = 113,
221         VMEXIT_CPUID                    = 114,
222         VMEXIT_RSM                      = 115,
223         VMEXIT_IRET                     = 116,
224         VMEXIT_SWINT                    = 117,
225         VMEXIT_INVD                     = 118,
226         VMEXIT_PAUSE                    = 119,
227         VMEXIT_HLT                      = 120,
228         VMEXIT_INVLPG                   = 121,
229         VMEXIT_INVLPGA                  = 122,
230         VMEXIT_IOIO                     = 123,
231         VMEXIT_MSR                      = 124,
232         VMEXIT_TASK_SWITCH              = 125,
233         VMEXIT_FERR_FREEZE              = 126,
234         VMEXIT_SHUTDOWN                 = 127,
235         VMEXIT_VMRUN                    = 128,
236         VMEXIT_VMMCALL                  = 129,
237         VMEXIT_VMLOAD                   = 130,
238         VMEXIT_VMSAVE                   = 131,
239         VMEXIT_STGI                     = 132,
240         VMEXIT_CLGI                     = 133,
241         VMEXIT_SKINIT                   = 134,
242         VMEXIT_RDTSCP                   = 135,
243         VMEXIT_ICEBP                    = 136,
244         VMEXIT_WBINVD                   = 137,
245         VMEXIT_MONITOR                  = 138,
246         VMEXIT_MWAIT                    = 139,
247         VMEXIT_MWAIT_CONDITIONAL        = 140,
248         VMEXIT_XSETBV                   = 141,
249         VMEXIT_NPF                      = 1024, /* nested paging fault */
250         VMEXIT_INVALID                  =  -1
251 };
252
253 enum clean_bits {
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
266 };
267
268 typedef u64 vintr_t;
269 typedef u64 lbrctrl_t;
270
271 struct vmcb {
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 */
290         u8 res07[3];
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 */
298         u64 res08[2];
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 */
306         u8 guest_bytes[15];
307         u64 res10a[100];                /* offset 0xE0 pad to save area */
308
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;
319
320         u64 res10[5];
321         u8 res11[3];
322         u8 cpl;
323         u32 res12;
324         u64 efer;                       /* offset 1024 + 0xD0 */
325         u64 res13[14];
326         u64 cr4;                        /* loffset 1024 + 0x148 */
327         u64 cr3;
328         u64 cr0;
329         u64 dr7;
330         u64 dr6;
331         u64 rflags;
332         u64 rip;
333         u64 res14[11];
334         u64 rsp;
335         u64 res15[3];
336         u64 rax;
337         u64 star;
338         u64 lstar;
339         u64 cstar;
340         u64 sfmask;
341         u64 kerngsbase;
342         u64 sysenter_cs;
343         u64 sysenter_esp;
344         u64 sysenter_eip;
345         u64 cr2;
346         u64 pdpe0;
347         u64 pdpe1;
348         u64 pdpe2;
349         u64 pdpe3;
350         u64 g_pat;
351         u64 debugctlmsr;
352         u64 lastbranchfromip;
353         u64 lastbranchtoip;
354         u64 lastintfromip;
355         u64 lastinttoip;
356         u64 res16[301];
357 } __attribute__((packed));
358
359 #endif