xref: /openbmc/linux/arch/x86/include/uapi/asm/kvm.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2af170c50SDavid Howells #ifndef _ASM_X86_KVM_H
3af170c50SDavid Howells #define _ASM_X86_KVM_H
4af170c50SDavid Howells 
5af170c50SDavid Howells /*
6af170c50SDavid Howells  * KVM x86 specific structures and definitions
7af170c50SDavid Howells  *
8af170c50SDavid Howells  */
9af170c50SDavid Howells 
10af170c50SDavid Howells #include <linux/types.h>
11af170c50SDavid Howells #include <linux/ioctl.h>
126213b701SKees Cook #include <linux/stddef.h>
13af170c50SDavid Howells 
144b4357e0SPaolo Bonzini #define KVM_PIO_PAGE_OFFSET 1
154b4357e0SPaolo Bonzini #define KVM_COALESCED_MMIO_PAGE_OFFSET 2
16fb04a1edSPeter Xu #define KVM_DIRTY_LOG_PAGE_OFFSET 64
174b4357e0SPaolo Bonzini 
18af170c50SDavid Howells #define DE_VECTOR 0
19af170c50SDavid Howells #define DB_VECTOR 1
20af170c50SDavid Howells #define BP_VECTOR 3
21af170c50SDavid Howells #define OF_VECTOR 4
22af170c50SDavid Howells #define BR_VECTOR 5
23af170c50SDavid Howells #define UD_VECTOR 6
24af170c50SDavid Howells #define NM_VECTOR 7
25af170c50SDavid Howells #define DF_VECTOR 8
26af170c50SDavid Howells #define TS_VECTOR 10
27af170c50SDavid Howells #define NP_VECTOR 11
28af170c50SDavid Howells #define SS_VECTOR 12
29af170c50SDavid Howells #define GP_VECTOR 13
30af170c50SDavid Howells #define PF_VECTOR 14
31af170c50SDavid Howells #define MF_VECTOR 16
32c9cdd085SNadav Amit #define AC_VECTOR 17
33af170c50SDavid Howells #define MC_VECTOR 18
34c9cdd085SNadav Amit #define XM_VECTOR 19
35c9cdd085SNadav Amit #define VE_VECTOR 20
36af170c50SDavid Howells 
37af170c50SDavid Howells /* Select x86 specific features in <linux/kvm.h> */
38af170c50SDavid Howells #define __KVM_HAVE_PIT
39af170c50SDavid Howells #define __KVM_HAVE_IOAPIC
40af170c50SDavid Howells #define __KVM_HAVE_IRQ_LINE
41af170c50SDavid Howells #define __KVM_HAVE_MSI
42af170c50SDavid Howells #define __KVM_HAVE_USER_NMI
43af170c50SDavid Howells #define __KVM_HAVE_GUEST_DEBUG
44af170c50SDavid Howells #define __KVM_HAVE_MSIX
45af170c50SDavid Howells #define __KVM_HAVE_MCE
46af170c50SDavid Howells #define __KVM_HAVE_PIT_STATE2
47af170c50SDavid Howells #define __KVM_HAVE_XEN_HVM
48af170c50SDavid Howells #define __KVM_HAVE_VCPU_EVENTS
49af170c50SDavid Howells #define __KVM_HAVE_DEBUGREGS
50af170c50SDavid Howells #define __KVM_HAVE_XSAVE
51af170c50SDavid Howells #define __KVM_HAVE_XCRS
52af170c50SDavid Howells #define __KVM_HAVE_READONLY_MEM
53af170c50SDavid Howells 
54af170c50SDavid Howells /* Architectural interrupt line count. */
55af170c50SDavid Howells #define KVM_NR_INTERRUPTS 256
56af170c50SDavid Howells 
57af170c50SDavid Howells /* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
58af170c50SDavid Howells struct kvm_pic_state {
59af170c50SDavid Howells 	__u8 last_irr;	/* edge detection */
60af170c50SDavid Howells 	__u8 irr;		/* interrupt request register */
61af170c50SDavid Howells 	__u8 imr;		/* interrupt mask register */
62af170c50SDavid Howells 	__u8 isr;		/* interrupt service register */
63af170c50SDavid Howells 	__u8 priority_add;	/* highest irq priority */
64af170c50SDavid Howells 	__u8 irq_base;
65af170c50SDavid Howells 	__u8 read_reg_select;
66af170c50SDavid Howells 	__u8 poll;
67af170c50SDavid Howells 	__u8 special_mask;
68af170c50SDavid Howells 	__u8 init_state;
69af170c50SDavid Howells 	__u8 auto_eoi;
70af170c50SDavid Howells 	__u8 rotate_on_auto_eoi;
71af170c50SDavid Howells 	__u8 special_fully_nested_mode;
72af170c50SDavid Howells 	__u8 init4;		/* true if 4 byte init */
73af170c50SDavid Howells 	__u8 elcr;		/* PIIX edge/trigger selection */
74af170c50SDavid Howells 	__u8 elcr_mask;
75af170c50SDavid Howells };
76af170c50SDavid Howells 
77af170c50SDavid Howells #define KVM_IOAPIC_NUM_PINS  24
78af170c50SDavid Howells struct kvm_ioapic_state {
79af170c50SDavid Howells 	__u64 base_address;
80af170c50SDavid Howells 	__u32 ioregsel;
81af170c50SDavid Howells 	__u32 id;
82af170c50SDavid Howells 	__u32 irr;
83af170c50SDavid Howells 	__u32 pad;
84af170c50SDavid Howells 	union {
85af170c50SDavid Howells 		__u64 bits;
86af170c50SDavid Howells 		struct {
87af170c50SDavid Howells 			__u8 vector;
88af170c50SDavid Howells 			__u8 delivery_mode:3;
89af170c50SDavid Howells 			__u8 dest_mode:1;
90af170c50SDavid Howells 			__u8 delivery_status:1;
91af170c50SDavid Howells 			__u8 polarity:1;
92af170c50SDavid Howells 			__u8 remote_irr:1;
93af170c50SDavid Howells 			__u8 trig_mode:1;
94af170c50SDavid Howells 			__u8 mask:1;
95af170c50SDavid Howells 			__u8 reserve:7;
96af170c50SDavid Howells 			__u8 reserved[4];
97af170c50SDavid Howells 			__u8 dest_id;
98af170c50SDavid Howells 		} fields;
99af170c50SDavid Howells 	} redirtbl[KVM_IOAPIC_NUM_PINS];
100af170c50SDavid Howells };
101af170c50SDavid Howells 
102af170c50SDavid Howells #define KVM_IRQCHIP_PIC_MASTER   0
103af170c50SDavid Howells #define KVM_IRQCHIP_PIC_SLAVE    1
104af170c50SDavid Howells #define KVM_IRQCHIP_IOAPIC       2
105af170c50SDavid Howells #define KVM_NR_IRQCHIPS          3
106af170c50SDavid Howells 
107f077825aSPaolo Bonzini #define KVM_RUN_X86_SMM		 (1 << 0)
108fe6b6bc8SChenyi Qiang #define KVM_RUN_X86_BUS_LOCK     (1 << 1)
109f077825aSPaolo Bonzini 
110af170c50SDavid Howells /* for KVM_GET_REGS and KVM_SET_REGS */
111af170c50SDavid Howells struct kvm_regs {
112af170c50SDavid Howells 	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
113af170c50SDavid Howells 	__u64 rax, rbx, rcx, rdx;
114af170c50SDavid Howells 	__u64 rsi, rdi, rsp, rbp;
115af170c50SDavid Howells 	__u64 r8,  r9,  r10, r11;
116af170c50SDavid Howells 	__u64 r12, r13, r14, r15;
117af170c50SDavid Howells 	__u64 rip, rflags;
118af170c50SDavid Howells };
119af170c50SDavid Howells 
120af170c50SDavid Howells /* for KVM_GET_LAPIC and KVM_SET_LAPIC */
121af170c50SDavid Howells #define KVM_APIC_REG_SIZE 0x400
122af170c50SDavid Howells struct kvm_lapic_state {
123af170c50SDavid Howells 	char regs[KVM_APIC_REG_SIZE];
124af170c50SDavid Howells };
125af170c50SDavid Howells 
126af170c50SDavid Howells struct kvm_segment {
127af170c50SDavid Howells 	__u64 base;
128af170c50SDavid Howells 	__u32 limit;
129af170c50SDavid Howells 	__u16 selector;
130af170c50SDavid Howells 	__u8  type;
131af170c50SDavid Howells 	__u8  present, dpl, db, s, l, g, avl;
132af170c50SDavid Howells 	__u8  unusable;
133af170c50SDavid Howells 	__u8  padding;
134af170c50SDavid Howells };
135af170c50SDavid Howells 
136af170c50SDavid Howells struct kvm_dtable {
137af170c50SDavid Howells 	__u64 base;
138af170c50SDavid Howells 	__u16 limit;
139af170c50SDavid Howells 	__u16 padding[3];
140af170c50SDavid Howells };
141af170c50SDavid Howells 
142af170c50SDavid Howells 
143af170c50SDavid Howells /* for KVM_GET_SREGS and KVM_SET_SREGS */
144af170c50SDavid Howells struct kvm_sregs {
145af170c50SDavid Howells 	/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
146af170c50SDavid Howells 	struct kvm_segment cs, ds, es, fs, gs, ss;
147af170c50SDavid Howells 	struct kvm_segment tr, ldt;
148af170c50SDavid Howells 	struct kvm_dtable gdt, idt;
149af170c50SDavid Howells 	__u64 cr0, cr2, cr3, cr4, cr8;
150af170c50SDavid Howells 	__u64 efer;
151af170c50SDavid Howells 	__u64 apic_base;
152af170c50SDavid Howells 	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
153af170c50SDavid Howells };
154af170c50SDavid Howells 
1556dba9403SMaxim Levitsky struct kvm_sregs2 {
1566dba9403SMaxim Levitsky 	/* out (KVM_GET_SREGS2) / in (KVM_SET_SREGS2) */
1576dba9403SMaxim Levitsky 	struct kvm_segment cs, ds, es, fs, gs, ss;
1586dba9403SMaxim Levitsky 	struct kvm_segment tr, ldt;
1596dba9403SMaxim Levitsky 	struct kvm_dtable gdt, idt;
1606dba9403SMaxim Levitsky 	__u64 cr0, cr2, cr3, cr4, cr8;
1616dba9403SMaxim Levitsky 	__u64 efer;
1626dba9403SMaxim Levitsky 	__u64 apic_base;
1636dba9403SMaxim Levitsky 	__u64 flags;
1646dba9403SMaxim Levitsky 	__u64 pdptrs[4];
1656dba9403SMaxim Levitsky };
1666dba9403SMaxim Levitsky #define KVM_SREGS2_FLAGS_PDPTRS_VALID 1
1676dba9403SMaxim Levitsky 
168af170c50SDavid Howells /* for KVM_GET_FPU and KVM_SET_FPU */
169af170c50SDavid Howells struct kvm_fpu {
170af170c50SDavid Howells 	__u8  fpr[8][16];
171af170c50SDavid Howells 	__u16 fcw;
172af170c50SDavid Howells 	__u16 fsw;
173af170c50SDavid Howells 	__u8  ftwx;  /* in fxsave format */
174af170c50SDavid Howells 	__u8  pad1;
175af170c50SDavid Howells 	__u16 last_opcode;
176af170c50SDavid Howells 	__u64 last_ip;
177af170c50SDavid Howells 	__u64 last_dp;
178af170c50SDavid Howells 	__u8  xmm[16][16];
179af170c50SDavid Howells 	__u32 mxcsr;
180af170c50SDavid Howells 	__u32 pad2;
181af170c50SDavid Howells };
182af170c50SDavid Howells 
183af170c50SDavid Howells struct kvm_msr_entry {
184af170c50SDavid Howells 	__u32 index;
185af170c50SDavid Howells 	__u32 reserved;
186af170c50SDavid Howells 	__u64 data;
187af170c50SDavid Howells };
188af170c50SDavid Howells 
189af170c50SDavid Howells /* for KVM_GET_MSRS and KVM_SET_MSRS */
190af170c50SDavid Howells struct kvm_msrs {
191af170c50SDavid Howells 	__u32 nmsrs; /* number of msrs in entries */
192af170c50SDavid Howells 	__u32 pad;
193af170c50SDavid Howells 
19494dfc73eSGustavo A. R. Silva 	struct kvm_msr_entry entries[];
195af170c50SDavid Howells };
196af170c50SDavid Howells 
197af170c50SDavid Howells /* for KVM_GET_MSR_INDEX_LIST */
198af170c50SDavid Howells struct kvm_msr_list {
199af170c50SDavid Howells 	__u32 nmsrs; /* number of msrs in entries */
20094dfc73eSGustavo A. R. Silva 	__u32 indices[];
201af170c50SDavid Howells };
202af170c50SDavid Howells 
2031a155254SAlexander Graf /* Maximum size of any access bitmap in bytes */
2041a155254SAlexander Graf #define KVM_MSR_FILTER_MAX_BITMAP_SIZE 0x600
2051a155254SAlexander Graf 
2061a155254SAlexander Graf /* for KVM_X86_SET_MSR_FILTER */
2071a155254SAlexander Graf struct kvm_msr_filter_range {
20851de8151SAlexander Graf #define KVM_MSR_FILTER_READ  (1 << 0)
20951de8151SAlexander Graf #define KVM_MSR_FILTER_WRITE (1 << 1)
2108aff460fSAaron Lewis #define KVM_MSR_FILTER_RANGE_VALID_MASK (KVM_MSR_FILTER_READ | \
2118aff460fSAaron Lewis 					 KVM_MSR_FILTER_WRITE)
2121a155254SAlexander Graf 	__u32 flags;
2131a155254SAlexander Graf 	__u32 nmsrs; /* number of msrs in bitmap */
2141a155254SAlexander Graf 	__u32 base;  /* MSR index the bitmap starts at */
2151a155254SAlexander Graf 	__u8 *bitmap; /* a 1 bit allows the operations in flags, 0 denies */
2161a155254SAlexander Graf };
2171a155254SAlexander Graf 
2181a155254SAlexander Graf #define KVM_MSR_FILTER_MAX_RANGES 16
2191a155254SAlexander Graf struct kvm_msr_filter {
220be837942SAaron Lewis #ifndef __KERNEL__
2211a155254SAlexander Graf #define KVM_MSR_FILTER_DEFAULT_ALLOW (0 << 0)
222be837942SAaron Lewis #endif
2231a155254SAlexander Graf #define KVM_MSR_FILTER_DEFAULT_DENY  (1 << 0)
224c1340fe3SAaron Lewis #define KVM_MSR_FILTER_VALID_MASK (KVM_MSR_FILTER_DEFAULT_DENY)
2251a155254SAlexander Graf 	__u32 flags;
2261a155254SAlexander Graf 	struct kvm_msr_filter_range ranges[KVM_MSR_FILTER_MAX_RANGES];
2271a155254SAlexander Graf };
228af170c50SDavid Howells 
229af170c50SDavid Howells struct kvm_cpuid_entry {
230af170c50SDavid Howells 	__u32 function;
231af170c50SDavid Howells 	__u32 eax;
232af170c50SDavid Howells 	__u32 ebx;
233af170c50SDavid Howells 	__u32 ecx;
234af170c50SDavid Howells 	__u32 edx;
235af170c50SDavid Howells 	__u32 padding;
236af170c50SDavid Howells };
237af170c50SDavid Howells 
238af170c50SDavid Howells /* for KVM_SET_CPUID */
239af170c50SDavid Howells struct kvm_cpuid {
240af170c50SDavid Howells 	__u32 nent;
241af170c50SDavid Howells 	__u32 padding;
24294dfc73eSGustavo A. R. Silva 	struct kvm_cpuid_entry entries[];
243af170c50SDavid Howells };
244af170c50SDavid Howells 
245af170c50SDavid Howells struct kvm_cpuid_entry2 {
246af170c50SDavid Howells 	__u32 function;
247af170c50SDavid Howells 	__u32 index;
248af170c50SDavid Howells 	__u32 flags;
249af170c50SDavid Howells 	__u32 eax;
250af170c50SDavid Howells 	__u32 ebx;
251af170c50SDavid Howells 	__u32 ecx;
252af170c50SDavid Howells 	__u32 edx;
253af170c50SDavid Howells 	__u32 padding[3];
254af170c50SDavid Howells };
255af170c50SDavid Howells 
2563dbe3458SBorislav Petkov #define KVM_CPUID_FLAG_SIGNIFCANT_INDEX		(1 << 0)
2573dbe3458SBorislav Petkov #define KVM_CPUID_FLAG_STATEFUL_FUNC		(1 << 1)
2583dbe3458SBorislav Petkov #define KVM_CPUID_FLAG_STATE_READ_NEXT		(1 << 2)
259af170c50SDavid Howells 
260af170c50SDavid Howells /* for KVM_SET_CPUID2 */
261af170c50SDavid Howells struct kvm_cpuid2 {
262af170c50SDavid Howells 	__u32 nent;
263af170c50SDavid Howells 	__u32 padding;
26494dfc73eSGustavo A. R. Silva 	struct kvm_cpuid_entry2 entries[];
265af170c50SDavid Howells };
266af170c50SDavid Howells 
267af170c50SDavid Howells /* for KVM_GET_PIT and KVM_SET_PIT */
268af170c50SDavid Howells struct kvm_pit_channel_state {
269af170c50SDavid Howells 	__u32 count; /* can be 65536 */
270af170c50SDavid Howells 	__u16 latched_count;
271af170c50SDavid Howells 	__u8 count_latched;
272af170c50SDavid Howells 	__u8 status_latched;
273af170c50SDavid Howells 	__u8 status;
274af170c50SDavid Howells 	__u8 read_state;
275af170c50SDavid Howells 	__u8 write_state;
276af170c50SDavid Howells 	__u8 write_latch;
277af170c50SDavid Howells 	__u8 rw_mode;
278af170c50SDavid Howells 	__u8 mode;
279af170c50SDavid Howells 	__u8 bcd;
280af170c50SDavid Howells 	__u8 gate;
281af170c50SDavid Howells 	__s64 count_load_time;
282af170c50SDavid Howells };
283af170c50SDavid Howells 
284af170c50SDavid Howells struct kvm_debug_exit_arch {
285af170c50SDavid Howells 	__u32 exception;
286af170c50SDavid Howells 	__u32 pad;
287af170c50SDavid Howells 	__u64 pc;
288af170c50SDavid Howells 	__u64 dr6;
289af170c50SDavid Howells 	__u64 dr7;
290af170c50SDavid Howells };
291af170c50SDavid Howells 
292af170c50SDavid Howells #define KVM_GUESTDBG_USE_SW_BP		0x00010000
293af170c50SDavid Howells #define KVM_GUESTDBG_USE_HW_BP		0x00020000
294af170c50SDavid Howells #define KVM_GUESTDBG_INJECT_DB		0x00040000
295af170c50SDavid Howells #define KVM_GUESTDBG_INJECT_BP		0x00080000
29661e5f69eSMaxim Levitsky #define KVM_GUESTDBG_BLOCKIRQ		0x00100000
297af170c50SDavid Howells 
298af170c50SDavid Howells /* for KVM_SET_GUEST_DEBUG */
299af170c50SDavid Howells struct kvm_guest_debug_arch {
300af170c50SDavid Howells 	__u64 debugreg[8];
301af170c50SDavid Howells };
302af170c50SDavid Howells 
303af170c50SDavid Howells struct kvm_pit_state {
304af170c50SDavid Howells 	struct kvm_pit_channel_state channels[3];
305af170c50SDavid Howells };
306af170c50SDavid Howells 
307af170c50SDavid Howells #define KVM_PIT_FLAGS_HPET_LEGACY     0x00000001
308b1728622SPaul Durrant #define KVM_PIT_FLAGS_SPEAKER_DATA_ON 0x00000002
309af170c50SDavid Howells 
310af170c50SDavid Howells struct kvm_pit_state2 {
311af170c50SDavid Howells 	struct kvm_pit_channel_state channels[3];
312af170c50SDavid Howells 	__u32 flags;
313af170c50SDavid Howells 	__u32 reserved[9];
314af170c50SDavid Howells };
315af170c50SDavid Howells 
316af170c50SDavid Howells struct kvm_reinject_control {
317af170c50SDavid Howells 	__u8 pit_reinject;
318af170c50SDavid Howells 	__u8 reserved[31];
319af170c50SDavid Howells };
320af170c50SDavid Howells 
321af170c50SDavid Howells /* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */
322af170c50SDavid Howells #define KVM_VCPUEVENT_VALID_NMI_PENDING	0x00000001
323af170c50SDavid Howells #define KVM_VCPUEVENT_VALID_SIPI_VECTOR	0x00000002
324af170c50SDavid Howells #define KVM_VCPUEVENT_VALID_SHADOW	0x00000004
325f077825aSPaolo Bonzini #define KVM_VCPUEVENT_VALID_SMM		0x00000008
32659073aafSJim Mattson #define KVM_VCPUEVENT_VALID_PAYLOAD	0x00000010
327ed235117SChenyi Qiang #define KVM_VCPUEVENT_VALID_TRIPLE_FAULT	0x00000020
328af170c50SDavid Howells 
329af170c50SDavid Howells /* Interrupt shadow states */
330af170c50SDavid Howells #define KVM_X86_SHADOW_INT_MOV_SS	0x01
331af170c50SDavid Howells #define KVM_X86_SHADOW_INT_STI		0x02
332af170c50SDavid Howells 
333af170c50SDavid Howells /* for KVM_GET/SET_VCPU_EVENTS */
334af170c50SDavid Howells struct kvm_vcpu_events {
335af170c50SDavid Howells 	struct {
336af170c50SDavid Howells 		__u8 injected;
337af170c50SDavid Howells 		__u8 nr;
338af170c50SDavid Howells 		__u8 has_error_code;
33959073aafSJim Mattson 		__u8 pending;
340af170c50SDavid Howells 		__u32 error_code;
341af170c50SDavid Howells 	} exception;
342af170c50SDavid Howells 	struct {
343af170c50SDavid Howells 		__u8 injected;
344af170c50SDavid Howells 		__u8 nr;
345af170c50SDavid Howells 		__u8 soft;
346af170c50SDavid Howells 		__u8 shadow;
347af170c50SDavid Howells 	} interrupt;
348af170c50SDavid Howells 	struct {
349af170c50SDavid Howells 		__u8 injected;
350af170c50SDavid Howells 		__u8 pending;
351af170c50SDavid Howells 		__u8 masked;
352af170c50SDavid Howells 		__u8 pad;
353af170c50SDavid Howells 	} nmi;
354af170c50SDavid Howells 	__u32 sipi_vector;
355af170c50SDavid Howells 	__u32 flags;
356f077825aSPaolo Bonzini 	struct {
357f077825aSPaolo Bonzini 		__u8 smm;
358f077825aSPaolo Bonzini 		__u8 pending;
359f077825aSPaolo Bonzini 		__u8 smm_inside_nmi;
360f077825aSPaolo Bonzini 		__u8 latched_init;
361f077825aSPaolo Bonzini 	} smi;
362ed235117SChenyi Qiang 	struct {
363ed235117SChenyi Qiang 		__u8 pending;
364ed235117SChenyi Qiang 	} triple_fault;
365ed235117SChenyi Qiang 	__u8 reserved[26];
36659073aafSJim Mattson 	__u8 exception_has_payload;
36759073aafSJim Mattson 	__u64 exception_payload;
368af170c50SDavid Howells };
369af170c50SDavid Howells 
370af170c50SDavid Howells /* for KVM_GET/SET_DEBUGREGS */
371af170c50SDavid Howells struct kvm_debugregs {
372af170c50SDavid Howells 	__u64 db[4];
373af170c50SDavid Howells 	__u64 dr6;
374af170c50SDavid Howells 	__u64 dr7;
375af170c50SDavid Howells 	__u64 flags;
376af170c50SDavid Howells 	__u64 reserved[9];
377af170c50SDavid Howells };
378af170c50SDavid Howells 
379be50b206SGuang Zeng /* for KVM_CAP_XSAVE and KVM_CAP_XSAVE2 */
380af170c50SDavid Howells struct kvm_xsave {
381be50b206SGuang Zeng 	/*
382be50b206SGuang Zeng 	 * KVM_GET_XSAVE2 and KVM_SET_XSAVE write and read as many bytes
383be50b206SGuang Zeng 	 * as are returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)
384be50b206SGuang Zeng 	 * respectively, when invoked on the vm file descriptor.
385be50b206SGuang Zeng 	 *
386be50b206SGuang Zeng 	 * The size value returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)
387be50b206SGuang Zeng 	 * will always be at least 4096. Currently, it is only greater
388be50b206SGuang Zeng 	 * than 4096 if a dynamic feature has been enabled with
389be50b206SGuang Zeng 	 * ``arch_prctl()``, but this may change in the future.
390be50b206SGuang Zeng 	 *
391be50b206SGuang Zeng 	 * The offsets of the state save areas in struct kvm_xsave follow
392be50b206SGuang Zeng 	 * the contents of CPUID leaf 0xD on the host.
393be50b206SGuang Zeng 	 */
394af170c50SDavid Howells 	__u32 region[1024];
39594dfc73eSGustavo A. R. Silva 	__u32 extra[];
396af170c50SDavid Howells };
397af170c50SDavid Howells 
398af170c50SDavid Howells #define KVM_MAX_XCRS	16
399af170c50SDavid Howells 
400af170c50SDavid Howells struct kvm_xcr {
401af170c50SDavid Howells 	__u32 xcr;
402af170c50SDavid Howells 	__u32 reserved;
403af170c50SDavid Howells 	__u64 value;
404af170c50SDavid Howells };
405af170c50SDavid Howells 
406af170c50SDavid Howells struct kvm_xcrs {
407af170c50SDavid Howells 	__u32 nr_xcrs;
408af170c50SDavid Howells 	__u32 flags;
409af170c50SDavid Howells 	struct kvm_xcr xcrs[KVM_MAX_XCRS];
410af170c50SDavid Howells 	__u64 padding[16];
411af170c50SDavid Howells };
412af170c50SDavid Howells 
41301643c51SKen Hofsass #define KVM_SYNC_X86_REGS      (1UL << 0)
41401643c51SKen Hofsass #define KVM_SYNC_X86_SREGS     (1UL << 1)
41501643c51SKen Hofsass #define KVM_SYNC_X86_EVENTS    (1UL << 2)
41601643c51SKen Hofsass 
41701643c51SKen Hofsass #define KVM_SYNC_X86_VALID_FIELDS \
41801643c51SKen Hofsass 	(KVM_SYNC_X86_REGS| \
41901643c51SKen Hofsass 	 KVM_SYNC_X86_SREGS| \
42001643c51SKen Hofsass 	 KVM_SYNC_X86_EVENTS)
42101643c51SKen Hofsass 
42201643c51SKen Hofsass /* kvm_sync_regs struct included by kvm_run struct */
423af170c50SDavid Howells struct kvm_sync_regs {
42401643c51SKen Hofsass 	/* Members of this structure are potentially malicious.
42501643c51SKen Hofsass 	 * Care must be taken by code reading, esp. interpreting,
42601643c51SKen Hofsass 	 * data fields from them inside KVM to prevent TOCTOU and
42701643c51SKen Hofsass 	 * double-fetch types of vulnerabilities.
42801643c51SKen Hofsass 	 */
42901643c51SKen Hofsass 	struct kvm_regs regs;
43001643c51SKen Hofsass 	struct kvm_sregs sregs;
43101643c51SKen Hofsass 	struct kvm_vcpu_events events;
432af170c50SDavid Howells };
433af170c50SDavid Howells 
4340da029edSPaolo Bonzini #define KVM_X86_QUIRK_LINT0_REENABLED		(1 << 0)
4350da029edSPaolo Bonzini #define KVM_X86_QUIRK_CD_NW_CLEARED		(1 << 1)
436d1766202SVitaly Kuznetsov #define KVM_X86_QUIRK_LAPIC_MMIO_HOLE		(1 << 2)
4378764ed55SSean Christopherson #define KVM_X86_QUIRK_OUT_7E_INC_RIP		(1 << 3)
438511a8556SWanpeng Li #define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT	(1 << 4)
439f1a9761fSOliver Upton #define KVM_X86_QUIRK_FIX_HYPERCALL_INSN	(1 << 5)
44043bb9e00SSean Christopherson #define KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS	(1 << 6)
44190de4a18SNadav Amit 
4426ca00dfaSLiran Alon #define KVM_STATE_NESTED_FORMAT_VMX	0
443cc440cdaSPaolo Bonzini #define KVM_STATE_NESTED_FORMAT_SVM	1
4446ca00dfaSLiran Alon 
4458fcc4b59SJim Mattson #define KVM_STATE_NESTED_GUEST_MODE	0x00000001
4468fcc4b59SJim Mattson #define KVM_STATE_NESTED_RUN_PENDING	0x00000002
4478cab6507SVitaly Kuznetsov #define KVM_STATE_NESTED_EVMCS		0x00000004
4485ef8acbdSOliver Upton #define KVM_STATE_NESTED_MTF_PENDING	0x00000008
449cc440cdaSPaolo Bonzini #define KVM_STATE_NESTED_GIF_SET	0x00000100
4508fcc4b59SJim Mattson 
4518fcc4b59SJim Mattson #define KVM_STATE_NESTED_SMM_GUEST_MODE	0x00000001
4528fcc4b59SJim Mattson #define KVM_STATE_NESTED_SMM_VMXON	0x00000002
4538fcc4b59SJim Mattson 
4546ca00dfaSLiran Alon #define KVM_STATE_NESTED_VMX_VMCS_SIZE	0x1000
4556ca00dfaSLiran Alon 
456cc440cdaSPaolo Bonzini #define KVM_STATE_NESTED_SVM_VMCB_SIZE	0x1000
457cc440cdaSPaolo Bonzini 
458850448f3SPeter Shier #define KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE	0x00000001
459cc440cdaSPaolo Bonzini 
460dd6e6312SPaolo Bonzini /* attributes for system fd (group 0) */
461dd6e6312SPaolo Bonzini #define KVM_X86_XCOMP_GUEST_SUPP	0
462dd6e6312SPaolo Bonzini 
4636ca00dfaSLiran Alon struct kvm_vmx_nested_state_data {
4646ca00dfaSLiran Alon 	__u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
4656ca00dfaSLiran Alon 	__u8 shadow_vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
4666ca00dfaSLiran Alon };
4676ca00dfaSLiran Alon 
4686ca00dfaSLiran Alon struct kvm_vmx_nested_state_hdr {
4698fcc4b59SJim Mattson 	__u64 vmxon_pa;
4706ca00dfaSLiran Alon 	__u64 vmcs12_pa;
4718fcc4b59SJim Mattson 
4728fcc4b59SJim Mattson 	struct {
4738fcc4b59SJim Mattson 		__u16 flags;
4748fcc4b59SJim Mattson 	} smm;
47583d31e52SPaolo Bonzini 
47670f094f4SVitaly Kuznetsov 	__u16 pad;
47770f094f4SVitaly Kuznetsov 
47883d31e52SPaolo Bonzini 	__u32 flags;
47983d31e52SPaolo Bonzini 	__u64 preemption_timer_deadline;
4808fcc4b59SJim Mattson };
4818fcc4b59SJim Mattson 
482cc440cdaSPaolo Bonzini struct kvm_svm_nested_state_data {
483cc440cdaSPaolo Bonzini 	/* Save area only used if KVM_STATE_NESTED_RUN_PENDING.  */
484cc440cdaSPaolo Bonzini 	__u8 vmcb12[KVM_STATE_NESTED_SVM_VMCB_SIZE];
485cc440cdaSPaolo Bonzini };
486cc440cdaSPaolo Bonzini 
487cc440cdaSPaolo Bonzini struct kvm_svm_nested_state_hdr {
488cc440cdaSPaolo Bonzini 	__u64 vmcb_pa;
489cc440cdaSPaolo Bonzini };
490cc440cdaSPaolo Bonzini 
4918fcc4b59SJim Mattson /* for KVM_CAP_NESTED_STATE */
4928fcc4b59SJim Mattson struct kvm_nested_state {
4938fcc4b59SJim Mattson 	__u16 flags;
4948fcc4b59SJim Mattson 	__u16 format;
4958fcc4b59SJim Mattson 	__u32 size;
4968fcc4b59SJim Mattson 
4978fcc4b59SJim Mattson 	union {
4986ca00dfaSLiran Alon 		struct kvm_vmx_nested_state_hdr vmx;
499cc440cdaSPaolo Bonzini 		struct kvm_svm_nested_state_hdr svm;
5008fcc4b59SJim Mattson 
5018fcc4b59SJim Mattson 		/* Pad the header to 128 bytes.  */
5028fcc4b59SJim Mattson 		__u8 pad[120];
5036ca00dfaSLiran Alon 	} hdr;
5048fcc4b59SJim Mattson 
5056ca00dfaSLiran Alon 	/*
5066ca00dfaSLiran Alon 	 * Define data region as 0 bytes to preserve backwards-compatability
5076ca00dfaSLiran Alon 	 * to old definition of kvm_nested_state in order to avoid changing
5086ca00dfaSLiran Alon 	 * KVM_{GET,PUT}_NESTED_STATE ioctl values.
5096ca00dfaSLiran Alon 	 */
5106ca00dfaSLiran Alon 	union {
5116213b701SKees Cook 		__DECLARE_FLEX_ARRAY(struct kvm_vmx_nested_state_data, vmx);
5126213b701SKees Cook 		__DECLARE_FLEX_ARRAY(struct kvm_svm_nested_state_data, svm);
5136ca00dfaSLiran Alon 	} data;
5148fcc4b59SJim Mattson };
5158fcc4b59SJim Mattson 
51666bb8a06SEric Hankland /* for KVM_CAP_PMU_EVENT_FILTER */
51766bb8a06SEric Hankland struct kvm_pmu_event_filter {
51866bb8a06SEric Hankland 	__u32 action;
51966bb8a06SEric Hankland 	__u32 nevents;
52030cd8604SEric Hankland 	__u32 fixed_counter_bitmap;
52130cd8604SEric Hankland 	__u32 flags;
52230cd8604SEric Hankland 	__u32 pad[4];
52394dfc73eSGustavo A. R. Silva 	__u64 events[];
52466bb8a06SEric Hankland };
52566bb8a06SEric Hankland 
52666bb8a06SEric Hankland #define KVM_PMU_EVENT_ALLOW 0
52766bb8a06SEric Hankland #define KVM_PMU_EVENT_DENY 1
52866bb8a06SEric Hankland 
52914329b82SAaron Lewis #define KVM_PMU_EVENT_FLAG_MASKED_EVENTS BIT(0)
53014329b82SAaron Lewis #define KVM_PMU_EVENT_FLAGS_VALID_MASK (KVM_PMU_EVENT_FLAG_MASKED_EVENTS)
53114329b82SAaron Lewis 
53214329b82SAaron Lewis /*
53314329b82SAaron Lewis  * Masked event layout.
53414329b82SAaron Lewis  * Bits   Description
53514329b82SAaron Lewis  * ----   -----------
53614329b82SAaron Lewis  * 7:0    event select (low bits)
53714329b82SAaron Lewis  * 15:8   umask match
53814329b82SAaron Lewis  * 31:16  unused
53914329b82SAaron Lewis  * 35:32  event select (high bits)
54014329b82SAaron Lewis  * 36:54  unused
54114329b82SAaron Lewis  * 55     exclude bit
54214329b82SAaron Lewis  * 63:56  umask mask
54314329b82SAaron Lewis  */
54414329b82SAaron Lewis 
54514329b82SAaron Lewis #define KVM_PMU_ENCODE_MASKED_ENTRY(event_select, mask, match, exclude) \
54614329b82SAaron Lewis 	(((event_select) & 0xFFULL) | (((event_select) & 0XF00ULL) << 24) | \
54714329b82SAaron Lewis 	(((mask) & 0xFFULL) << 56) | \
54814329b82SAaron Lewis 	(((match) & 0xFFULL) << 8) | \
54914329b82SAaron Lewis 	((__u64)(!!(exclude)) << 55))
55014329b82SAaron Lewis 
55114329b82SAaron Lewis #define KVM_PMU_MASKED_ENTRY_EVENT_SELECT \
55214329b82SAaron Lewis 	(GENMASK_ULL(7, 0) | GENMASK_ULL(35, 32))
55314329b82SAaron Lewis #define KVM_PMU_MASKED_ENTRY_UMASK_MASK		(GENMASK_ULL(63, 56))
55414329b82SAaron Lewis #define KVM_PMU_MASKED_ENTRY_UMASK_MATCH	(GENMASK_ULL(15, 8))
55514329b82SAaron Lewis #define KVM_PMU_MASKED_ENTRY_EXCLUDE		(BIT_ULL(55))
55614329b82SAaron Lewis #define KVM_PMU_MASKED_ENTRY_UMASK_MASK_SHIFT	(56)
55714329b82SAaron Lewis 
558828ca896SOliver Upton /* for KVM_{GET,SET,HAS}_DEVICE_ATTR */
559828ca896SOliver Upton #define KVM_VCPU_TSC_CTRL 0 /* control group for the timestamp counter (TSC) */
560828ca896SOliver Upton #define   KVM_VCPU_TSC_OFFSET 0 /* attribute for the TSC offset */
561828ca896SOliver Upton 
562*e65733b5SOliver Upton /* x86-specific KVM_EXIT_HYPERCALL flags. */
563*e65733b5SOliver Upton #define KVM_EXIT_HYPERCALL_LONG_MODE	BIT(0)
564*e65733b5SOliver Upton 
565af170c50SDavid Howells #endif /* _ASM_X86_KVM_H */
566