xref: /kvmtool/x86/include/asm/kvm.h (revision 1bbe92f568513662589b1a159be01fd27f8bf27d)
1*1bbe92f5SDave Martin /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
260021220SAndre Przywara #ifndef _ASM_X86_KVM_H
360021220SAndre Przywara #define _ASM_X86_KVM_H
460021220SAndre Przywara 
560021220SAndre Przywara /*
660021220SAndre Przywara  * KVM x86 specific structures and definitions
760021220SAndre Przywara  *
860021220SAndre Przywara  */
960021220SAndre Przywara 
1060021220SAndre Przywara #include <linux/types.h>
1160021220SAndre Przywara #include <linux/ioctl.h>
1260021220SAndre Przywara 
13*1bbe92f5SDave Martin #define KVM_PIO_PAGE_OFFSET 1
14*1bbe92f5SDave Martin #define KVM_COALESCED_MMIO_PAGE_OFFSET 2
15*1bbe92f5SDave Martin 
1660021220SAndre Przywara #define DE_VECTOR 0
1760021220SAndre Przywara #define DB_VECTOR 1
1860021220SAndre Przywara #define BP_VECTOR 3
1960021220SAndre Przywara #define OF_VECTOR 4
2060021220SAndre Przywara #define BR_VECTOR 5
2160021220SAndre Przywara #define UD_VECTOR 6
2260021220SAndre Przywara #define NM_VECTOR 7
2360021220SAndre Przywara #define DF_VECTOR 8
2460021220SAndre Przywara #define TS_VECTOR 10
2560021220SAndre Przywara #define NP_VECTOR 11
2660021220SAndre Przywara #define SS_VECTOR 12
2760021220SAndre Przywara #define GP_VECTOR 13
2860021220SAndre Przywara #define PF_VECTOR 14
2960021220SAndre Przywara #define MF_VECTOR 16
3060021220SAndre Przywara #define AC_VECTOR 17
3160021220SAndre Przywara #define MC_VECTOR 18
3260021220SAndre Przywara #define XM_VECTOR 19
3360021220SAndre Przywara #define VE_VECTOR 20
3460021220SAndre Przywara 
3560021220SAndre Przywara /* Select x86 specific features in <linux/kvm.h> */
3660021220SAndre Przywara #define __KVM_HAVE_PIT
3760021220SAndre Przywara #define __KVM_HAVE_IOAPIC
3860021220SAndre Przywara #define __KVM_HAVE_IRQ_LINE
3960021220SAndre Przywara #define __KVM_HAVE_MSI
4060021220SAndre Przywara #define __KVM_HAVE_USER_NMI
4160021220SAndre Przywara #define __KVM_HAVE_GUEST_DEBUG
4260021220SAndre Przywara #define __KVM_HAVE_MSIX
4360021220SAndre Przywara #define __KVM_HAVE_MCE
4460021220SAndre Przywara #define __KVM_HAVE_PIT_STATE2
4560021220SAndre Przywara #define __KVM_HAVE_XEN_HVM
4660021220SAndre Przywara #define __KVM_HAVE_VCPU_EVENTS
4760021220SAndre Przywara #define __KVM_HAVE_DEBUGREGS
4860021220SAndre Przywara #define __KVM_HAVE_XSAVE
4960021220SAndre Przywara #define __KVM_HAVE_XCRS
5060021220SAndre Przywara #define __KVM_HAVE_READONLY_MEM
5160021220SAndre Przywara 
5260021220SAndre Przywara /* Architectural interrupt line count. */
5360021220SAndre Przywara #define KVM_NR_INTERRUPTS 256
5460021220SAndre Przywara 
5560021220SAndre Przywara struct kvm_memory_alias {
5660021220SAndre Przywara 	__u32 slot;  /* this has a different namespace than memory slots */
5760021220SAndre Przywara 	__u32 flags;
5860021220SAndre Przywara 	__u64 guest_phys_addr;
5960021220SAndre Przywara 	__u64 memory_size;
6060021220SAndre Przywara 	__u64 target_phys_addr;
6160021220SAndre Przywara };
6260021220SAndre Przywara 
6360021220SAndre Przywara /* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
6460021220SAndre Przywara struct kvm_pic_state {
6560021220SAndre Przywara 	__u8 last_irr;	/* edge detection */
6660021220SAndre Przywara 	__u8 irr;		/* interrupt request register */
6760021220SAndre Przywara 	__u8 imr;		/* interrupt mask register */
6860021220SAndre Przywara 	__u8 isr;		/* interrupt service register */
6960021220SAndre Przywara 	__u8 priority_add;	/* highest irq priority */
7060021220SAndre Przywara 	__u8 irq_base;
7160021220SAndre Przywara 	__u8 read_reg_select;
7260021220SAndre Przywara 	__u8 poll;
7360021220SAndre Przywara 	__u8 special_mask;
7460021220SAndre Przywara 	__u8 init_state;
7560021220SAndre Przywara 	__u8 auto_eoi;
7660021220SAndre Przywara 	__u8 rotate_on_auto_eoi;
7760021220SAndre Przywara 	__u8 special_fully_nested_mode;
7860021220SAndre Przywara 	__u8 init4;		/* true if 4 byte init */
7960021220SAndre Przywara 	__u8 elcr;		/* PIIX edge/trigger selection */
8060021220SAndre Przywara 	__u8 elcr_mask;
8160021220SAndre Przywara };
8260021220SAndre Przywara 
8360021220SAndre Przywara #define KVM_IOAPIC_NUM_PINS  24
8460021220SAndre Przywara struct kvm_ioapic_state {
8560021220SAndre Przywara 	__u64 base_address;
8660021220SAndre Przywara 	__u32 ioregsel;
8760021220SAndre Przywara 	__u32 id;
8860021220SAndre Przywara 	__u32 irr;
8960021220SAndre Przywara 	__u32 pad;
9060021220SAndre Przywara 	union {
9160021220SAndre Przywara 		__u64 bits;
9260021220SAndre Przywara 		struct {
9360021220SAndre Przywara 			__u8 vector;
9460021220SAndre Przywara 			__u8 delivery_mode:3;
9560021220SAndre Przywara 			__u8 dest_mode:1;
9660021220SAndre Przywara 			__u8 delivery_status:1;
9760021220SAndre Przywara 			__u8 polarity:1;
9860021220SAndre Przywara 			__u8 remote_irr:1;
9960021220SAndre Przywara 			__u8 trig_mode:1;
10060021220SAndre Przywara 			__u8 mask:1;
10160021220SAndre Przywara 			__u8 reserve:7;
10260021220SAndre Przywara 			__u8 reserved[4];
10360021220SAndre Przywara 			__u8 dest_id;
10460021220SAndre Przywara 		} fields;
10560021220SAndre Przywara 	} redirtbl[KVM_IOAPIC_NUM_PINS];
10660021220SAndre Przywara };
10760021220SAndre Przywara 
10860021220SAndre Przywara #define KVM_IRQCHIP_PIC_MASTER   0
10960021220SAndre Przywara #define KVM_IRQCHIP_PIC_SLAVE    1
11060021220SAndre Przywara #define KVM_IRQCHIP_IOAPIC       2
11160021220SAndre Przywara #define KVM_NR_IRQCHIPS          3
11260021220SAndre Przywara 
113b37ed70eSAndre Przywara #define KVM_RUN_X86_SMM		 (1 << 0)
114b37ed70eSAndre Przywara 
11560021220SAndre Przywara /* for KVM_GET_REGS and KVM_SET_REGS */
11660021220SAndre Przywara struct kvm_regs {
11760021220SAndre Przywara 	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
11860021220SAndre Przywara 	__u64 rax, rbx, rcx, rdx;
11960021220SAndre Przywara 	__u64 rsi, rdi, rsp, rbp;
12060021220SAndre Przywara 	__u64 r8,  r9,  r10, r11;
12160021220SAndre Przywara 	__u64 r12, r13, r14, r15;
12260021220SAndre Przywara 	__u64 rip, rflags;
12360021220SAndre Przywara };
12460021220SAndre Przywara 
12560021220SAndre Przywara /* for KVM_GET_LAPIC and KVM_SET_LAPIC */
12660021220SAndre Przywara #define KVM_APIC_REG_SIZE 0x400
12760021220SAndre Przywara struct kvm_lapic_state {
12860021220SAndre Przywara 	char regs[KVM_APIC_REG_SIZE];
12960021220SAndre Przywara };
13060021220SAndre Przywara 
13160021220SAndre Przywara struct kvm_segment {
13260021220SAndre Przywara 	__u64 base;
13360021220SAndre Przywara 	__u32 limit;
13460021220SAndre Przywara 	__u16 selector;
13560021220SAndre Przywara 	__u8  type;
13660021220SAndre Przywara 	__u8  present, dpl, db, s, l, g, avl;
13760021220SAndre Przywara 	__u8  unusable;
13860021220SAndre Przywara 	__u8  padding;
13960021220SAndre Przywara };
14060021220SAndre Przywara 
14160021220SAndre Przywara struct kvm_dtable {
14260021220SAndre Przywara 	__u64 base;
14360021220SAndre Przywara 	__u16 limit;
14460021220SAndre Przywara 	__u16 padding[3];
14560021220SAndre Przywara };
14660021220SAndre Przywara 
14760021220SAndre Przywara 
14860021220SAndre Przywara /* for KVM_GET_SREGS and KVM_SET_SREGS */
14960021220SAndre Przywara struct kvm_sregs {
15060021220SAndre Przywara 	/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
15160021220SAndre Przywara 	struct kvm_segment cs, ds, es, fs, gs, ss;
15260021220SAndre Przywara 	struct kvm_segment tr, ldt;
15360021220SAndre Przywara 	struct kvm_dtable gdt, idt;
15460021220SAndre Przywara 	__u64 cr0, cr2, cr3, cr4, cr8;
15560021220SAndre Przywara 	__u64 efer;
15660021220SAndre Przywara 	__u64 apic_base;
15760021220SAndre Przywara 	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
15860021220SAndre Przywara };
15960021220SAndre Przywara 
16060021220SAndre Przywara /* for KVM_GET_FPU and KVM_SET_FPU */
16160021220SAndre Przywara struct kvm_fpu {
16260021220SAndre Przywara 	__u8  fpr[8][16];
16360021220SAndre Przywara 	__u16 fcw;
16460021220SAndre Przywara 	__u16 fsw;
16560021220SAndre Przywara 	__u8  ftwx;  /* in fxsave format */
16660021220SAndre Przywara 	__u8  pad1;
16760021220SAndre Przywara 	__u16 last_opcode;
16860021220SAndre Przywara 	__u64 last_ip;
16960021220SAndre Przywara 	__u64 last_dp;
17060021220SAndre Przywara 	__u8  xmm[16][16];
17160021220SAndre Przywara 	__u32 mxcsr;
17260021220SAndre Przywara 	__u32 pad2;
17360021220SAndre Przywara };
17460021220SAndre Przywara 
17560021220SAndre Przywara struct kvm_msr_entry {
17660021220SAndre Przywara 	__u32 index;
17760021220SAndre Przywara 	__u32 reserved;
17860021220SAndre Przywara 	__u64 data;
17960021220SAndre Przywara };
18060021220SAndre Przywara 
18160021220SAndre Przywara /* for KVM_GET_MSRS and KVM_SET_MSRS */
18260021220SAndre Przywara struct kvm_msrs {
18360021220SAndre Przywara 	__u32 nmsrs; /* number of msrs in entries */
18460021220SAndre Przywara 	__u32 pad;
18560021220SAndre Przywara 
18660021220SAndre Przywara 	struct kvm_msr_entry entries[0];
18760021220SAndre Przywara };
18860021220SAndre Przywara 
18960021220SAndre Przywara /* for KVM_GET_MSR_INDEX_LIST */
19060021220SAndre Przywara struct kvm_msr_list {
19160021220SAndre Przywara 	__u32 nmsrs; /* number of msrs in entries */
19260021220SAndre Przywara 	__u32 indices[0];
19360021220SAndre Przywara };
19460021220SAndre Przywara 
19560021220SAndre Przywara 
19660021220SAndre Przywara struct kvm_cpuid_entry {
19760021220SAndre Przywara 	__u32 function;
19860021220SAndre Przywara 	__u32 eax;
19960021220SAndre Przywara 	__u32 ebx;
20060021220SAndre Przywara 	__u32 ecx;
20160021220SAndre Przywara 	__u32 edx;
20260021220SAndre Przywara 	__u32 padding;
20360021220SAndre Przywara };
20460021220SAndre Przywara 
20560021220SAndre Przywara /* for KVM_SET_CPUID */
20660021220SAndre Przywara struct kvm_cpuid {
20760021220SAndre Przywara 	__u32 nent;
20860021220SAndre Przywara 	__u32 padding;
20960021220SAndre Przywara 	struct kvm_cpuid_entry entries[0];
21060021220SAndre Przywara };
21160021220SAndre Przywara 
21260021220SAndre Przywara struct kvm_cpuid_entry2 {
21360021220SAndre Przywara 	__u32 function;
21460021220SAndre Przywara 	__u32 index;
21560021220SAndre Przywara 	__u32 flags;
21660021220SAndre Przywara 	__u32 eax;
21760021220SAndre Przywara 	__u32 ebx;
21860021220SAndre Przywara 	__u32 ecx;
21960021220SAndre Przywara 	__u32 edx;
22060021220SAndre Przywara 	__u32 padding[3];
22160021220SAndre Przywara };
22260021220SAndre Przywara 
223764dfba1SAndre Przywara #define KVM_CPUID_FLAG_SIGNIFCANT_INDEX		(1 << 0)
224764dfba1SAndre Przywara #define KVM_CPUID_FLAG_STATEFUL_FUNC		(1 << 1)
225764dfba1SAndre Przywara #define KVM_CPUID_FLAG_STATE_READ_NEXT		(1 << 2)
22660021220SAndre Przywara 
22760021220SAndre Przywara /* for KVM_SET_CPUID2 */
22860021220SAndre Przywara struct kvm_cpuid2 {
22960021220SAndre Przywara 	__u32 nent;
23060021220SAndre Przywara 	__u32 padding;
23160021220SAndre Przywara 	struct kvm_cpuid_entry2 entries[0];
23260021220SAndre Przywara };
23360021220SAndre Przywara 
23460021220SAndre Przywara /* for KVM_GET_PIT and KVM_SET_PIT */
23560021220SAndre Przywara struct kvm_pit_channel_state {
23660021220SAndre Przywara 	__u32 count; /* can be 65536 */
23760021220SAndre Przywara 	__u16 latched_count;
23860021220SAndre Przywara 	__u8 count_latched;
23960021220SAndre Przywara 	__u8 status_latched;
24060021220SAndre Przywara 	__u8 status;
24160021220SAndre Przywara 	__u8 read_state;
24260021220SAndre Przywara 	__u8 write_state;
24360021220SAndre Przywara 	__u8 write_latch;
24460021220SAndre Przywara 	__u8 rw_mode;
24560021220SAndre Przywara 	__u8 mode;
24660021220SAndre Przywara 	__u8 bcd;
24760021220SAndre Przywara 	__u8 gate;
24860021220SAndre Przywara 	__s64 count_load_time;
24960021220SAndre Przywara };
25060021220SAndre Przywara 
25160021220SAndre Przywara struct kvm_debug_exit_arch {
25260021220SAndre Przywara 	__u32 exception;
25360021220SAndre Przywara 	__u32 pad;
25460021220SAndre Przywara 	__u64 pc;
25560021220SAndre Przywara 	__u64 dr6;
25660021220SAndre Przywara 	__u64 dr7;
25760021220SAndre Przywara };
25860021220SAndre Przywara 
25960021220SAndre Przywara #define KVM_GUESTDBG_USE_SW_BP		0x00010000
26060021220SAndre Przywara #define KVM_GUESTDBG_USE_HW_BP		0x00020000
26160021220SAndre Przywara #define KVM_GUESTDBG_INJECT_DB		0x00040000
26260021220SAndre Przywara #define KVM_GUESTDBG_INJECT_BP		0x00080000
26360021220SAndre Przywara 
26460021220SAndre Przywara /* for KVM_SET_GUEST_DEBUG */
26560021220SAndre Przywara struct kvm_guest_debug_arch {
26660021220SAndre Przywara 	__u64 debugreg[8];
26760021220SAndre Przywara };
26860021220SAndre Przywara 
26960021220SAndre Przywara struct kvm_pit_state {
27060021220SAndre Przywara 	struct kvm_pit_channel_state channels[3];
27160021220SAndre Przywara };
27260021220SAndre Przywara 
27360021220SAndre Przywara #define KVM_PIT_FLAGS_HPET_LEGACY  0x00000001
27460021220SAndre Przywara 
27560021220SAndre Przywara struct kvm_pit_state2 {
27660021220SAndre Przywara 	struct kvm_pit_channel_state channels[3];
27760021220SAndre Przywara 	__u32 flags;
27860021220SAndre Przywara 	__u32 reserved[9];
27960021220SAndre Przywara };
28060021220SAndre Przywara 
28160021220SAndre Przywara struct kvm_reinject_control {
28260021220SAndre Przywara 	__u8 pit_reinject;
28360021220SAndre Przywara 	__u8 reserved[31];
28460021220SAndre Przywara };
28560021220SAndre Przywara 
28660021220SAndre Przywara /* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */
28760021220SAndre Przywara #define KVM_VCPUEVENT_VALID_NMI_PENDING	0x00000001
28860021220SAndre Przywara #define KVM_VCPUEVENT_VALID_SIPI_VECTOR	0x00000002
28960021220SAndre Przywara #define KVM_VCPUEVENT_VALID_SHADOW	0x00000004
290b37ed70eSAndre Przywara #define KVM_VCPUEVENT_VALID_SMM		0x00000008
291*1bbe92f5SDave Martin #define KVM_VCPUEVENT_VALID_PAYLOAD	0x00000010
29260021220SAndre Przywara 
29360021220SAndre Przywara /* Interrupt shadow states */
29460021220SAndre Przywara #define KVM_X86_SHADOW_INT_MOV_SS	0x01
29560021220SAndre Przywara #define KVM_X86_SHADOW_INT_STI		0x02
29660021220SAndre Przywara 
29760021220SAndre Przywara /* for KVM_GET/SET_VCPU_EVENTS */
29860021220SAndre Przywara struct kvm_vcpu_events {
29960021220SAndre Przywara 	struct {
30060021220SAndre Przywara 		__u8 injected;
30160021220SAndre Przywara 		__u8 nr;
30260021220SAndre Przywara 		__u8 has_error_code;
303*1bbe92f5SDave Martin 		__u8 pending;
30460021220SAndre Przywara 		__u32 error_code;
30560021220SAndre Przywara 	} exception;
30660021220SAndre Przywara 	struct {
30760021220SAndre Przywara 		__u8 injected;
30860021220SAndre Przywara 		__u8 nr;
30960021220SAndre Przywara 		__u8 soft;
31060021220SAndre Przywara 		__u8 shadow;
31160021220SAndre Przywara 	} interrupt;
31260021220SAndre Przywara 	struct {
31360021220SAndre Przywara 		__u8 injected;
31460021220SAndre Przywara 		__u8 pending;
31560021220SAndre Przywara 		__u8 masked;
31660021220SAndre Przywara 		__u8 pad;
31760021220SAndre Przywara 	} nmi;
31860021220SAndre Przywara 	__u32 sipi_vector;
31960021220SAndre Przywara 	__u32 flags;
320b37ed70eSAndre Przywara 	struct {
321b37ed70eSAndre Przywara 		__u8 smm;
322b37ed70eSAndre Przywara 		__u8 pending;
323b37ed70eSAndre Przywara 		__u8 smm_inside_nmi;
324b37ed70eSAndre Przywara 		__u8 latched_init;
325b37ed70eSAndre Przywara 	} smi;
326*1bbe92f5SDave Martin 	__u8 reserved[27];
327*1bbe92f5SDave Martin 	__u8 exception_has_payload;
328*1bbe92f5SDave Martin 	__u64 exception_payload;
32960021220SAndre Przywara };
33060021220SAndre Przywara 
33160021220SAndre Przywara /* for KVM_GET/SET_DEBUGREGS */
33260021220SAndre Przywara struct kvm_debugregs {
33360021220SAndre Przywara 	__u64 db[4];
33460021220SAndre Przywara 	__u64 dr6;
33560021220SAndre Przywara 	__u64 dr7;
33660021220SAndre Przywara 	__u64 flags;
33760021220SAndre Przywara 	__u64 reserved[9];
33860021220SAndre Przywara };
33960021220SAndre Przywara 
34060021220SAndre Przywara /* for KVM_CAP_XSAVE */
34160021220SAndre Przywara struct kvm_xsave {
34260021220SAndre Przywara 	__u32 region[1024];
34360021220SAndre Przywara };
34460021220SAndre Przywara 
34560021220SAndre Przywara #define KVM_MAX_XCRS	16
34660021220SAndre Przywara 
34760021220SAndre Przywara struct kvm_xcr {
34860021220SAndre Przywara 	__u32 xcr;
34960021220SAndre Przywara 	__u32 reserved;
35060021220SAndre Przywara 	__u64 value;
35160021220SAndre Przywara };
35260021220SAndre Przywara 
35360021220SAndre Przywara struct kvm_xcrs {
35460021220SAndre Przywara 	__u32 nr_xcrs;
35560021220SAndre Przywara 	__u32 flags;
35660021220SAndre Przywara 	struct kvm_xcr xcrs[KVM_MAX_XCRS];
35760021220SAndre Przywara 	__u64 padding[16];
35860021220SAndre Przywara };
35960021220SAndre Przywara 
360*1bbe92f5SDave Martin #define KVM_SYNC_X86_REGS      (1UL << 0)
361*1bbe92f5SDave Martin #define KVM_SYNC_X86_SREGS     (1UL << 1)
362*1bbe92f5SDave Martin #define KVM_SYNC_X86_EVENTS    (1UL << 2)
363*1bbe92f5SDave Martin 
364*1bbe92f5SDave Martin #define KVM_SYNC_X86_VALID_FIELDS \
365*1bbe92f5SDave Martin 	(KVM_SYNC_X86_REGS| \
366*1bbe92f5SDave Martin 	 KVM_SYNC_X86_SREGS| \
367*1bbe92f5SDave Martin 	 KVM_SYNC_X86_EVENTS)
368*1bbe92f5SDave Martin 
369*1bbe92f5SDave Martin /* kvm_sync_regs struct included by kvm_run struct */
37060021220SAndre Przywara struct kvm_sync_regs {
371*1bbe92f5SDave Martin 	/* Members of this structure are potentially malicious.
372*1bbe92f5SDave Martin 	 * Care must be taken by code reading, esp. interpreting,
373*1bbe92f5SDave Martin 	 * data fields from them inside KVM to prevent TOCTOU and
374*1bbe92f5SDave Martin 	 * double-fetch types of vulnerabilities.
375*1bbe92f5SDave Martin 	 */
376*1bbe92f5SDave Martin 	struct kvm_regs regs;
377*1bbe92f5SDave Martin 	struct kvm_sregs sregs;
378*1bbe92f5SDave Martin 	struct kvm_vcpu_events events;
37960021220SAndre Przywara };
38060021220SAndre Przywara 
381b37ed70eSAndre Przywara #define KVM_X86_QUIRK_LINT0_REENABLED	(1 << 0)
382b37ed70eSAndre Przywara #define KVM_X86_QUIRK_CD_NW_CLEARED	(1 << 1)
383*1bbe92f5SDave Martin #define KVM_X86_QUIRK_LAPIC_MMIO_HOLE	(1 << 2)
384*1bbe92f5SDave Martin 
385*1bbe92f5SDave Martin #define KVM_STATE_NESTED_GUEST_MODE	0x00000001
386*1bbe92f5SDave Martin #define KVM_STATE_NESTED_RUN_PENDING	0x00000002
387*1bbe92f5SDave Martin #define KVM_STATE_NESTED_EVMCS		0x00000004
388*1bbe92f5SDave Martin 
389*1bbe92f5SDave Martin #define KVM_STATE_NESTED_SMM_GUEST_MODE	0x00000001
390*1bbe92f5SDave Martin #define KVM_STATE_NESTED_SMM_VMXON	0x00000002
391*1bbe92f5SDave Martin 
392*1bbe92f5SDave Martin struct kvm_vmx_nested_state {
393*1bbe92f5SDave Martin 	__u64 vmxon_pa;
394*1bbe92f5SDave Martin 	__u64 vmcs_pa;
395*1bbe92f5SDave Martin 
396*1bbe92f5SDave Martin 	struct {
397*1bbe92f5SDave Martin 		__u16 flags;
398*1bbe92f5SDave Martin 	} smm;
399*1bbe92f5SDave Martin };
400*1bbe92f5SDave Martin 
401*1bbe92f5SDave Martin /* for KVM_CAP_NESTED_STATE */
402*1bbe92f5SDave Martin struct kvm_nested_state {
403*1bbe92f5SDave Martin 	/* KVM_STATE_* flags */
404*1bbe92f5SDave Martin 	__u16 flags;
405*1bbe92f5SDave Martin 
406*1bbe92f5SDave Martin 	/* 0 for VMX, 1 for SVM.  */
407*1bbe92f5SDave Martin 	__u16 format;
408*1bbe92f5SDave Martin 
409*1bbe92f5SDave Martin 	/* 128 for SVM, 128 + VMCS size for VMX.  */
410*1bbe92f5SDave Martin 	__u32 size;
411*1bbe92f5SDave Martin 
412*1bbe92f5SDave Martin 	union {
413*1bbe92f5SDave Martin 		/* VMXON, VMCS */
414*1bbe92f5SDave Martin 		struct kvm_vmx_nested_state vmx;
415*1bbe92f5SDave Martin 
416*1bbe92f5SDave Martin 		/* Pad the header to 128 bytes.  */
417*1bbe92f5SDave Martin 		__u8 pad[120];
418*1bbe92f5SDave Martin 	};
419*1bbe92f5SDave Martin 
420*1bbe92f5SDave Martin 	__u8 data[0];
421*1bbe92f5SDave Martin };
422b37ed70eSAndre Przywara 
42360021220SAndre Przywara #endif /* _ASM_X86_KVM_H */
424