xref: /openbmc/qemu/linux-headers/asm-x86/kvm.h (revision ee057a9f2976e1fb2f58e07e86b410f38bf04ac6)
1dd873966SEric Auger /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
251b24e34SJan Kiszka #ifndef _ASM_X86_KVM_H
351b24e34SJan Kiszka #define _ASM_X86_KVM_H
451b24e34SJan Kiszka 
551b24e34SJan Kiszka /*
651b24e34SJan Kiszka  * KVM x86 specific structures and definitions
751b24e34SJan Kiszka  *
851b24e34SJan Kiszka  */
951b24e34SJan Kiszka 
10ab0c7fb2SPaolo Bonzini #include <linux/const.h>
11ab0c7fb2SPaolo Bonzini #include <linux/bits.h>
1251b24e34SJan Kiszka #include <linux/types.h>
1351b24e34SJan Kiszka #include <linux/ioctl.h>
14c5c0fdbeSDavid 'Digit' Turner #include <linux/stddef.h>
1551b24e34SJan Kiszka 
1674c98e20SCornelia Huck #define KVM_PIO_PAGE_OFFSET 1
1774c98e20SCornelia Huck #define KVM_COALESCED_MMIO_PAGE_OFFSET 2
18b3c818a4SEric Farman #define KVM_DIRTY_LOG_PAGE_OFFSET 64
1974c98e20SCornelia Huck 
20716b8e4dSAlex Williamson #define DE_VECTOR 0
21716b8e4dSAlex Williamson #define DB_VECTOR 1
22716b8e4dSAlex Williamson #define BP_VECTOR 3
23716b8e4dSAlex Williamson #define OF_VECTOR 4
24716b8e4dSAlex Williamson #define BR_VECTOR 5
25716b8e4dSAlex Williamson #define UD_VECTOR 6
26716b8e4dSAlex Williamson #define NM_VECTOR 7
27716b8e4dSAlex Williamson #define DF_VECTOR 8
28716b8e4dSAlex Williamson #define TS_VECTOR 10
29716b8e4dSAlex Williamson #define NP_VECTOR 11
30716b8e4dSAlex Williamson #define SS_VECTOR 12
31716b8e4dSAlex Williamson #define GP_VECTOR 13
32716b8e4dSAlex Williamson #define PF_VECTOR 14
33716b8e4dSAlex Williamson #define MF_VECTOR 16
34a9fd1654SJens Freimann #define AC_VECTOR 17
35716b8e4dSAlex Williamson #define MC_VECTOR 18
36a9fd1654SJens Freimann #define XM_VECTOR 19
37a9fd1654SJens Freimann #define VE_VECTOR 20
38716b8e4dSAlex Williamson 
3951b24e34SJan Kiszka /* Select x86 specific features in <linux/kvm.h> */
4051b24e34SJan Kiszka #define __KVM_HAVE_PIT
4151b24e34SJan Kiszka #define __KVM_HAVE_IOAPIC
42651682dcSMichael S. Tsirkin #define __KVM_HAVE_IRQ_LINE
4351b24e34SJan Kiszka #define __KVM_HAVE_MSI
4451b24e34SJan Kiszka #define __KVM_HAVE_USER_NMI
4551b24e34SJan Kiszka #define __KVM_HAVE_MSIX
4651b24e34SJan Kiszka #define __KVM_HAVE_MCE
4751b24e34SJan Kiszka #define __KVM_HAVE_PIT_STATE2
4851b24e34SJan Kiszka #define __KVM_HAVE_XEN_HVM
4951b24e34SJan Kiszka #define __KVM_HAVE_VCPU_EVENTS
5051b24e34SJan Kiszka #define __KVM_HAVE_DEBUGREGS
5151b24e34SJan Kiszka #define __KVM_HAVE_XSAVE
5251b24e34SJan Kiszka #define __KVM_HAVE_XCRS
5351b24e34SJan Kiszka 
5451b24e34SJan Kiszka /* Architectural interrupt line count. */
5551b24e34SJan Kiszka #define KVM_NR_INTERRUPTS 256
5651b24e34SJan Kiszka 
5751b24e34SJan Kiszka /* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
5851b24e34SJan Kiszka struct kvm_pic_state {
5951b24e34SJan Kiszka 	__u8 last_irr;	/* edge detection */
6051b24e34SJan Kiszka 	__u8 irr;		/* interrupt request register */
6151b24e34SJan Kiszka 	__u8 imr;		/* interrupt mask register */
6251b24e34SJan Kiszka 	__u8 isr;		/* interrupt service register */
6351b24e34SJan Kiszka 	__u8 priority_add;	/* highest irq priority */
6451b24e34SJan Kiszka 	__u8 irq_base;
6551b24e34SJan Kiszka 	__u8 read_reg_select;
6651b24e34SJan Kiszka 	__u8 poll;
6751b24e34SJan Kiszka 	__u8 special_mask;
6851b24e34SJan Kiszka 	__u8 init_state;
6951b24e34SJan Kiszka 	__u8 auto_eoi;
7051b24e34SJan Kiszka 	__u8 rotate_on_auto_eoi;
7151b24e34SJan Kiszka 	__u8 special_fully_nested_mode;
7251b24e34SJan Kiszka 	__u8 init4;		/* true if 4 byte init */
7351b24e34SJan Kiszka 	__u8 elcr;		/* PIIX edge/trigger selection */
7451b24e34SJan Kiszka 	__u8 elcr_mask;
7551b24e34SJan Kiszka };
7651b24e34SJan Kiszka 
7751b24e34SJan Kiszka #define KVM_IOAPIC_NUM_PINS  24
7851b24e34SJan Kiszka struct kvm_ioapic_state {
7951b24e34SJan Kiszka 	__u64 base_address;
8051b24e34SJan Kiszka 	__u32 ioregsel;
8151b24e34SJan Kiszka 	__u32 id;
8251b24e34SJan Kiszka 	__u32 irr;
8351b24e34SJan Kiszka 	__u32 pad;
8451b24e34SJan Kiszka 	union {
8551b24e34SJan Kiszka 		__u64 bits;
8651b24e34SJan Kiszka 		struct {
8751b24e34SJan Kiszka 			__u8 vector;
8851b24e34SJan Kiszka 			__u8 delivery_mode:3;
8951b24e34SJan Kiszka 			__u8 dest_mode:1;
9051b24e34SJan Kiszka 			__u8 delivery_status:1;
9151b24e34SJan Kiszka 			__u8 polarity:1;
9251b24e34SJan Kiszka 			__u8 remote_irr:1;
9351b24e34SJan Kiszka 			__u8 trig_mode:1;
9451b24e34SJan Kiszka 			__u8 mask:1;
9551b24e34SJan Kiszka 			__u8 reserve:7;
9651b24e34SJan Kiszka 			__u8 reserved[4];
9751b24e34SJan Kiszka 			__u8 dest_id;
9851b24e34SJan Kiszka 		} fields;
9951b24e34SJan Kiszka 	} redirtbl[KVM_IOAPIC_NUM_PINS];
10051b24e34SJan Kiszka };
10151b24e34SJan Kiszka 
10251b24e34SJan Kiszka #define KVM_IRQCHIP_PIC_MASTER   0
10351b24e34SJan Kiszka #define KVM_IRQCHIP_PIC_SLAVE    1
10451b24e34SJan Kiszka #define KVM_IRQCHIP_IOAPIC       2
10551b24e34SJan Kiszka #define KVM_NR_IRQCHIPS          3
10651b24e34SJan Kiszka 
10724a31426SPaolo Bonzini #define KVM_RUN_X86_SMM		 (1 << 0)
108278f064eSEduardo Habkost #define KVM_RUN_X86_BUS_LOCK     (1 << 1)
109*0d2eeef7SBibo Mao #define KVM_RUN_X86_GUEST_MODE   (1 << 2)
11024a31426SPaolo Bonzini 
11151b24e34SJan Kiszka /* for KVM_GET_REGS and KVM_SET_REGS */
11251b24e34SJan Kiszka struct kvm_regs {
11351b24e34SJan Kiszka 	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
11451b24e34SJan Kiszka 	__u64 rax, rbx, rcx, rdx;
11551b24e34SJan Kiszka 	__u64 rsi, rdi, rsp, rbp;
11651b24e34SJan Kiszka 	__u64 r8,  r9,  r10, r11;
11751b24e34SJan Kiszka 	__u64 r12, r13, r14, r15;
11851b24e34SJan Kiszka 	__u64 rip, rflags;
11951b24e34SJan Kiszka };
12051b24e34SJan Kiszka 
12151b24e34SJan Kiszka /* for KVM_GET_LAPIC and KVM_SET_LAPIC */
12251b24e34SJan Kiszka #define KVM_APIC_REG_SIZE 0x400
12351b24e34SJan Kiszka struct kvm_lapic_state {
12451b24e34SJan Kiszka 	char regs[KVM_APIC_REG_SIZE];
12551b24e34SJan Kiszka };
12651b24e34SJan Kiszka 
12751b24e34SJan Kiszka struct kvm_segment {
12851b24e34SJan Kiszka 	__u64 base;
12951b24e34SJan Kiszka 	__u32 limit;
13051b24e34SJan Kiszka 	__u16 selector;
13151b24e34SJan Kiszka 	__u8  type;
13251b24e34SJan Kiszka 	__u8  present, dpl, db, s, l, g, avl;
13351b24e34SJan Kiszka 	__u8  unusable;
13451b24e34SJan Kiszka 	__u8  padding;
13551b24e34SJan Kiszka };
13651b24e34SJan Kiszka 
13751b24e34SJan Kiszka struct kvm_dtable {
13851b24e34SJan Kiszka 	__u64 base;
13951b24e34SJan Kiszka 	__u16 limit;
14051b24e34SJan Kiszka 	__u16 padding[3];
14151b24e34SJan Kiszka };
14251b24e34SJan Kiszka 
14351b24e34SJan Kiszka 
14451b24e34SJan Kiszka /* for KVM_GET_SREGS and KVM_SET_SREGS */
14551b24e34SJan Kiszka struct kvm_sregs {
14651b24e34SJan Kiszka 	/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
14751b24e34SJan Kiszka 	struct kvm_segment cs, ds, es, fs, gs, ss;
14851b24e34SJan Kiszka 	struct kvm_segment tr, ldt;
14951b24e34SJan Kiszka 	struct kvm_dtable gdt, idt;
15051b24e34SJan Kiszka 	__u64 cr0, cr2, cr3, cr4, cr8;
15151b24e34SJan Kiszka 	__u64 efer;
15251b24e34SJan Kiszka 	__u64 apic_base;
153b07d1c2fSPeter Maydell 	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
15451b24e34SJan Kiszka };
15551b24e34SJan Kiszka 
156327d4b7fSBharata B Rao struct kvm_sregs2 {
157327d4b7fSBharata B Rao 	/* out (KVM_GET_SREGS2) / in (KVM_SET_SREGS2) */
158327d4b7fSBharata B Rao 	struct kvm_segment cs, ds, es, fs, gs, ss;
159327d4b7fSBharata B Rao 	struct kvm_segment tr, ldt;
160327d4b7fSBharata B Rao 	struct kvm_dtable gdt, idt;
161327d4b7fSBharata B Rao 	__u64 cr0, cr2, cr3, cr4, cr8;
162327d4b7fSBharata B Rao 	__u64 efer;
163327d4b7fSBharata B Rao 	__u64 apic_base;
164327d4b7fSBharata B Rao 	__u64 flags;
165327d4b7fSBharata B Rao 	__u64 pdptrs[4];
166327d4b7fSBharata B Rao };
167327d4b7fSBharata B Rao #define KVM_SREGS2_FLAGS_PDPTRS_VALID 1
168327d4b7fSBharata B Rao 
16951b24e34SJan Kiszka /* for KVM_GET_FPU and KVM_SET_FPU */
17051b24e34SJan Kiszka struct kvm_fpu {
17151b24e34SJan Kiszka 	__u8  fpr[8][16];
17251b24e34SJan Kiszka 	__u16 fcw;
17351b24e34SJan Kiszka 	__u16 fsw;
17451b24e34SJan Kiszka 	__u8  ftwx;  /* in fxsave format */
17551b24e34SJan Kiszka 	__u8  pad1;
17651b24e34SJan Kiszka 	__u16 last_opcode;
17751b24e34SJan Kiszka 	__u64 last_ip;
17851b24e34SJan Kiszka 	__u64 last_dp;
17951b24e34SJan Kiszka 	__u8  xmm[16][16];
18051b24e34SJan Kiszka 	__u32 mxcsr;
18151b24e34SJan Kiszka 	__u32 pad2;
18251b24e34SJan Kiszka };
18351b24e34SJan Kiszka 
18451b24e34SJan Kiszka struct kvm_msr_entry {
18551b24e34SJan Kiszka 	__u32 index;
18651b24e34SJan Kiszka 	__u32 reserved;
18751b24e34SJan Kiszka 	__u64 data;
18851b24e34SJan Kiszka };
18951b24e34SJan Kiszka 
19051b24e34SJan Kiszka /* for KVM_GET_MSRS and KVM_SET_MSRS */
19151b24e34SJan Kiszka struct kvm_msrs {
19251b24e34SJan Kiszka 	__u32 nmsrs; /* number of msrs in entries */
19351b24e34SJan Kiszka 	__u32 pad;
19451b24e34SJan Kiszka 
195d525f73fSChenyi Qiang 	struct kvm_msr_entry entries[];
19651b24e34SJan Kiszka };
19751b24e34SJan Kiszka 
19851b24e34SJan Kiszka /* for KVM_GET_MSR_INDEX_LIST */
19951b24e34SJan Kiszka struct kvm_msr_list {
20051b24e34SJan Kiszka 	__u32 nmsrs; /* number of msrs in entries */
201d525f73fSChenyi Qiang 	__u32 indices[];
20251b24e34SJan Kiszka };
20351b24e34SJan Kiszka 
20453ba2eeeSMatthew Rosato /* Maximum size of any access bitmap in bytes */
20553ba2eeeSMatthew Rosato #define KVM_MSR_FILTER_MAX_BITMAP_SIZE 0x600
20653ba2eeeSMatthew Rosato 
20753ba2eeeSMatthew Rosato /* for KVM_X86_SET_MSR_FILTER */
20853ba2eeeSMatthew Rosato struct kvm_msr_filter_range {
20953ba2eeeSMatthew Rosato #define KVM_MSR_FILTER_READ  (1 << 0)
21053ba2eeeSMatthew Rosato #define KVM_MSR_FILTER_WRITE (1 << 1)
21193d7620cSAvihai Horon #define KVM_MSR_FILTER_RANGE_VALID_MASK (KVM_MSR_FILTER_READ | \
21293d7620cSAvihai Horon 					 KVM_MSR_FILTER_WRITE)
21353ba2eeeSMatthew Rosato 	__u32 flags;
21453ba2eeeSMatthew Rosato 	__u32 nmsrs; /* number of msrs in bitmap */
21553ba2eeeSMatthew Rosato 	__u32 base;  /* MSR index the bitmap starts at */
21653ba2eeeSMatthew Rosato 	__u8 *bitmap; /* a 1 bit allows the operations in flags, 0 denies */
21753ba2eeeSMatthew Rosato };
21853ba2eeeSMatthew Rosato 
21953ba2eeeSMatthew Rosato #define KVM_MSR_FILTER_MAX_RANGES 16
22053ba2eeeSMatthew Rosato struct kvm_msr_filter {
22153ba2eeeSMatthew Rosato #define KVM_MSR_FILTER_DEFAULT_ALLOW (0 << 0)
22253ba2eeeSMatthew Rosato #define KVM_MSR_FILTER_DEFAULT_DENY  (1 << 0)
22393d7620cSAvihai Horon #define KVM_MSR_FILTER_VALID_MASK (KVM_MSR_FILTER_DEFAULT_DENY)
22453ba2eeeSMatthew Rosato 	__u32 flags;
22553ba2eeeSMatthew Rosato 	struct kvm_msr_filter_range ranges[KVM_MSR_FILTER_MAX_RANGES];
22653ba2eeeSMatthew Rosato };
22751b24e34SJan Kiszka 
22851b24e34SJan Kiszka struct kvm_cpuid_entry {
22951b24e34SJan Kiszka 	__u32 function;
23051b24e34SJan Kiszka 	__u32 eax;
23151b24e34SJan Kiszka 	__u32 ebx;
23251b24e34SJan Kiszka 	__u32 ecx;
23351b24e34SJan Kiszka 	__u32 edx;
23451b24e34SJan Kiszka 	__u32 padding;
23551b24e34SJan Kiszka };
23651b24e34SJan Kiszka 
23751b24e34SJan Kiszka /* for KVM_SET_CPUID */
23851b24e34SJan Kiszka struct kvm_cpuid {
23951b24e34SJan Kiszka 	__u32 nent;
24051b24e34SJan Kiszka 	__u32 padding;
241d525f73fSChenyi Qiang 	struct kvm_cpuid_entry entries[];
24251b24e34SJan Kiszka };
24351b24e34SJan Kiszka 
24451b24e34SJan Kiszka struct kvm_cpuid_entry2 {
24551b24e34SJan Kiszka 	__u32 function;
24651b24e34SJan Kiszka 	__u32 index;
24751b24e34SJan Kiszka 	__u32 flags;
24851b24e34SJan Kiszka 	__u32 eax;
24951b24e34SJan Kiszka 	__u32 ebx;
25051b24e34SJan Kiszka 	__u32 ecx;
25151b24e34SJan Kiszka 	__u32 edx;
25251b24e34SJan Kiszka 	__u32 padding[3];
25351b24e34SJan Kiszka };
25451b24e34SJan Kiszka 
255ff804f15SCornelia Huck #define KVM_CPUID_FLAG_SIGNIFCANT_INDEX		(1 << 0)
256ff804f15SCornelia Huck #define KVM_CPUID_FLAG_STATEFUL_FUNC		(1 << 1)
257ff804f15SCornelia Huck #define KVM_CPUID_FLAG_STATE_READ_NEXT		(1 << 2)
25851b24e34SJan Kiszka 
25951b24e34SJan Kiszka /* for KVM_SET_CPUID2 */
26051b24e34SJan Kiszka struct kvm_cpuid2 {
26151b24e34SJan Kiszka 	__u32 nent;
26251b24e34SJan Kiszka 	__u32 padding;
263d525f73fSChenyi Qiang 	struct kvm_cpuid_entry2 entries[];
26451b24e34SJan Kiszka };
26551b24e34SJan Kiszka 
26651b24e34SJan Kiszka /* for KVM_GET_PIT and KVM_SET_PIT */
26751b24e34SJan Kiszka struct kvm_pit_channel_state {
26851b24e34SJan Kiszka 	__u32 count; /* can be 65536 */
26951b24e34SJan Kiszka 	__u16 latched_count;
27051b24e34SJan Kiszka 	__u8 count_latched;
27151b24e34SJan Kiszka 	__u8 status_latched;
27251b24e34SJan Kiszka 	__u8 status;
27351b24e34SJan Kiszka 	__u8 read_state;
27451b24e34SJan Kiszka 	__u8 write_state;
27551b24e34SJan Kiszka 	__u8 write_latch;
27651b24e34SJan Kiszka 	__u8 rw_mode;
27751b24e34SJan Kiszka 	__u8 mode;
27851b24e34SJan Kiszka 	__u8 bcd;
27951b24e34SJan Kiszka 	__u8 gate;
28051b24e34SJan Kiszka 	__s64 count_load_time;
28151b24e34SJan Kiszka };
28251b24e34SJan Kiszka 
28351b24e34SJan Kiszka struct kvm_debug_exit_arch {
28451b24e34SJan Kiszka 	__u32 exception;
28551b24e34SJan Kiszka 	__u32 pad;
28651b24e34SJan Kiszka 	__u64 pc;
28751b24e34SJan Kiszka 	__u64 dr6;
28851b24e34SJan Kiszka 	__u64 dr7;
28951b24e34SJan Kiszka };
29051b24e34SJan Kiszka 
29151b24e34SJan Kiszka #define KVM_GUESTDBG_USE_SW_BP		0x00010000
29251b24e34SJan Kiszka #define KVM_GUESTDBG_USE_HW_BP		0x00020000
29351b24e34SJan Kiszka #define KVM_GUESTDBG_INJECT_DB		0x00040000
29451b24e34SJan Kiszka #define KVM_GUESTDBG_INJECT_BP		0x00080000
29543709a0cSPaolo Bonzini #define KVM_GUESTDBG_BLOCKIRQ		0x00100000
29651b24e34SJan Kiszka 
29751b24e34SJan Kiszka /* for KVM_SET_GUEST_DEBUG */
29851b24e34SJan Kiszka struct kvm_guest_debug_arch {
29951b24e34SJan Kiszka 	__u64 debugreg[8];
30051b24e34SJan Kiszka };
30151b24e34SJan Kiszka 
30251b24e34SJan Kiszka struct kvm_pit_state {
30351b24e34SJan Kiszka 	struct kvm_pit_channel_state channels[3];
30451b24e34SJan Kiszka };
30551b24e34SJan Kiszka 
30651b24e34SJan Kiszka #define KVM_PIT_FLAGS_HPET_LEGACY     0x00000001
307d525f73fSChenyi Qiang #define KVM_PIT_FLAGS_SPEAKER_DATA_ON 0x00000002
30851b24e34SJan Kiszka 
30951b24e34SJan Kiszka struct kvm_pit_state2 {
31051b24e34SJan Kiszka 	struct kvm_pit_channel_state channels[3];
31151b24e34SJan Kiszka 	__u32 flags;
31251b24e34SJan Kiszka 	__u32 reserved[9];
31351b24e34SJan Kiszka };
31451b24e34SJan Kiszka 
31551b24e34SJan Kiszka struct kvm_reinject_control {
31651b24e34SJan Kiszka 	__u8 pit_reinject;
31751b24e34SJan Kiszka 	__u8 reserved[31];
31851b24e34SJan Kiszka };
31951b24e34SJan Kiszka 
32051b24e34SJan Kiszka /* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */
32151b24e34SJan Kiszka #define KVM_VCPUEVENT_VALID_NMI_PENDING	0x00000001
32251b24e34SJan Kiszka #define KVM_VCPUEVENT_VALID_SIPI_VECTOR	0x00000002
32351b24e34SJan Kiszka #define KVM_VCPUEVENT_VALID_SHADOW	0x00000004
32424a31426SPaolo Bonzini #define KVM_VCPUEVENT_VALID_SMM		0x00000008
325966f2ec3SPaolo Bonzini #define KVM_VCPUEVENT_VALID_PAYLOAD	0x00000010
326d525f73fSChenyi Qiang #define KVM_VCPUEVENT_VALID_TRIPLE_FAULT	0x00000020
32751b24e34SJan Kiszka 
32851b24e34SJan Kiszka /* Interrupt shadow states */
32951b24e34SJan Kiszka #define KVM_X86_SHADOW_INT_MOV_SS	0x01
33051b24e34SJan Kiszka #define KVM_X86_SHADOW_INT_STI		0x02
33151b24e34SJan Kiszka 
33251b24e34SJan Kiszka /* for KVM_GET/SET_VCPU_EVENTS */
33351b24e34SJan Kiszka struct kvm_vcpu_events {
33451b24e34SJan Kiszka 	struct {
33551b24e34SJan Kiszka 		__u8 injected;
33651b24e34SJan Kiszka 		__u8 nr;
33751b24e34SJan Kiszka 		__u8 has_error_code;
338966f2ec3SPaolo Bonzini 		__u8 pending;
33951b24e34SJan Kiszka 		__u32 error_code;
34051b24e34SJan Kiszka 	} exception;
34151b24e34SJan Kiszka 	struct {
34251b24e34SJan Kiszka 		__u8 injected;
34351b24e34SJan Kiszka 		__u8 nr;
34451b24e34SJan Kiszka 		__u8 soft;
34551b24e34SJan Kiszka 		__u8 shadow;
34651b24e34SJan Kiszka 	} interrupt;
34751b24e34SJan Kiszka 	struct {
34851b24e34SJan Kiszka 		__u8 injected;
34951b24e34SJan Kiszka 		__u8 pending;
35051b24e34SJan Kiszka 		__u8 masked;
35151b24e34SJan Kiszka 		__u8 pad;
35251b24e34SJan Kiszka 	} nmi;
35351b24e34SJan Kiszka 	__u32 sipi_vector;
35451b24e34SJan Kiszka 	__u32 flags;
35524a31426SPaolo Bonzini 	struct {
35624a31426SPaolo Bonzini 		__u8 smm;
35724a31426SPaolo Bonzini 		__u8 pending;
35824a31426SPaolo Bonzini 		__u8 smm_inside_nmi;
35924a31426SPaolo Bonzini 		__u8 latched_init;
36024a31426SPaolo Bonzini 	} smi;
361d525f73fSChenyi Qiang 	struct {
362d525f73fSChenyi Qiang 		__u8 pending;
363d525f73fSChenyi Qiang 	} triple_fault;
364d525f73fSChenyi Qiang 	__u8 reserved[26];
365966f2ec3SPaolo Bonzini 	__u8 exception_has_payload;
366966f2ec3SPaolo Bonzini 	__u64 exception_payload;
36751b24e34SJan Kiszka };
36851b24e34SJan Kiszka 
36951b24e34SJan Kiszka /* for KVM_GET/SET_DEBUGREGS */
37051b24e34SJan Kiszka struct kvm_debugregs {
37151b24e34SJan Kiszka 	__u64 db[4];
37251b24e34SJan Kiszka 	__u64 dr6;
37351b24e34SJan Kiszka 	__u64 dr7;
37451b24e34SJan Kiszka 	__u64 flags;
37551b24e34SJan Kiszka 	__u64 reserved[9];
37651b24e34SJan Kiszka };
37751b24e34SJan Kiszka 
378ef17dd6aSVivek Goyal /* for KVM_CAP_XSAVE and KVM_CAP_XSAVE2 */
37951b24e34SJan Kiszka struct kvm_xsave {
380ef17dd6aSVivek Goyal 	/*
381ef17dd6aSVivek Goyal 	 * KVM_GET_XSAVE2 and KVM_SET_XSAVE write and read as many bytes
382ef17dd6aSVivek Goyal 	 * as are returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)
383ef17dd6aSVivek Goyal 	 * respectively, when invoked on the vm file descriptor.
384ef17dd6aSVivek Goyal 	 *
385ef17dd6aSVivek Goyal 	 * The size value returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)
386ef17dd6aSVivek Goyal 	 * will always be at least 4096. Currently, it is only greater
387ef17dd6aSVivek Goyal 	 * than 4096 if a dynamic feature has been enabled with
388ef17dd6aSVivek Goyal 	 * ``arch_prctl()``, but this may change in the future.
389ef17dd6aSVivek Goyal 	 *
390ef17dd6aSVivek Goyal 	 * The offsets of the state save areas in struct kvm_xsave follow
391ef17dd6aSVivek Goyal 	 * the contents of CPUID leaf 0xD on the host.
392ef17dd6aSVivek Goyal 	 */
39351b24e34SJan Kiszka 	__u32 region[1024];
394d525f73fSChenyi Qiang 	__u32 extra[];
39551b24e34SJan Kiszka };
39651b24e34SJan Kiszka 
39751b24e34SJan Kiszka #define KVM_MAX_XCRS	16
39851b24e34SJan Kiszka 
39951b24e34SJan Kiszka struct kvm_xcr {
40051b24e34SJan Kiszka 	__u32 xcr;
40151b24e34SJan Kiszka 	__u32 reserved;
40251b24e34SJan Kiszka 	__u64 value;
40351b24e34SJan Kiszka };
40451b24e34SJan Kiszka 
40551b24e34SJan Kiszka struct kvm_xcrs {
40651b24e34SJan Kiszka 	__u32 nr_xcrs;
40751b24e34SJan Kiszka 	__u32 flags;
40851b24e34SJan Kiszka 	struct kvm_xcr xcrs[KVM_MAX_XCRS];
40951b24e34SJan Kiszka 	__u64 padding[16];
41051b24e34SJan Kiszka };
41151b24e34SJan Kiszka 
41265a6d8ddSPeter Maydell #define KVM_SYNC_X86_REGS      (1UL << 0)
41365a6d8ddSPeter Maydell #define KVM_SYNC_X86_SREGS     (1UL << 1)
41465a6d8ddSPeter Maydell #define KVM_SYNC_X86_EVENTS    (1UL << 2)
41565a6d8ddSPeter Maydell 
41665a6d8ddSPeter Maydell #define KVM_SYNC_X86_VALID_FIELDS \
41765a6d8ddSPeter Maydell 	(KVM_SYNC_X86_REGS| \
41865a6d8ddSPeter Maydell 	 KVM_SYNC_X86_SREGS| \
41965a6d8ddSPeter Maydell 	 KVM_SYNC_X86_EVENTS)
42065a6d8ddSPeter Maydell 
42165a6d8ddSPeter Maydell /* kvm_sync_regs struct included by kvm_run struct */
4221529ae1bSAlexander Graf struct kvm_sync_regs {
42365a6d8ddSPeter Maydell 	/* Members of this structure are potentially malicious.
42465a6d8ddSPeter Maydell 	 * Care must be taken by code reading, esp. interpreting,
42565a6d8ddSPeter Maydell 	 * data fields from them inside KVM to prevent TOCTOU and
42665a6d8ddSPeter Maydell 	 * double-fetch types of vulnerabilities.
42765a6d8ddSPeter Maydell 	 */
42865a6d8ddSPeter Maydell 	struct kvm_regs regs;
42965a6d8ddSPeter Maydell 	struct kvm_sregs sregs;
43065a6d8ddSPeter Maydell 	struct kvm_vcpu_events events;
4311529ae1bSAlexander Graf };
4321529ae1bSAlexander Graf 
433120758fbSPaolo Bonzini #define KVM_X86_QUIRK_LINT0_REENABLED		(1 << 0)
434120758fbSPaolo Bonzini #define KVM_X86_QUIRK_CD_NW_CLEARED		(1 << 1)
4358f3cd250SCornelia Huck #define KVM_X86_QUIRK_LAPIC_MMIO_HOLE		(1 << 2)
436d9cb4336SCornelia Huck #define KVM_X86_QUIRK_OUT_7E_INC_RIP		(1 << 3)
437f363d039SEric Auger #define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT	(1 << 4)
438d525f73fSChenyi Qiang #define KVM_X86_QUIRK_FIX_HYPERCALL_INSN	(1 << 5)
439d525f73fSChenyi Qiang #define KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS	(1 << 6)
440*0d2eeef7SBibo Mao #define KVM_X86_QUIRK_SLOT_ZAP_ALL		(1 << 7)
44124a31426SPaolo Bonzini 
4421d33bea4SLiran Alon #define KVM_STATE_NESTED_FORMAT_VMX	0
443f76b348eSCornelia Huck #define KVM_STATE_NESTED_FORMAT_SVM	1
4441d33bea4SLiran Alon 
445d36f7de8SCornelia Huck #define KVM_STATE_NESTED_GUEST_MODE	0x00000001
446d36f7de8SCornelia Huck #define KVM_STATE_NESTED_RUN_PENDING	0x00000002
447966f2ec3SPaolo Bonzini #define KVM_STATE_NESTED_EVMCS		0x00000004
448dc6f8d45SCornelia Huck #define KVM_STATE_NESTED_MTF_PENDING	0x00000008
449f76b348eSCornelia Huck #define KVM_STATE_NESTED_GIF_SET	0x00000100
450d36f7de8SCornelia Huck 
451d36f7de8SCornelia Huck #define KVM_STATE_NESTED_SMM_GUEST_MODE	0x00000001
452d36f7de8SCornelia Huck #define KVM_STATE_NESTED_SMM_VMXON	0x00000002
453d36f7de8SCornelia Huck 
454f363d039SEric Auger #define KVM_STATE_NESTED_VMX_VMCS_SIZE	0x1000
455f363d039SEric Auger 
456f76b348eSCornelia Huck #define KVM_STATE_NESTED_SVM_VMCB_SIZE	0x1000
457f76b348eSCornelia Huck 
458f76b348eSCornelia Huck #define KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE	0x00000001
459f76b348eSCornelia Huck 
460ab0c7fb2SPaolo Bonzini /* vendor-independent attributes for system fd (group 0) */
461ab0c7fb2SPaolo Bonzini #define KVM_X86_GRP_SYSTEM		0
4621ea5208fSPaolo Bonzini #  define KVM_X86_XCOMP_GUEST_SUPP	0
4631ea5208fSPaolo Bonzini 
464ab0c7fb2SPaolo Bonzini /* vendor-specific groups and attributes for system fd */
465ab0c7fb2SPaolo Bonzini #define KVM_X86_GRP_SEV			1
466ab0c7fb2SPaolo Bonzini #  define KVM_X86_SEV_VMSA_FEATURES	0
467ab0c7fb2SPaolo Bonzini 
4681d33bea4SLiran Alon struct kvm_vmx_nested_state_data {
4691d33bea4SLiran Alon 	__u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
4701d33bea4SLiran Alon 	__u8 shadow_vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
4711d33bea4SLiran Alon };
4721d33bea4SLiran Alon 
4731d33bea4SLiran Alon struct kvm_vmx_nested_state_hdr {
474d36f7de8SCornelia Huck 	__u64 vmxon_pa;
4751d33bea4SLiran Alon 	__u64 vmcs12_pa;
476d36f7de8SCornelia Huck 
477d36f7de8SCornelia Huck 	struct {
478d36f7de8SCornelia Huck 		__u16 flags;
479d36f7de8SCornelia Huck 	} smm;
48056908dc5SPaolo Bonzini 
481278f064eSEduardo Habkost 	__u16 pad;
482278f064eSEduardo Habkost 
48356908dc5SPaolo Bonzini 	__u32 flags;
48456908dc5SPaolo Bonzini 	__u64 preemption_timer_deadline;
485d36f7de8SCornelia Huck };
486d36f7de8SCornelia Huck 
487f76b348eSCornelia Huck struct kvm_svm_nested_state_data {
488f76b348eSCornelia Huck 	/* Save area only used if KVM_STATE_NESTED_RUN_PENDING.  */
489f76b348eSCornelia Huck 	__u8 vmcb12[KVM_STATE_NESTED_SVM_VMCB_SIZE];
490f76b348eSCornelia Huck };
491f76b348eSCornelia Huck 
492f76b348eSCornelia Huck struct kvm_svm_nested_state_hdr {
493f76b348eSCornelia Huck 	__u64 vmcb_pa;
494f76b348eSCornelia Huck };
495f76b348eSCornelia Huck 
496d36f7de8SCornelia Huck /* for KVM_CAP_NESTED_STATE */
497d36f7de8SCornelia Huck struct kvm_nested_state {
498d36f7de8SCornelia Huck 	__u16 flags;
499d36f7de8SCornelia Huck 	__u16 format;
500d36f7de8SCornelia Huck 	__u32 size;
501d36f7de8SCornelia Huck 
502d36f7de8SCornelia Huck 	union {
5031d33bea4SLiran Alon 		struct kvm_vmx_nested_state_hdr vmx;
504f76b348eSCornelia Huck 		struct kvm_svm_nested_state_hdr svm;
505d36f7de8SCornelia Huck 
506d36f7de8SCornelia Huck 		/* Pad the header to 128 bytes.  */
507d36f7de8SCornelia Huck 		__u8 pad[120];
5081d33bea4SLiran Alon 	} hdr;
509d36f7de8SCornelia Huck 
5101d33bea4SLiran Alon 	/*
5111d33bea4SLiran Alon 	 * Define data region as 0 bytes to preserve backwards-compatability
5121d33bea4SLiran Alon 	 * to old definition of kvm_nested_state in order to avoid changing
5131d33bea4SLiran Alon 	 * KVM_{GET,PUT}_NESTED_STATE ioctl values.
5141d33bea4SLiran Alon 	 */
5151d33bea4SLiran Alon 	union {
516c5c0fdbeSDavid 'Digit' Turner 		__DECLARE_FLEX_ARRAY(struct kvm_vmx_nested_state_data, vmx);
517c5c0fdbeSDavid 'Digit' Turner 		__DECLARE_FLEX_ARRAY(struct kvm_svm_nested_state_data, svm);
5181d33bea4SLiran Alon 	} data;
519d36f7de8SCornelia Huck };
520d36f7de8SCornelia Huck 
521f363d039SEric Auger /* for KVM_CAP_PMU_EVENT_FILTER */
522f363d039SEric Auger struct kvm_pmu_event_filter {
523f363d039SEric Auger 	__u32 action;
524f363d039SEric Auger 	__u32 nevents;
525f363d039SEric Auger 	__u32 fixed_counter_bitmap;
526f363d039SEric Auger 	__u32 flags;
527f363d039SEric Auger 	__u32 pad[4];
528d525f73fSChenyi Qiang 	__u64 events[];
529f363d039SEric Auger };
530f363d039SEric Auger 
531f363d039SEric Auger #define KVM_PMU_EVENT_ALLOW 0
532f363d039SEric Auger #define KVM_PMU_EVENT_DENY 1
533f363d039SEric Auger 
534ab0c7fb2SPaolo Bonzini #define KVM_PMU_EVENT_FLAG_MASKED_EVENTS _BITUL(0)
535c5c0fdbeSDavid 'Digit' Turner #define KVM_PMU_EVENT_FLAGS_VALID_MASK (KVM_PMU_EVENT_FLAG_MASKED_EVENTS)
536c5c0fdbeSDavid 'Digit' Turner 
537ab0c7fb2SPaolo Bonzini /* for KVM_CAP_MCE */
538ab0c7fb2SPaolo Bonzini struct kvm_x86_mce {
539ab0c7fb2SPaolo Bonzini 	__u64 status;
540ab0c7fb2SPaolo Bonzini 	__u64 addr;
541ab0c7fb2SPaolo Bonzini 	__u64 misc;
542ab0c7fb2SPaolo Bonzini 	__u64 mcg_status;
543ab0c7fb2SPaolo Bonzini 	__u8 bank;
544ab0c7fb2SPaolo Bonzini 	__u8 pad1[7];
545ab0c7fb2SPaolo Bonzini 	__u64 pad2[3];
546ab0c7fb2SPaolo Bonzini };
547ab0c7fb2SPaolo Bonzini 
548ab0c7fb2SPaolo Bonzini /* for KVM_CAP_XEN_HVM */
549ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_HYPERCALL_MSR	(1 << 0)
550ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL	(1 << 1)
551ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_SHARED_INFO		(1 << 2)
552ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_RUNSTATE		(1 << 3)
553ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_EVTCHN_2LEVEL	(1 << 4)
554ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_EVTCHN_SEND		(1 << 5)
555ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_RUNSTATE_UPDATE_FLAG	(1 << 6)
556ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_PVCLOCK_TSC_UNSTABLE	(1 << 7)
557ab0c7fb2SPaolo Bonzini #define KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA	(1 << 8)
558ab0c7fb2SPaolo Bonzini 
559ab0c7fb2SPaolo Bonzini struct kvm_xen_hvm_config {
560ab0c7fb2SPaolo Bonzini 	__u32 flags;
561ab0c7fb2SPaolo Bonzini 	__u32 msr;
562ab0c7fb2SPaolo Bonzini 	__u64 blob_addr_32;
563ab0c7fb2SPaolo Bonzini 	__u64 blob_addr_64;
564ab0c7fb2SPaolo Bonzini 	__u8 blob_size_32;
565ab0c7fb2SPaolo Bonzini 	__u8 blob_size_64;
566ab0c7fb2SPaolo Bonzini 	__u8 pad2[30];
567ab0c7fb2SPaolo Bonzini };
568ab0c7fb2SPaolo Bonzini 
569ab0c7fb2SPaolo Bonzini struct kvm_xen_hvm_attr {
570ab0c7fb2SPaolo Bonzini 	__u16 type;
571ab0c7fb2SPaolo Bonzini 	__u16 pad[3];
572ab0c7fb2SPaolo Bonzini 	union {
573ab0c7fb2SPaolo Bonzini 		__u8 long_mode;
574ab0c7fb2SPaolo Bonzini 		__u8 vector;
575ab0c7fb2SPaolo Bonzini 		__u8 runstate_update_flag;
576ab0c7fb2SPaolo Bonzini 		union {
577ab0c7fb2SPaolo Bonzini 			__u64 gfn;
578ab0c7fb2SPaolo Bonzini #define KVM_XEN_INVALID_GFN ((__u64)-1)
579ab0c7fb2SPaolo Bonzini 			__u64 hva;
580ab0c7fb2SPaolo Bonzini 		} shared_info;
581ab0c7fb2SPaolo Bonzini 		struct {
582ab0c7fb2SPaolo Bonzini 			__u32 send_port;
583ab0c7fb2SPaolo Bonzini 			__u32 type; /* EVTCHNSTAT_ipi / EVTCHNSTAT_interdomain */
584ab0c7fb2SPaolo Bonzini 			__u32 flags;
585ab0c7fb2SPaolo Bonzini #define KVM_XEN_EVTCHN_DEASSIGN		(1 << 0)
586ab0c7fb2SPaolo Bonzini #define KVM_XEN_EVTCHN_UPDATE		(1 << 1)
587ab0c7fb2SPaolo Bonzini #define KVM_XEN_EVTCHN_RESET		(1 << 2)
588ab0c7fb2SPaolo Bonzini 			/*
589ab0c7fb2SPaolo Bonzini 			 * Events sent by the guest are either looped back to
590ab0c7fb2SPaolo Bonzini 			 * the guest itself (potentially on a different port#)
591ab0c7fb2SPaolo Bonzini 			 * or signalled via an eventfd.
592ab0c7fb2SPaolo Bonzini 			 */
593ab0c7fb2SPaolo Bonzini 			union {
594ab0c7fb2SPaolo Bonzini 				struct {
595ab0c7fb2SPaolo Bonzini 					__u32 port;
596ab0c7fb2SPaolo Bonzini 					__u32 vcpu;
597ab0c7fb2SPaolo Bonzini 					__u32 priority;
598ab0c7fb2SPaolo Bonzini 				} port;
599ab0c7fb2SPaolo Bonzini 				struct {
600ab0c7fb2SPaolo Bonzini 					__u32 port; /* Zero for eventfd */
601ab0c7fb2SPaolo Bonzini 					__s32 fd;
602ab0c7fb2SPaolo Bonzini 				} eventfd;
603ab0c7fb2SPaolo Bonzini 				__u32 padding[4];
604ab0c7fb2SPaolo Bonzini 			} deliver;
605ab0c7fb2SPaolo Bonzini 		} evtchn;
606ab0c7fb2SPaolo Bonzini 		__u32 xen_version;
607ab0c7fb2SPaolo Bonzini 		__u64 pad[8];
608ab0c7fb2SPaolo Bonzini 	} u;
609ab0c7fb2SPaolo Bonzini };
610ab0c7fb2SPaolo Bonzini 
611ab0c7fb2SPaolo Bonzini 
612ab0c7fb2SPaolo Bonzini /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO */
613ab0c7fb2SPaolo Bonzini #define KVM_XEN_ATTR_TYPE_LONG_MODE		0x0
614ab0c7fb2SPaolo Bonzini #define KVM_XEN_ATTR_TYPE_SHARED_INFO		0x1
615ab0c7fb2SPaolo Bonzini #define KVM_XEN_ATTR_TYPE_UPCALL_VECTOR		0x2
616ab0c7fb2SPaolo Bonzini /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_EVTCHN_SEND */
617ab0c7fb2SPaolo Bonzini #define KVM_XEN_ATTR_TYPE_EVTCHN		0x3
618ab0c7fb2SPaolo Bonzini #define KVM_XEN_ATTR_TYPE_XEN_VERSION		0x4
619ab0c7fb2SPaolo Bonzini /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_RUNSTATE_UPDATE_FLAG */
620ab0c7fb2SPaolo Bonzini #define KVM_XEN_ATTR_TYPE_RUNSTATE_UPDATE_FLAG	0x5
621ab0c7fb2SPaolo Bonzini /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA */
622ab0c7fb2SPaolo Bonzini #define KVM_XEN_ATTR_TYPE_SHARED_INFO_HVA	0x6
623ab0c7fb2SPaolo Bonzini 
624ab0c7fb2SPaolo Bonzini struct kvm_xen_vcpu_attr {
625ab0c7fb2SPaolo Bonzini 	__u16 type;
626ab0c7fb2SPaolo Bonzini 	__u16 pad[3];
627ab0c7fb2SPaolo Bonzini 	union {
628ab0c7fb2SPaolo Bonzini 		__u64 gpa;
629ab0c7fb2SPaolo Bonzini #define KVM_XEN_INVALID_GPA ((__u64)-1)
630ab0c7fb2SPaolo Bonzini 		__u64 hva;
631ab0c7fb2SPaolo Bonzini 		__u64 pad[8];
632ab0c7fb2SPaolo Bonzini 		struct {
633ab0c7fb2SPaolo Bonzini 			__u64 state;
634ab0c7fb2SPaolo Bonzini 			__u64 state_entry_time;
635ab0c7fb2SPaolo Bonzini 			__u64 time_running;
636ab0c7fb2SPaolo Bonzini 			__u64 time_runnable;
637ab0c7fb2SPaolo Bonzini 			__u64 time_blocked;
638ab0c7fb2SPaolo Bonzini 			__u64 time_offline;
639ab0c7fb2SPaolo Bonzini 		} runstate;
640ab0c7fb2SPaolo Bonzini 		__u32 vcpu_id;
641ab0c7fb2SPaolo Bonzini 		struct {
642ab0c7fb2SPaolo Bonzini 			__u32 port;
643ab0c7fb2SPaolo Bonzini 			__u32 priority;
644ab0c7fb2SPaolo Bonzini 			__u64 expires_ns;
645ab0c7fb2SPaolo Bonzini 		} timer;
646ab0c7fb2SPaolo Bonzini 		__u8 vector;
647ab0c7fb2SPaolo Bonzini 	} u;
648ab0c7fb2SPaolo Bonzini };
649ab0c7fb2SPaolo Bonzini 
650ab0c7fb2SPaolo Bonzini /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO */
651ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO	0x0
652ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO	0x1
653ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR	0x2
654ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_CURRENT	0x3
655ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_DATA	0x4
656ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADJUST	0x5
657ab0c7fb2SPaolo Bonzini /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_EVTCHN_SEND */
658ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_VCPU_ID		0x6
659ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_TIMER		0x7
660ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_UPCALL_VECTOR	0x8
661ab0c7fb2SPaolo Bonzini /* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA */
662ab0c7fb2SPaolo Bonzini #define KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO_HVA	0x9
663ab0c7fb2SPaolo Bonzini 
664ab0c7fb2SPaolo Bonzini /* Secure Encrypted Virtualization command */
665ab0c7fb2SPaolo Bonzini enum sev_cmd_id {
666ab0c7fb2SPaolo Bonzini 	/* Guest initialization commands */
667ab0c7fb2SPaolo Bonzini 	KVM_SEV_INIT = 0,
668ab0c7fb2SPaolo Bonzini 	KVM_SEV_ES_INIT,
669ab0c7fb2SPaolo Bonzini 	/* Guest launch commands */
670ab0c7fb2SPaolo Bonzini 	KVM_SEV_LAUNCH_START,
671ab0c7fb2SPaolo Bonzini 	KVM_SEV_LAUNCH_UPDATE_DATA,
672ab0c7fb2SPaolo Bonzini 	KVM_SEV_LAUNCH_UPDATE_VMSA,
673ab0c7fb2SPaolo Bonzini 	KVM_SEV_LAUNCH_SECRET,
674ab0c7fb2SPaolo Bonzini 	KVM_SEV_LAUNCH_MEASURE,
675ab0c7fb2SPaolo Bonzini 	KVM_SEV_LAUNCH_FINISH,
676ab0c7fb2SPaolo Bonzini 	/* Guest migration commands (outgoing) */
677ab0c7fb2SPaolo Bonzini 	KVM_SEV_SEND_START,
678ab0c7fb2SPaolo Bonzini 	KVM_SEV_SEND_UPDATE_DATA,
679ab0c7fb2SPaolo Bonzini 	KVM_SEV_SEND_UPDATE_VMSA,
680ab0c7fb2SPaolo Bonzini 	KVM_SEV_SEND_FINISH,
681ab0c7fb2SPaolo Bonzini 	/* Guest migration commands (incoming) */
682ab0c7fb2SPaolo Bonzini 	KVM_SEV_RECEIVE_START,
683ab0c7fb2SPaolo Bonzini 	KVM_SEV_RECEIVE_UPDATE_DATA,
684ab0c7fb2SPaolo Bonzini 	KVM_SEV_RECEIVE_UPDATE_VMSA,
685ab0c7fb2SPaolo Bonzini 	KVM_SEV_RECEIVE_FINISH,
686ab0c7fb2SPaolo Bonzini 	/* Guest status and debug commands */
687ab0c7fb2SPaolo Bonzini 	KVM_SEV_GUEST_STATUS,
688ab0c7fb2SPaolo Bonzini 	KVM_SEV_DBG_DECRYPT,
689ab0c7fb2SPaolo Bonzini 	KVM_SEV_DBG_ENCRYPT,
690ab0c7fb2SPaolo Bonzini 	/* Guest certificates commands */
691ab0c7fb2SPaolo Bonzini 	KVM_SEV_CERT_EXPORT,
692ab0c7fb2SPaolo Bonzini 	/* Attestation report */
693ab0c7fb2SPaolo Bonzini 	KVM_SEV_GET_ATTESTATION_REPORT,
694ab0c7fb2SPaolo Bonzini 	/* Guest Migration Extension */
695ab0c7fb2SPaolo Bonzini 	KVM_SEV_SEND_CANCEL,
696ab0c7fb2SPaolo Bonzini 
697ab0c7fb2SPaolo Bonzini 	/* Second time is the charm; improved versions of the above ioctls.  */
698ab0c7fb2SPaolo Bonzini 	KVM_SEV_INIT2,
699ab0c7fb2SPaolo Bonzini 
7005f69e42dSPankaj Gupta 	/* SNP-specific commands */
7015f69e42dSPankaj Gupta 	KVM_SEV_SNP_LAUNCH_START = 100,
7025f69e42dSPankaj Gupta 	KVM_SEV_SNP_LAUNCH_UPDATE,
7035f69e42dSPankaj Gupta 	KVM_SEV_SNP_LAUNCH_FINISH,
7045f69e42dSPankaj Gupta 
705ab0c7fb2SPaolo Bonzini 	KVM_SEV_NR_MAX,
706ab0c7fb2SPaolo Bonzini };
707ab0c7fb2SPaolo Bonzini 
708ab0c7fb2SPaolo Bonzini struct kvm_sev_cmd {
709ab0c7fb2SPaolo Bonzini 	__u32 id;
710ab0c7fb2SPaolo Bonzini 	__u32 pad0;
711ab0c7fb2SPaolo Bonzini 	__u64 data;
712ab0c7fb2SPaolo Bonzini 	__u32 error;
713ab0c7fb2SPaolo Bonzini 	__u32 sev_fd;
714ab0c7fb2SPaolo Bonzini };
715ab0c7fb2SPaolo Bonzini 
716ab0c7fb2SPaolo Bonzini struct kvm_sev_init {
717ab0c7fb2SPaolo Bonzini 	__u64 vmsa_features;
718ab0c7fb2SPaolo Bonzini 	__u32 flags;
7195f69e42dSPankaj Gupta 	__u16 ghcb_version;
7205f69e42dSPankaj Gupta 	__u16 pad1;
7215f69e42dSPankaj Gupta 	__u32 pad2[8];
722ab0c7fb2SPaolo Bonzini };
723ab0c7fb2SPaolo Bonzini 
724ab0c7fb2SPaolo Bonzini struct kvm_sev_launch_start {
725ab0c7fb2SPaolo Bonzini 	__u32 handle;
726ab0c7fb2SPaolo Bonzini 	__u32 policy;
727ab0c7fb2SPaolo Bonzini 	__u64 dh_uaddr;
728ab0c7fb2SPaolo Bonzini 	__u32 dh_len;
729ab0c7fb2SPaolo Bonzini 	__u32 pad0;
730ab0c7fb2SPaolo Bonzini 	__u64 session_uaddr;
731ab0c7fb2SPaolo Bonzini 	__u32 session_len;
732ab0c7fb2SPaolo Bonzini 	__u32 pad1;
733ab0c7fb2SPaolo Bonzini };
734ab0c7fb2SPaolo Bonzini 
735ab0c7fb2SPaolo Bonzini struct kvm_sev_launch_update_data {
736ab0c7fb2SPaolo Bonzini 	__u64 uaddr;
737ab0c7fb2SPaolo Bonzini 	__u32 len;
738ab0c7fb2SPaolo Bonzini 	__u32 pad0;
739ab0c7fb2SPaolo Bonzini };
740ab0c7fb2SPaolo Bonzini 
741ab0c7fb2SPaolo Bonzini 
742ab0c7fb2SPaolo Bonzini struct kvm_sev_launch_secret {
743ab0c7fb2SPaolo Bonzini 	__u64 hdr_uaddr;
744ab0c7fb2SPaolo Bonzini 	__u32 hdr_len;
745ab0c7fb2SPaolo Bonzini 	__u32 pad0;
746ab0c7fb2SPaolo Bonzini 	__u64 guest_uaddr;
747ab0c7fb2SPaolo Bonzini 	__u32 guest_len;
748ab0c7fb2SPaolo Bonzini 	__u32 pad1;
749ab0c7fb2SPaolo Bonzini 	__u64 trans_uaddr;
750ab0c7fb2SPaolo Bonzini 	__u32 trans_len;
751ab0c7fb2SPaolo Bonzini 	__u32 pad2;
752ab0c7fb2SPaolo Bonzini };
753ab0c7fb2SPaolo Bonzini 
754ab0c7fb2SPaolo Bonzini struct kvm_sev_launch_measure {
755ab0c7fb2SPaolo Bonzini 	__u64 uaddr;
756ab0c7fb2SPaolo Bonzini 	__u32 len;
757ab0c7fb2SPaolo Bonzini 	__u32 pad0;
758ab0c7fb2SPaolo Bonzini };
759ab0c7fb2SPaolo Bonzini 
760ab0c7fb2SPaolo Bonzini struct kvm_sev_guest_status {
761ab0c7fb2SPaolo Bonzini 	__u32 handle;
762ab0c7fb2SPaolo Bonzini 	__u32 policy;
763ab0c7fb2SPaolo Bonzini 	__u32 state;
764ab0c7fb2SPaolo Bonzini };
765ab0c7fb2SPaolo Bonzini 
766ab0c7fb2SPaolo Bonzini struct kvm_sev_dbg {
767ab0c7fb2SPaolo Bonzini 	__u64 src_uaddr;
768ab0c7fb2SPaolo Bonzini 	__u64 dst_uaddr;
769ab0c7fb2SPaolo Bonzini 	__u32 len;
770ab0c7fb2SPaolo Bonzini 	__u32 pad0;
771ab0c7fb2SPaolo Bonzini };
772ab0c7fb2SPaolo Bonzini 
773ab0c7fb2SPaolo Bonzini struct kvm_sev_attestation_report {
774ab0c7fb2SPaolo Bonzini 	__u8 mnonce[16];
775ab0c7fb2SPaolo Bonzini 	__u64 uaddr;
776ab0c7fb2SPaolo Bonzini 	__u32 len;
777ab0c7fb2SPaolo Bonzini 	__u32 pad0;
778ab0c7fb2SPaolo Bonzini };
779ab0c7fb2SPaolo Bonzini 
780ab0c7fb2SPaolo Bonzini struct kvm_sev_send_start {
781ab0c7fb2SPaolo Bonzini 	__u32 policy;
782ab0c7fb2SPaolo Bonzini 	__u32 pad0;
783ab0c7fb2SPaolo Bonzini 	__u64 pdh_cert_uaddr;
784ab0c7fb2SPaolo Bonzini 	__u32 pdh_cert_len;
785ab0c7fb2SPaolo Bonzini 	__u32 pad1;
786ab0c7fb2SPaolo Bonzini 	__u64 plat_certs_uaddr;
787ab0c7fb2SPaolo Bonzini 	__u32 plat_certs_len;
788ab0c7fb2SPaolo Bonzini 	__u32 pad2;
789ab0c7fb2SPaolo Bonzini 	__u64 amd_certs_uaddr;
790ab0c7fb2SPaolo Bonzini 	__u32 amd_certs_len;
791ab0c7fb2SPaolo Bonzini 	__u32 pad3;
792ab0c7fb2SPaolo Bonzini 	__u64 session_uaddr;
793ab0c7fb2SPaolo Bonzini 	__u32 session_len;
794ab0c7fb2SPaolo Bonzini 	__u32 pad4;
795ab0c7fb2SPaolo Bonzini };
796ab0c7fb2SPaolo Bonzini 
797ab0c7fb2SPaolo Bonzini struct kvm_sev_send_update_data {
798ab0c7fb2SPaolo Bonzini 	__u64 hdr_uaddr;
799ab0c7fb2SPaolo Bonzini 	__u32 hdr_len;
800ab0c7fb2SPaolo Bonzini 	__u32 pad0;
801ab0c7fb2SPaolo Bonzini 	__u64 guest_uaddr;
802ab0c7fb2SPaolo Bonzini 	__u32 guest_len;
803ab0c7fb2SPaolo Bonzini 	__u32 pad1;
804ab0c7fb2SPaolo Bonzini 	__u64 trans_uaddr;
805ab0c7fb2SPaolo Bonzini 	__u32 trans_len;
806ab0c7fb2SPaolo Bonzini 	__u32 pad2;
807ab0c7fb2SPaolo Bonzini };
808ab0c7fb2SPaolo Bonzini 
809ab0c7fb2SPaolo Bonzini struct kvm_sev_receive_start {
810ab0c7fb2SPaolo Bonzini 	__u32 handle;
811ab0c7fb2SPaolo Bonzini 	__u32 policy;
812ab0c7fb2SPaolo Bonzini 	__u64 pdh_uaddr;
813ab0c7fb2SPaolo Bonzini 	__u32 pdh_len;
814ab0c7fb2SPaolo Bonzini 	__u32 pad0;
815ab0c7fb2SPaolo Bonzini 	__u64 session_uaddr;
816ab0c7fb2SPaolo Bonzini 	__u32 session_len;
817ab0c7fb2SPaolo Bonzini 	__u32 pad1;
818ab0c7fb2SPaolo Bonzini };
819ab0c7fb2SPaolo Bonzini 
820ab0c7fb2SPaolo Bonzini struct kvm_sev_receive_update_data {
821ab0c7fb2SPaolo Bonzini 	__u64 hdr_uaddr;
822ab0c7fb2SPaolo Bonzini 	__u32 hdr_len;
823ab0c7fb2SPaolo Bonzini 	__u32 pad0;
824ab0c7fb2SPaolo Bonzini 	__u64 guest_uaddr;
825ab0c7fb2SPaolo Bonzini 	__u32 guest_len;
826ab0c7fb2SPaolo Bonzini 	__u32 pad1;
827ab0c7fb2SPaolo Bonzini 	__u64 trans_uaddr;
828ab0c7fb2SPaolo Bonzini 	__u32 trans_len;
829ab0c7fb2SPaolo Bonzini 	__u32 pad2;
830ab0c7fb2SPaolo Bonzini };
831ab0c7fb2SPaolo Bonzini 
8325f69e42dSPankaj Gupta struct kvm_sev_snp_launch_start {
8335f69e42dSPankaj Gupta 	__u64 policy;
8345f69e42dSPankaj Gupta 	__u8 gosvw[16];
8355f69e42dSPankaj Gupta 	__u16 flags;
8365f69e42dSPankaj Gupta 	__u8 pad0[6];
8375f69e42dSPankaj Gupta 	__u64 pad1[4];
8385f69e42dSPankaj Gupta };
8395f69e42dSPankaj Gupta 
8405f69e42dSPankaj Gupta /* Kept in sync with firmware values for simplicity. */
8415f69e42dSPankaj Gupta #define KVM_SEV_SNP_PAGE_TYPE_NORMAL		0x1
8425f69e42dSPankaj Gupta #define KVM_SEV_SNP_PAGE_TYPE_ZERO		0x3
8435f69e42dSPankaj Gupta #define KVM_SEV_SNP_PAGE_TYPE_UNMEASURED	0x4
8445f69e42dSPankaj Gupta #define KVM_SEV_SNP_PAGE_TYPE_SECRETS		0x5
8455f69e42dSPankaj Gupta #define KVM_SEV_SNP_PAGE_TYPE_CPUID		0x6
8465f69e42dSPankaj Gupta 
8475f69e42dSPankaj Gupta struct kvm_sev_snp_launch_update {
8485f69e42dSPankaj Gupta 	__u64 gfn_start;
8495f69e42dSPankaj Gupta 	__u64 uaddr;
8505f69e42dSPankaj Gupta 	__u64 len;
8515f69e42dSPankaj Gupta 	__u8 type;
8525f69e42dSPankaj Gupta 	__u8 pad0;
8535f69e42dSPankaj Gupta 	__u16 flags;
8545f69e42dSPankaj Gupta 	__u32 pad1;
8555f69e42dSPankaj Gupta 	__u64 pad2[4];
8565f69e42dSPankaj Gupta };
8575f69e42dSPankaj Gupta 
8585f69e42dSPankaj Gupta #define KVM_SEV_SNP_ID_BLOCK_SIZE	96
8595f69e42dSPankaj Gupta #define KVM_SEV_SNP_ID_AUTH_SIZE	4096
8605f69e42dSPankaj Gupta #define KVM_SEV_SNP_FINISH_DATA_SIZE	32
8615f69e42dSPankaj Gupta 
8625f69e42dSPankaj Gupta struct kvm_sev_snp_launch_finish {
8635f69e42dSPankaj Gupta 	__u64 id_block_uaddr;
8645f69e42dSPankaj Gupta 	__u64 id_auth_uaddr;
8655f69e42dSPankaj Gupta 	__u8 id_block_en;
8665f69e42dSPankaj Gupta 	__u8 auth_key_en;
8675f69e42dSPankaj Gupta 	__u8 vcek_disabled;
8685f69e42dSPankaj Gupta 	__u8 host_data[KVM_SEV_SNP_FINISH_DATA_SIZE];
8695f69e42dSPankaj Gupta 	__u8 pad0[3];
8705f69e42dSPankaj Gupta 	__u16 flags;
8715f69e42dSPankaj Gupta 	__u64 pad1[4];
8725f69e42dSPankaj Gupta };
8735f69e42dSPankaj Gupta 
874ab0c7fb2SPaolo Bonzini #define KVM_X2APIC_API_USE_32BIT_IDS            (1ULL << 0)
875ab0c7fb2SPaolo Bonzini #define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK  (1ULL << 1)
876ab0c7fb2SPaolo Bonzini 
877ab0c7fb2SPaolo Bonzini struct kvm_hyperv_eventfd {
878ab0c7fb2SPaolo Bonzini 	__u32 conn_id;
879ab0c7fb2SPaolo Bonzini 	__s32 fd;
880ab0c7fb2SPaolo Bonzini 	__u32 flags;
881ab0c7fb2SPaolo Bonzini 	__u32 padding[3];
882ab0c7fb2SPaolo Bonzini };
883ab0c7fb2SPaolo Bonzini 
884ab0c7fb2SPaolo Bonzini #define KVM_HYPERV_CONN_ID_MASK		0x00ffffff
885ab0c7fb2SPaolo Bonzini #define KVM_HYPERV_EVENTFD_DEASSIGN	(1 << 0)
886ab0c7fb2SPaolo Bonzini 
887c5c0fdbeSDavid 'Digit' Turner /*
888c5c0fdbeSDavid 'Digit' Turner  * Masked event layout.
889c5c0fdbeSDavid 'Digit' Turner  * Bits   Description
890c5c0fdbeSDavid 'Digit' Turner  * ----   -----------
891c5c0fdbeSDavid 'Digit' Turner  * 7:0    event select (low bits)
892c5c0fdbeSDavid 'Digit' Turner  * 15:8   umask match
893c5c0fdbeSDavid 'Digit' Turner  * 31:16  unused
894c5c0fdbeSDavid 'Digit' Turner  * 35:32  event select (high bits)
895c5c0fdbeSDavid 'Digit' Turner  * 36:54  unused
896c5c0fdbeSDavid 'Digit' Turner  * 55     exclude bit
897c5c0fdbeSDavid 'Digit' Turner  * 63:56  umask mask
898c5c0fdbeSDavid 'Digit' Turner  */
899c5c0fdbeSDavid 'Digit' Turner 
900c5c0fdbeSDavid 'Digit' Turner #define KVM_PMU_ENCODE_MASKED_ENTRY(event_select, mask, match, exclude) \
901c5c0fdbeSDavid 'Digit' Turner 	(((event_select) & 0xFFULL) | (((event_select) & 0XF00ULL) << 24) | \
902c5c0fdbeSDavid 'Digit' Turner 	(((mask) & 0xFFULL) << 56) | \
903c5c0fdbeSDavid 'Digit' Turner 	(((match) & 0xFFULL) << 8) | \
904c5c0fdbeSDavid 'Digit' Turner 	((__u64)(!!(exclude)) << 55))
905c5c0fdbeSDavid 'Digit' Turner 
906c5c0fdbeSDavid 'Digit' Turner #define KVM_PMU_MASKED_ENTRY_EVENT_SELECT \
907ab0c7fb2SPaolo Bonzini 	(__GENMASK_ULL(7, 0) | __GENMASK_ULL(35, 32))
908ab0c7fb2SPaolo Bonzini #define KVM_PMU_MASKED_ENTRY_UMASK_MASK		(__GENMASK_ULL(63, 56))
909ab0c7fb2SPaolo Bonzini #define KVM_PMU_MASKED_ENTRY_UMASK_MATCH	(__GENMASK_ULL(15, 8))
910ab0c7fb2SPaolo Bonzini #define KVM_PMU_MASKED_ENTRY_EXCLUDE		(_BITULL(55))
911c5c0fdbeSDavid 'Digit' Turner #define KVM_PMU_MASKED_ENTRY_UMASK_MASK_SHIFT	(56)
912c5c0fdbeSDavid 'Digit' Turner 
91343709a0cSPaolo Bonzini /* for KVM_{GET,SET,HAS}_DEVICE_ATTR */
91443709a0cSPaolo Bonzini #define KVM_VCPU_TSC_CTRL 0 /* control group for the timestamp counter (TSC) */
91543709a0cSPaolo Bonzini #define   KVM_VCPU_TSC_OFFSET 0 /* attribute for the TSC offset */
91643709a0cSPaolo Bonzini 
917d0bf492fSCédric Le Goater /* x86-specific KVM_EXIT_HYPERCALL flags. */
918ab0c7fb2SPaolo Bonzini #define KVM_EXIT_HYPERCALL_LONG_MODE	_BITULL(0)
919d0bf492fSCédric Le Goater 
9206a02465fSDaniel Henrique Barboza #define KVM_X86_DEFAULT_VM	0
9216a02465fSDaniel Henrique Barboza #define KVM_X86_SW_PROTECTED_VM	1
922ab0c7fb2SPaolo Bonzini #define KVM_X86_SEV_VM		2
923ab0c7fb2SPaolo Bonzini #define KVM_X86_SEV_ES_VM	3
9245f69e42dSPankaj Gupta #define KVM_X86_SNP_VM		4
9256a02465fSDaniel Henrique Barboza 
92651b24e34SJan Kiszka #endif /* _ASM_X86_KVM_H */
927