18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
28c2ecf20Sopenharmony_ci#ifndef _ASM_X86_KVM_H
38c2ecf20Sopenharmony_ci#define _ASM_X86_KVM_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci/*
68c2ecf20Sopenharmony_ci * KVM x86 specific structures and definitions
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/types.h>
118c2ecf20Sopenharmony_ci#include <linux/ioctl.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#define KVM_PIO_PAGE_OFFSET 1
148c2ecf20Sopenharmony_ci#define KVM_COALESCED_MMIO_PAGE_OFFSET 2
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#define DE_VECTOR 0
178c2ecf20Sopenharmony_ci#define DB_VECTOR 1
188c2ecf20Sopenharmony_ci#define BP_VECTOR 3
198c2ecf20Sopenharmony_ci#define OF_VECTOR 4
208c2ecf20Sopenharmony_ci#define BR_VECTOR 5
218c2ecf20Sopenharmony_ci#define UD_VECTOR 6
228c2ecf20Sopenharmony_ci#define NM_VECTOR 7
238c2ecf20Sopenharmony_ci#define DF_VECTOR 8
248c2ecf20Sopenharmony_ci#define TS_VECTOR 10
258c2ecf20Sopenharmony_ci#define NP_VECTOR 11
268c2ecf20Sopenharmony_ci#define SS_VECTOR 12
278c2ecf20Sopenharmony_ci#define GP_VECTOR 13
288c2ecf20Sopenharmony_ci#define PF_VECTOR 14
298c2ecf20Sopenharmony_ci#define MF_VECTOR 16
308c2ecf20Sopenharmony_ci#define AC_VECTOR 17
318c2ecf20Sopenharmony_ci#define MC_VECTOR 18
328c2ecf20Sopenharmony_ci#define XM_VECTOR 19
338c2ecf20Sopenharmony_ci#define VE_VECTOR 20
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci/* Select x86 specific features in <linux/kvm.h> */
368c2ecf20Sopenharmony_ci#define __KVM_HAVE_PIT
378c2ecf20Sopenharmony_ci#define __KVM_HAVE_IOAPIC
388c2ecf20Sopenharmony_ci#define __KVM_HAVE_IRQ_LINE
398c2ecf20Sopenharmony_ci#define __KVM_HAVE_MSI
408c2ecf20Sopenharmony_ci#define __KVM_HAVE_USER_NMI
418c2ecf20Sopenharmony_ci#define __KVM_HAVE_GUEST_DEBUG
428c2ecf20Sopenharmony_ci#define __KVM_HAVE_MSIX
438c2ecf20Sopenharmony_ci#define __KVM_HAVE_MCE
448c2ecf20Sopenharmony_ci#define __KVM_HAVE_PIT_STATE2
458c2ecf20Sopenharmony_ci#define __KVM_HAVE_XEN_HVM
468c2ecf20Sopenharmony_ci#define __KVM_HAVE_VCPU_EVENTS
478c2ecf20Sopenharmony_ci#define __KVM_HAVE_DEBUGREGS
488c2ecf20Sopenharmony_ci#define __KVM_HAVE_XSAVE
498c2ecf20Sopenharmony_ci#define __KVM_HAVE_XCRS
508c2ecf20Sopenharmony_ci#define __KVM_HAVE_READONLY_MEM
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci/* Architectural interrupt line count. */
538c2ecf20Sopenharmony_ci#define KVM_NR_INTERRUPTS 256
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistruct kvm_memory_alias {
568c2ecf20Sopenharmony_ci	__u32 slot;  /* this has a different namespace than memory slots */
578c2ecf20Sopenharmony_ci	__u32 flags;
588c2ecf20Sopenharmony_ci	__u64 guest_phys_addr;
598c2ecf20Sopenharmony_ci	__u64 memory_size;
608c2ecf20Sopenharmony_ci	__u64 target_phys_addr;
618c2ecf20Sopenharmony_ci};
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */
648c2ecf20Sopenharmony_cistruct kvm_pic_state {
658c2ecf20Sopenharmony_ci	__u8 last_irr;	/* edge detection */
668c2ecf20Sopenharmony_ci	__u8 irr;		/* interrupt request register */
678c2ecf20Sopenharmony_ci	__u8 imr;		/* interrupt mask register */
688c2ecf20Sopenharmony_ci	__u8 isr;		/* interrupt service register */
698c2ecf20Sopenharmony_ci	__u8 priority_add;	/* highest irq priority */
708c2ecf20Sopenharmony_ci	__u8 irq_base;
718c2ecf20Sopenharmony_ci	__u8 read_reg_select;
728c2ecf20Sopenharmony_ci	__u8 poll;
738c2ecf20Sopenharmony_ci	__u8 special_mask;
748c2ecf20Sopenharmony_ci	__u8 init_state;
758c2ecf20Sopenharmony_ci	__u8 auto_eoi;
768c2ecf20Sopenharmony_ci	__u8 rotate_on_auto_eoi;
778c2ecf20Sopenharmony_ci	__u8 special_fully_nested_mode;
788c2ecf20Sopenharmony_ci	__u8 init4;		/* true if 4 byte init */
798c2ecf20Sopenharmony_ci	__u8 elcr;		/* PIIX edge/trigger selection */
808c2ecf20Sopenharmony_ci	__u8 elcr_mask;
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci#define KVM_IOAPIC_NUM_PINS  24
848c2ecf20Sopenharmony_cistruct kvm_ioapic_state {
858c2ecf20Sopenharmony_ci	__u64 base_address;
868c2ecf20Sopenharmony_ci	__u32 ioregsel;
878c2ecf20Sopenharmony_ci	__u32 id;
888c2ecf20Sopenharmony_ci	__u32 irr;
898c2ecf20Sopenharmony_ci	__u32 pad;
908c2ecf20Sopenharmony_ci	union {
918c2ecf20Sopenharmony_ci		__u64 bits;
928c2ecf20Sopenharmony_ci		struct {
938c2ecf20Sopenharmony_ci			__u8 vector;
948c2ecf20Sopenharmony_ci			__u8 delivery_mode:3;
958c2ecf20Sopenharmony_ci			__u8 dest_mode:1;
968c2ecf20Sopenharmony_ci			__u8 delivery_status:1;
978c2ecf20Sopenharmony_ci			__u8 polarity:1;
988c2ecf20Sopenharmony_ci			__u8 remote_irr:1;
998c2ecf20Sopenharmony_ci			__u8 trig_mode:1;
1008c2ecf20Sopenharmony_ci			__u8 mask:1;
1018c2ecf20Sopenharmony_ci			__u8 reserve:7;
1028c2ecf20Sopenharmony_ci			__u8 reserved[4];
1038c2ecf20Sopenharmony_ci			__u8 dest_id;
1048c2ecf20Sopenharmony_ci		} fields;
1058c2ecf20Sopenharmony_ci	} redirtbl[KVM_IOAPIC_NUM_PINS];
1068c2ecf20Sopenharmony_ci};
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci#define KVM_IRQCHIP_PIC_MASTER   0
1098c2ecf20Sopenharmony_ci#define KVM_IRQCHIP_PIC_SLAVE    1
1108c2ecf20Sopenharmony_ci#define KVM_IRQCHIP_IOAPIC       2
1118c2ecf20Sopenharmony_ci#define KVM_NR_IRQCHIPS          3
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci#define KVM_RUN_X86_SMM		 (1 << 0)
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci/* for KVM_GET_REGS and KVM_SET_REGS */
1168c2ecf20Sopenharmony_cistruct kvm_regs {
1178c2ecf20Sopenharmony_ci	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
1188c2ecf20Sopenharmony_ci	__u64 rax, rbx, rcx, rdx;
1198c2ecf20Sopenharmony_ci	__u64 rsi, rdi, rsp, rbp;
1208c2ecf20Sopenharmony_ci	__u64 r8,  r9,  r10, r11;
1218c2ecf20Sopenharmony_ci	__u64 r12, r13, r14, r15;
1228c2ecf20Sopenharmony_ci	__u64 rip, rflags;
1238c2ecf20Sopenharmony_ci};
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci/* for KVM_GET_LAPIC and KVM_SET_LAPIC */
1268c2ecf20Sopenharmony_ci#define KVM_APIC_REG_SIZE 0x400
1278c2ecf20Sopenharmony_cistruct kvm_lapic_state {
1288c2ecf20Sopenharmony_ci	char regs[KVM_APIC_REG_SIZE];
1298c2ecf20Sopenharmony_ci};
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_cistruct kvm_segment {
1328c2ecf20Sopenharmony_ci	__u64 base;
1338c2ecf20Sopenharmony_ci	__u32 limit;
1348c2ecf20Sopenharmony_ci	__u16 selector;
1358c2ecf20Sopenharmony_ci	__u8  type;
1368c2ecf20Sopenharmony_ci	__u8  present, dpl, db, s, l, g, avl;
1378c2ecf20Sopenharmony_ci	__u8  unusable;
1388c2ecf20Sopenharmony_ci	__u8  padding;
1398c2ecf20Sopenharmony_ci};
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_cistruct kvm_dtable {
1428c2ecf20Sopenharmony_ci	__u64 base;
1438c2ecf20Sopenharmony_ci	__u16 limit;
1448c2ecf20Sopenharmony_ci	__u16 padding[3];
1458c2ecf20Sopenharmony_ci};
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_ci/* for KVM_GET_SREGS and KVM_SET_SREGS */
1498c2ecf20Sopenharmony_cistruct kvm_sregs {
1508c2ecf20Sopenharmony_ci	/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */
1518c2ecf20Sopenharmony_ci	struct kvm_segment cs, ds, es, fs, gs, ss;
1528c2ecf20Sopenharmony_ci	struct kvm_segment tr, ldt;
1538c2ecf20Sopenharmony_ci	struct kvm_dtable gdt, idt;
1548c2ecf20Sopenharmony_ci	__u64 cr0, cr2, cr3, cr4, cr8;
1558c2ecf20Sopenharmony_ci	__u64 efer;
1568c2ecf20Sopenharmony_ci	__u64 apic_base;
1578c2ecf20Sopenharmony_ci	__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
1588c2ecf20Sopenharmony_ci};
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci/* for KVM_GET_FPU and KVM_SET_FPU */
1618c2ecf20Sopenharmony_cistruct kvm_fpu {
1628c2ecf20Sopenharmony_ci	__u8  fpr[8][16];
1638c2ecf20Sopenharmony_ci	__u16 fcw;
1648c2ecf20Sopenharmony_ci	__u16 fsw;
1658c2ecf20Sopenharmony_ci	__u8  ftwx;  /* in fxsave format */
1668c2ecf20Sopenharmony_ci	__u8  pad1;
1678c2ecf20Sopenharmony_ci	__u16 last_opcode;
1688c2ecf20Sopenharmony_ci	__u64 last_ip;
1698c2ecf20Sopenharmony_ci	__u64 last_dp;
1708c2ecf20Sopenharmony_ci	__u8  xmm[16][16];
1718c2ecf20Sopenharmony_ci	__u32 mxcsr;
1728c2ecf20Sopenharmony_ci	__u32 pad2;
1738c2ecf20Sopenharmony_ci};
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_cistruct kvm_msr_entry {
1768c2ecf20Sopenharmony_ci	__u32 index;
1778c2ecf20Sopenharmony_ci	__u32 reserved;
1788c2ecf20Sopenharmony_ci	__u64 data;
1798c2ecf20Sopenharmony_ci};
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci/* for KVM_GET_MSRS and KVM_SET_MSRS */
1828c2ecf20Sopenharmony_cistruct kvm_msrs {
1838c2ecf20Sopenharmony_ci	__u32 nmsrs; /* number of msrs in entries */
1848c2ecf20Sopenharmony_ci	__u32 pad;
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	struct kvm_msr_entry entries[0];
1878c2ecf20Sopenharmony_ci};
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci/* for KVM_GET_MSR_INDEX_LIST */
1908c2ecf20Sopenharmony_cistruct kvm_msr_list {
1918c2ecf20Sopenharmony_ci	__u32 nmsrs; /* number of msrs in entries */
1928c2ecf20Sopenharmony_ci	__u32 indices[0];
1938c2ecf20Sopenharmony_ci};
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci/* Maximum size of any access bitmap in bytes */
1968c2ecf20Sopenharmony_ci#define KVM_MSR_FILTER_MAX_BITMAP_SIZE 0x600
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci/* for KVM_X86_SET_MSR_FILTER */
1998c2ecf20Sopenharmony_cistruct kvm_msr_filter_range {
2008c2ecf20Sopenharmony_ci#define KVM_MSR_FILTER_READ  (1 << 0)
2018c2ecf20Sopenharmony_ci#define KVM_MSR_FILTER_WRITE (1 << 1)
2028c2ecf20Sopenharmony_ci	__u32 flags;
2038c2ecf20Sopenharmony_ci	__u32 nmsrs; /* number of msrs in bitmap */
2048c2ecf20Sopenharmony_ci	__u32 base;  /* MSR index the bitmap starts at */
2058c2ecf20Sopenharmony_ci	__u8 *bitmap; /* a 1 bit allows the operations in flags, 0 denies */
2068c2ecf20Sopenharmony_ci};
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci#define KVM_MSR_FILTER_MAX_RANGES 16
2098c2ecf20Sopenharmony_cistruct kvm_msr_filter {
2108c2ecf20Sopenharmony_ci#define KVM_MSR_FILTER_DEFAULT_ALLOW (0 << 0)
2118c2ecf20Sopenharmony_ci#define KVM_MSR_FILTER_DEFAULT_DENY  (1 << 0)
2128c2ecf20Sopenharmony_ci	__u32 flags;
2138c2ecf20Sopenharmony_ci	struct kvm_msr_filter_range ranges[KVM_MSR_FILTER_MAX_RANGES];
2148c2ecf20Sopenharmony_ci};
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_cistruct kvm_cpuid_entry {
2178c2ecf20Sopenharmony_ci	__u32 function;
2188c2ecf20Sopenharmony_ci	__u32 eax;
2198c2ecf20Sopenharmony_ci	__u32 ebx;
2208c2ecf20Sopenharmony_ci	__u32 ecx;
2218c2ecf20Sopenharmony_ci	__u32 edx;
2228c2ecf20Sopenharmony_ci	__u32 padding;
2238c2ecf20Sopenharmony_ci};
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci/* for KVM_SET_CPUID */
2268c2ecf20Sopenharmony_cistruct kvm_cpuid {
2278c2ecf20Sopenharmony_ci	__u32 nent;
2288c2ecf20Sopenharmony_ci	__u32 padding;
2298c2ecf20Sopenharmony_ci	struct kvm_cpuid_entry entries[0];
2308c2ecf20Sopenharmony_ci};
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_cistruct kvm_cpuid_entry2 {
2338c2ecf20Sopenharmony_ci	__u32 function;
2348c2ecf20Sopenharmony_ci	__u32 index;
2358c2ecf20Sopenharmony_ci	__u32 flags;
2368c2ecf20Sopenharmony_ci	__u32 eax;
2378c2ecf20Sopenharmony_ci	__u32 ebx;
2388c2ecf20Sopenharmony_ci	__u32 ecx;
2398c2ecf20Sopenharmony_ci	__u32 edx;
2408c2ecf20Sopenharmony_ci	__u32 padding[3];
2418c2ecf20Sopenharmony_ci};
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX		(1 << 0)
2448c2ecf20Sopenharmony_ci#define KVM_CPUID_FLAG_STATEFUL_FUNC		(1 << 1)
2458c2ecf20Sopenharmony_ci#define KVM_CPUID_FLAG_STATE_READ_NEXT		(1 << 2)
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci/* for KVM_SET_CPUID2 */
2488c2ecf20Sopenharmony_cistruct kvm_cpuid2 {
2498c2ecf20Sopenharmony_ci	__u32 nent;
2508c2ecf20Sopenharmony_ci	__u32 padding;
2518c2ecf20Sopenharmony_ci	struct kvm_cpuid_entry2 entries[0];
2528c2ecf20Sopenharmony_ci};
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci/* for KVM_GET_PIT and KVM_SET_PIT */
2558c2ecf20Sopenharmony_cistruct kvm_pit_channel_state {
2568c2ecf20Sopenharmony_ci	__u32 count; /* can be 65536 */
2578c2ecf20Sopenharmony_ci	__u16 latched_count;
2588c2ecf20Sopenharmony_ci	__u8 count_latched;
2598c2ecf20Sopenharmony_ci	__u8 status_latched;
2608c2ecf20Sopenharmony_ci	__u8 status;
2618c2ecf20Sopenharmony_ci	__u8 read_state;
2628c2ecf20Sopenharmony_ci	__u8 write_state;
2638c2ecf20Sopenharmony_ci	__u8 write_latch;
2648c2ecf20Sopenharmony_ci	__u8 rw_mode;
2658c2ecf20Sopenharmony_ci	__u8 mode;
2668c2ecf20Sopenharmony_ci	__u8 bcd;
2678c2ecf20Sopenharmony_ci	__u8 gate;
2688c2ecf20Sopenharmony_ci	__s64 count_load_time;
2698c2ecf20Sopenharmony_ci};
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_cistruct kvm_debug_exit_arch {
2728c2ecf20Sopenharmony_ci	__u32 exception;
2738c2ecf20Sopenharmony_ci	__u32 pad;
2748c2ecf20Sopenharmony_ci	__u64 pc;
2758c2ecf20Sopenharmony_ci	__u64 dr6;
2768c2ecf20Sopenharmony_ci	__u64 dr7;
2778c2ecf20Sopenharmony_ci};
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci#define KVM_GUESTDBG_USE_SW_BP		0x00010000
2808c2ecf20Sopenharmony_ci#define KVM_GUESTDBG_USE_HW_BP		0x00020000
2818c2ecf20Sopenharmony_ci#define KVM_GUESTDBG_INJECT_DB		0x00040000
2828c2ecf20Sopenharmony_ci#define KVM_GUESTDBG_INJECT_BP		0x00080000
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ci/* for KVM_SET_GUEST_DEBUG */
2858c2ecf20Sopenharmony_cistruct kvm_guest_debug_arch {
2868c2ecf20Sopenharmony_ci	__u64 debugreg[8];
2878c2ecf20Sopenharmony_ci};
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_cistruct kvm_pit_state {
2908c2ecf20Sopenharmony_ci	struct kvm_pit_channel_state channels[3];
2918c2ecf20Sopenharmony_ci};
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci#define KVM_PIT_FLAGS_HPET_LEGACY  0x00000001
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_cistruct kvm_pit_state2 {
2968c2ecf20Sopenharmony_ci	struct kvm_pit_channel_state channels[3];
2978c2ecf20Sopenharmony_ci	__u32 flags;
2988c2ecf20Sopenharmony_ci	__u32 reserved[9];
2998c2ecf20Sopenharmony_ci};
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_cistruct kvm_reinject_control {
3028c2ecf20Sopenharmony_ci	__u8 pit_reinject;
3038c2ecf20Sopenharmony_ci	__u8 reserved[31];
3048c2ecf20Sopenharmony_ci};
3058c2ecf20Sopenharmony_ci
3068c2ecf20Sopenharmony_ci/* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */
3078c2ecf20Sopenharmony_ci#define KVM_VCPUEVENT_VALID_NMI_PENDING	0x00000001
3088c2ecf20Sopenharmony_ci#define KVM_VCPUEVENT_VALID_SIPI_VECTOR	0x00000002
3098c2ecf20Sopenharmony_ci#define KVM_VCPUEVENT_VALID_SHADOW	0x00000004
3108c2ecf20Sopenharmony_ci#define KVM_VCPUEVENT_VALID_SMM		0x00000008
3118c2ecf20Sopenharmony_ci#define KVM_VCPUEVENT_VALID_PAYLOAD	0x00000010
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci/* Interrupt shadow states */
3148c2ecf20Sopenharmony_ci#define KVM_X86_SHADOW_INT_MOV_SS	0x01
3158c2ecf20Sopenharmony_ci#define KVM_X86_SHADOW_INT_STI		0x02
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci/* for KVM_GET/SET_VCPU_EVENTS */
3188c2ecf20Sopenharmony_cistruct kvm_vcpu_events {
3198c2ecf20Sopenharmony_ci	struct {
3208c2ecf20Sopenharmony_ci		__u8 injected;
3218c2ecf20Sopenharmony_ci		__u8 nr;
3228c2ecf20Sopenharmony_ci		__u8 has_error_code;
3238c2ecf20Sopenharmony_ci		__u8 pending;
3248c2ecf20Sopenharmony_ci		__u32 error_code;
3258c2ecf20Sopenharmony_ci	} exception;
3268c2ecf20Sopenharmony_ci	struct {
3278c2ecf20Sopenharmony_ci		__u8 injected;
3288c2ecf20Sopenharmony_ci		__u8 nr;
3298c2ecf20Sopenharmony_ci		__u8 soft;
3308c2ecf20Sopenharmony_ci		__u8 shadow;
3318c2ecf20Sopenharmony_ci	} interrupt;
3328c2ecf20Sopenharmony_ci	struct {
3338c2ecf20Sopenharmony_ci		__u8 injected;
3348c2ecf20Sopenharmony_ci		__u8 pending;
3358c2ecf20Sopenharmony_ci		__u8 masked;
3368c2ecf20Sopenharmony_ci		__u8 pad;
3378c2ecf20Sopenharmony_ci	} nmi;
3388c2ecf20Sopenharmony_ci	__u32 sipi_vector;
3398c2ecf20Sopenharmony_ci	__u32 flags;
3408c2ecf20Sopenharmony_ci	struct {
3418c2ecf20Sopenharmony_ci		__u8 smm;
3428c2ecf20Sopenharmony_ci		__u8 pending;
3438c2ecf20Sopenharmony_ci		__u8 smm_inside_nmi;
3448c2ecf20Sopenharmony_ci		__u8 latched_init;
3458c2ecf20Sopenharmony_ci	} smi;
3468c2ecf20Sopenharmony_ci	__u8 reserved[27];
3478c2ecf20Sopenharmony_ci	__u8 exception_has_payload;
3488c2ecf20Sopenharmony_ci	__u64 exception_payload;
3498c2ecf20Sopenharmony_ci};
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci/* for KVM_GET/SET_DEBUGREGS */
3528c2ecf20Sopenharmony_cistruct kvm_debugregs {
3538c2ecf20Sopenharmony_ci	__u64 db[4];
3548c2ecf20Sopenharmony_ci	__u64 dr6;
3558c2ecf20Sopenharmony_ci	__u64 dr7;
3568c2ecf20Sopenharmony_ci	__u64 flags;
3578c2ecf20Sopenharmony_ci	__u64 reserved[9];
3588c2ecf20Sopenharmony_ci};
3598c2ecf20Sopenharmony_ci
3608c2ecf20Sopenharmony_ci/* for KVM_CAP_XSAVE */
3618c2ecf20Sopenharmony_cistruct kvm_xsave {
3628c2ecf20Sopenharmony_ci	__u32 region[1024];
3638c2ecf20Sopenharmony_ci};
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci#define KVM_MAX_XCRS	16
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_cistruct kvm_xcr {
3688c2ecf20Sopenharmony_ci	__u32 xcr;
3698c2ecf20Sopenharmony_ci	__u32 reserved;
3708c2ecf20Sopenharmony_ci	__u64 value;
3718c2ecf20Sopenharmony_ci};
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_cistruct kvm_xcrs {
3748c2ecf20Sopenharmony_ci	__u32 nr_xcrs;
3758c2ecf20Sopenharmony_ci	__u32 flags;
3768c2ecf20Sopenharmony_ci	struct kvm_xcr xcrs[KVM_MAX_XCRS];
3778c2ecf20Sopenharmony_ci	__u64 padding[16];
3788c2ecf20Sopenharmony_ci};
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci#define KVM_SYNC_X86_REGS      (1UL << 0)
3818c2ecf20Sopenharmony_ci#define KVM_SYNC_X86_SREGS     (1UL << 1)
3828c2ecf20Sopenharmony_ci#define KVM_SYNC_X86_EVENTS    (1UL << 2)
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_ci#define KVM_SYNC_X86_VALID_FIELDS \
3858c2ecf20Sopenharmony_ci	(KVM_SYNC_X86_REGS| \
3868c2ecf20Sopenharmony_ci	 KVM_SYNC_X86_SREGS| \
3878c2ecf20Sopenharmony_ci	 KVM_SYNC_X86_EVENTS)
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci/* kvm_sync_regs struct included by kvm_run struct */
3908c2ecf20Sopenharmony_cistruct kvm_sync_regs {
3918c2ecf20Sopenharmony_ci	/* Members of this structure are potentially malicious.
3928c2ecf20Sopenharmony_ci	 * Care must be taken by code reading, esp. interpreting,
3938c2ecf20Sopenharmony_ci	 * data fields from them inside KVM to prevent TOCTOU and
3948c2ecf20Sopenharmony_ci	 * double-fetch types of vulnerabilities.
3958c2ecf20Sopenharmony_ci	 */
3968c2ecf20Sopenharmony_ci	struct kvm_regs regs;
3978c2ecf20Sopenharmony_ci	struct kvm_sregs sregs;
3988c2ecf20Sopenharmony_ci	struct kvm_vcpu_events events;
3998c2ecf20Sopenharmony_ci};
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_ci#define KVM_X86_QUIRK_LINT0_REENABLED	   (1 << 0)
4028c2ecf20Sopenharmony_ci#define KVM_X86_QUIRK_CD_NW_CLEARED	   (1 << 1)
4038c2ecf20Sopenharmony_ci#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE	   (1 << 2)
4048c2ecf20Sopenharmony_ci#define KVM_X86_QUIRK_OUT_7E_INC_RIP	   (1 << 3)
4058c2ecf20Sopenharmony_ci#define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT (1 << 4)
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_FORMAT_VMX	0
4088c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_FORMAT_SVM	1
4098c2ecf20Sopenharmony_ci
4108c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_GUEST_MODE	0x00000001
4118c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_RUN_PENDING	0x00000002
4128c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_EVMCS		0x00000004
4138c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_MTF_PENDING	0x00000008
4148c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_GIF_SET	0x00000100
4158c2ecf20Sopenharmony_ci
4168c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_SMM_GUEST_MODE	0x00000001
4178c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_SMM_VMXON	0x00000002
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_VMX_VMCS_SIZE	0x1000
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci#define KVM_STATE_NESTED_SVM_VMCB_SIZE	0x1000
4228c2ecf20Sopenharmony_ci
4238c2ecf20Sopenharmony_ci#define KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE	0x00000001
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_cistruct kvm_vmx_nested_state_data {
4268c2ecf20Sopenharmony_ci	__u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
4278c2ecf20Sopenharmony_ci	__u8 shadow_vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
4288c2ecf20Sopenharmony_ci};
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_cistruct kvm_vmx_nested_state_hdr {
4318c2ecf20Sopenharmony_ci	__u64 vmxon_pa;
4328c2ecf20Sopenharmony_ci	__u64 vmcs12_pa;
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	struct {
4358c2ecf20Sopenharmony_ci		__u16 flags;
4368c2ecf20Sopenharmony_ci	} smm;
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci	__u32 flags;
4398c2ecf20Sopenharmony_ci	__u64 preemption_timer_deadline;
4408c2ecf20Sopenharmony_ci};
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_cistruct kvm_svm_nested_state_data {
4438c2ecf20Sopenharmony_ci	/* Save area only used if KVM_STATE_NESTED_RUN_PENDING.  */
4448c2ecf20Sopenharmony_ci	__u8 vmcb12[KVM_STATE_NESTED_SVM_VMCB_SIZE];
4458c2ecf20Sopenharmony_ci};
4468c2ecf20Sopenharmony_ci
4478c2ecf20Sopenharmony_cistruct kvm_svm_nested_state_hdr {
4488c2ecf20Sopenharmony_ci	__u64 vmcb_pa;
4498c2ecf20Sopenharmony_ci};
4508c2ecf20Sopenharmony_ci
4518c2ecf20Sopenharmony_ci/* for KVM_CAP_NESTED_STATE */
4528c2ecf20Sopenharmony_cistruct kvm_nested_state {
4538c2ecf20Sopenharmony_ci	__u16 flags;
4548c2ecf20Sopenharmony_ci	__u16 format;
4558c2ecf20Sopenharmony_ci	__u32 size;
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_ci	union {
4588c2ecf20Sopenharmony_ci		struct kvm_vmx_nested_state_hdr vmx;
4598c2ecf20Sopenharmony_ci		struct kvm_svm_nested_state_hdr svm;
4608c2ecf20Sopenharmony_ci
4618c2ecf20Sopenharmony_ci		/* Pad the header to 128 bytes.  */
4628c2ecf20Sopenharmony_ci		__u8 pad[120];
4638c2ecf20Sopenharmony_ci	} hdr;
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci	/*
4668c2ecf20Sopenharmony_ci	 * Define data region as 0 bytes to preserve backwards-compatability
4678c2ecf20Sopenharmony_ci	 * to old definition of kvm_nested_state in order to avoid changing
4688c2ecf20Sopenharmony_ci	 * KVM_{GET,PUT}_NESTED_STATE ioctl values.
4698c2ecf20Sopenharmony_ci	 */
4708c2ecf20Sopenharmony_ci	union {
4718c2ecf20Sopenharmony_ci		struct kvm_vmx_nested_state_data vmx[0];
4728c2ecf20Sopenharmony_ci		struct kvm_svm_nested_state_data svm[0];
4738c2ecf20Sopenharmony_ci	} data;
4748c2ecf20Sopenharmony_ci};
4758c2ecf20Sopenharmony_ci
4768c2ecf20Sopenharmony_ci/* for KVM_CAP_PMU_EVENT_FILTER */
4778c2ecf20Sopenharmony_cistruct kvm_pmu_event_filter {
4788c2ecf20Sopenharmony_ci	__u32 action;
4798c2ecf20Sopenharmony_ci	__u32 nevents;
4808c2ecf20Sopenharmony_ci	__u32 fixed_counter_bitmap;
4818c2ecf20Sopenharmony_ci	__u32 flags;
4828c2ecf20Sopenharmony_ci	__u32 pad[4];
4838c2ecf20Sopenharmony_ci	__u64 events[0];
4848c2ecf20Sopenharmony_ci};
4858c2ecf20Sopenharmony_ci
4868c2ecf20Sopenharmony_ci#define KVM_PMU_EVENT_ALLOW 0
4878c2ecf20Sopenharmony_ci#define KVM_PMU_EVENT_DENY 1
4888c2ecf20Sopenharmony_ci
4898c2ecf20Sopenharmony_ci#endif /* _ASM_X86_KVM_H */
490