162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_KVM_H 362306a36Sopenharmony_ci#define _ASM_X86_KVM_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * KVM x86 specific structures and definitions 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci#include <linux/ioctl.h> 1262306a36Sopenharmony_ci#include <linux/stddef.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define KVM_PIO_PAGE_OFFSET 1 1562306a36Sopenharmony_ci#define KVM_COALESCED_MMIO_PAGE_OFFSET 2 1662306a36Sopenharmony_ci#define KVM_DIRTY_LOG_PAGE_OFFSET 64 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define DE_VECTOR 0 1962306a36Sopenharmony_ci#define DB_VECTOR 1 2062306a36Sopenharmony_ci#define BP_VECTOR 3 2162306a36Sopenharmony_ci#define OF_VECTOR 4 2262306a36Sopenharmony_ci#define BR_VECTOR 5 2362306a36Sopenharmony_ci#define UD_VECTOR 6 2462306a36Sopenharmony_ci#define NM_VECTOR 7 2562306a36Sopenharmony_ci#define DF_VECTOR 8 2662306a36Sopenharmony_ci#define TS_VECTOR 10 2762306a36Sopenharmony_ci#define NP_VECTOR 11 2862306a36Sopenharmony_ci#define SS_VECTOR 12 2962306a36Sopenharmony_ci#define GP_VECTOR 13 3062306a36Sopenharmony_ci#define PF_VECTOR 14 3162306a36Sopenharmony_ci#define MF_VECTOR 16 3262306a36Sopenharmony_ci#define AC_VECTOR 17 3362306a36Sopenharmony_ci#define MC_VECTOR 18 3462306a36Sopenharmony_ci#define XM_VECTOR 19 3562306a36Sopenharmony_ci#define VE_VECTOR 20 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/* Select x86 specific features in <linux/kvm.h> */ 3862306a36Sopenharmony_ci#define __KVM_HAVE_PIT 3962306a36Sopenharmony_ci#define __KVM_HAVE_IOAPIC 4062306a36Sopenharmony_ci#define __KVM_HAVE_IRQ_LINE 4162306a36Sopenharmony_ci#define __KVM_HAVE_MSI 4262306a36Sopenharmony_ci#define __KVM_HAVE_USER_NMI 4362306a36Sopenharmony_ci#define __KVM_HAVE_GUEST_DEBUG 4462306a36Sopenharmony_ci#define __KVM_HAVE_MSIX 4562306a36Sopenharmony_ci#define __KVM_HAVE_MCE 4662306a36Sopenharmony_ci#define __KVM_HAVE_PIT_STATE2 4762306a36Sopenharmony_ci#define __KVM_HAVE_XEN_HVM 4862306a36Sopenharmony_ci#define __KVM_HAVE_VCPU_EVENTS 4962306a36Sopenharmony_ci#define __KVM_HAVE_DEBUGREGS 5062306a36Sopenharmony_ci#define __KVM_HAVE_XSAVE 5162306a36Sopenharmony_ci#define __KVM_HAVE_XCRS 5262306a36Sopenharmony_ci#define __KVM_HAVE_READONLY_MEM 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* Architectural interrupt line count. */ 5562306a36Sopenharmony_ci#define KVM_NR_INTERRUPTS 256 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */ 5862306a36Sopenharmony_cistruct kvm_pic_state { 5962306a36Sopenharmony_ci __u8 last_irr; /* edge detection */ 6062306a36Sopenharmony_ci __u8 irr; /* interrupt request register */ 6162306a36Sopenharmony_ci __u8 imr; /* interrupt mask register */ 6262306a36Sopenharmony_ci __u8 isr; /* interrupt service register */ 6362306a36Sopenharmony_ci __u8 priority_add; /* highest irq priority */ 6462306a36Sopenharmony_ci __u8 irq_base; 6562306a36Sopenharmony_ci __u8 read_reg_select; 6662306a36Sopenharmony_ci __u8 poll; 6762306a36Sopenharmony_ci __u8 special_mask; 6862306a36Sopenharmony_ci __u8 init_state; 6962306a36Sopenharmony_ci __u8 auto_eoi; 7062306a36Sopenharmony_ci __u8 rotate_on_auto_eoi; 7162306a36Sopenharmony_ci __u8 special_fully_nested_mode; 7262306a36Sopenharmony_ci __u8 init4; /* true if 4 byte init */ 7362306a36Sopenharmony_ci __u8 elcr; /* PIIX edge/trigger selection */ 7462306a36Sopenharmony_ci __u8 elcr_mask; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define KVM_IOAPIC_NUM_PINS 24 7862306a36Sopenharmony_cistruct kvm_ioapic_state { 7962306a36Sopenharmony_ci __u64 base_address; 8062306a36Sopenharmony_ci __u32 ioregsel; 8162306a36Sopenharmony_ci __u32 id; 8262306a36Sopenharmony_ci __u32 irr; 8362306a36Sopenharmony_ci __u32 pad; 8462306a36Sopenharmony_ci union { 8562306a36Sopenharmony_ci __u64 bits; 8662306a36Sopenharmony_ci struct { 8762306a36Sopenharmony_ci __u8 vector; 8862306a36Sopenharmony_ci __u8 delivery_mode:3; 8962306a36Sopenharmony_ci __u8 dest_mode:1; 9062306a36Sopenharmony_ci __u8 delivery_status:1; 9162306a36Sopenharmony_ci __u8 polarity:1; 9262306a36Sopenharmony_ci __u8 remote_irr:1; 9362306a36Sopenharmony_ci __u8 trig_mode:1; 9462306a36Sopenharmony_ci __u8 mask:1; 9562306a36Sopenharmony_ci __u8 reserve:7; 9662306a36Sopenharmony_ci __u8 reserved[4]; 9762306a36Sopenharmony_ci __u8 dest_id; 9862306a36Sopenharmony_ci } fields; 9962306a36Sopenharmony_ci } redirtbl[KVM_IOAPIC_NUM_PINS]; 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#define KVM_IRQCHIP_PIC_MASTER 0 10362306a36Sopenharmony_ci#define KVM_IRQCHIP_PIC_SLAVE 1 10462306a36Sopenharmony_ci#define KVM_IRQCHIP_IOAPIC 2 10562306a36Sopenharmony_ci#define KVM_NR_IRQCHIPS 3 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define KVM_RUN_X86_SMM (1 << 0) 10862306a36Sopenharmony_ci#define KVM_RUN_X86_BUS_LOCK (1 << 1) 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci/* for KVM_GET_REGS and KVM_SET_REGS */ 11162306a36Sopenharmony_cistruct kvm_regs { 11262306a36Sopenharmony_ci /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ 11362306a36Sopenharmony_ci __u64 rax, rbx, rcx, rdx; 11462306a36Sopenharmony_ci __u64 rsi, rdi, rsp, rbp; 11562306a36Sopenharmony_ci __u64 r8, r9, r10, r11; 11662306a36Sopenharmony_ci __u64 r12, r13, r14, r15; 11762306a36Sopenharmony_ci __u64 rip, rflags; 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci/* for KVM_GET_LAPIC and KVM_SET_LAPIC */ 12162306a36Sopenharmony_ci#define KVM_APIC_REG_SIZE 0x400 12262306a36Sopenharmony_cistruct kvm_lapic_state { 12362306a36Sopenharmony_ci char regs[KVM_APIC_REG_SIZE]; 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistruct kvm_segment { 12762306a36Sopenharmony_ci __u64 base; 12862306a36Sopenharmony_ci __u32 limit; 12962306a36Sopenharmony_ci __u16 selector; 13062306a36Sopenharmony_ci __u8 type; 13162306a36Sopenharmony_ci __u8 present, dpl, db, s, l, g, avl; 13262306a36Sopenharmony_ci __u8 unusable; 13362306a36Sopenharmony_ci __u8 padding; 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistruct kvm_dtable { 13762306a36Sopenharmony_ci __u64 base; 13862306a36Sopenharmony_ci __u16 limit; 13962306a36Sopenharmony_ci __u16 padding[3]; 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci/* for KVM_GET_SREGS and KVM_SET_SREGS */ 14462306a36Sopenharmony_cistruct kvm_sregs { 14562306a36Sopenharmony_ci /* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */ 14662306a36Sopenharmony_ci struct kvm_segment cs, ds, es, fs, gs, ss; 14762306a36Sopenharmony_ci struct kvm_segment tr, ldt; 14862306a36Sopenharmony_ci struct kvm_dtable gdt, idt; 14962306a36Sopenharmony_ci __u64 cr0, cr2, cr3, cr4, cr8; 15062306a36Sopenharmony_ci __u64 efer; 15162306a36Sopenharmony_ci __u64 apic_base; 15262306a36Sopenharmony_ci __u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64]; 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistruct kvm_sregs2 { 15662306a36Sopenharmony_ci /* out (KVM_GET_SREGS2) / in (KVM_SET_SREGS2) */ 15762306a36Sopenharmony_ci struct kvm_segment cs, ds, es, fs, gs, ss; 15862306a36Sopenharmony_ci struct kvm_segment tr, ldt; 15962306a36Sopenharmony_ci struct kvm_dtable gdt, idt; 16062306a36Sopenharmony_ci __u64 cr0, cr2, cr3, cr4, cr8; 16162306a36Sopenharmony_ci __u64 efer; 16262306a36Sopenharmony_ci __u64 apic_base; 16362306a36Sopenharmony_ci __u64 flags; 16462306a36Sopenharmony_ci __u64 pdptrs[4]; 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci#define KVM_SREGS2_FLAGS_PDPTRS_VALID 1 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci/* for KVM_GET_FPU and KVM_SET_FPU */ 16962306a36Sopenharmony_cistruct kvm_fpu { 17062306a36Sopenharmony_ci __u8 fpr[8][16]; 17162306a36Sopenharmony_ci __u16 fcw; 17262306a36Sopenharmony_ci __u16 fsw; 17362306a36Sopenharmony_ci __u8 ftwx; /* in fxsave format */ 17462306a36Sopenharmony_ci __u8 pad1; 17562306a36Sopenharmony_ci __u16 last_opcode; 17662306a36Sopenharmony_ci __u64 last_ip; 17762306a36Sopenharmony_ci __u64 last_dp; 17862306a36Sopenharmony_ci __u8 xmm[16][16]; 17962306a36Sopenharmony_ci __u32 mxcsr; 18062306a36Sopenharmony_ci __u32 pad2; 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistruct kvm_msr_entry { 18462306a36Sopenharmony_ci __u32 index; 18562306a36Sopenharmony_ci __u32 reserved; 18662306a36Sopenharmony_ci __u64 data; 18762306a36Sopenharmony_ci}; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci/* for KVM_GET_MSRS and KVM_SET_MSRS */ 19062306a36Sopenharmony_cistruct kvm_msrs { 19162306a36Sopenharmony_ci __u32 nmsrs; /* number of msrs in entries */ 19262306a36Sopenharmony_ci __u32 pad; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci struct kvm_msr_entry entries[]; 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci/* for KVM_GET_MSR_INDEX_LIST */ 19862306a36Sopenharmony_cistruct kvm_msr_list { 19962306a36Sopenharmony_ci __u32 nmsrs; /* number of msrs in entries */ 20062306a36Sopenharmony_ci __u32 indices[]; 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci/* Maximum size of any access bitmap in bytes */ 20462306a36Sopenharmony_ci#define KVM_MSR_FILTER_MAX_BITMAP_SIZE 0x600 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/* for KVM_X86_SET_MSR_FILTER */ 20762306a36Sopenharmony_cistruct kvm_msr_filter_range { 20862306a36Sopenharmony_ci#define KVM_MSR_FILTER_READ (1 << 0) 20962306a36Sopenharmony_ci#define KVM_MSR_FILTER_WRITE (1 << 1) 21062306a36Sopenharmony_ci#define KVM_MSR_FILTER_RANGE_VALID_MASK (KVM_MSR_FILTER_READ | \ 21162306a36Sopenharmony_ci KVM_MSR_FILTER_WRITE) 21262306a36Sopenharmony_ci __u32 flags; 21362306a36Sopenharmony_ci __u32 nmsrs; /* number of msrs in bitmap */ 21462306a36Sopenharmony_ci __u32 base; /* MSR index the bitmap starts at */ 21562306a36Sopenharmony_ci __u8 *bitmap; /* a 1 bit allows the operations in flags, 0 denies */ 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci#define KVM_MSR_FILTER_MAX_RANGES 16 21962306a36Sopenharmony_cistruct kvm_msr_filter { 22062306a36Sopenharmony_ci#ifndef __KERNEL__ 22162306a36Sopenharmony_ci#define KVM_MSR_FILTER_DEFAULT_ALLOW (0 << 0) 22262306a36Sopenharmony_ci#endif 22362306a36Sopenharmony_ci#define KVM_MSR_FILTER_DEFAULT_DENY (1 << 0) 22462306a36Sopenharmony_ci#define KVM_MSR_FILTER_VALID_MASK (KVM_MSR_FILTER_DEFAULT_DENY) 22562306a36Sopenharmony_ci __u32 flags; 22662306a36Sopenharmony_ci struct kvm_msr_filter_range ranges[KVM_MSR_FILTER_MAX_RANGES]; 22762306a36Sopenharmony_ci}; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_cistruct kvm_cpuid_entry { 23062306a36Sopenharmony_ci __u32 function; 23162306a36Sopenharmony_ci __u32 eax; 23262306a36Sopenharmony_ci __u32 ebx; 23362306a36Sopenharmony_ci __u32 ecx; 23462306a36Sopenharmony_ci __u32 edx; 23562306a36Sopenharmony_ci __u32 padding; 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/* for KVM_SET_CPUID */ 23962306a36Sopenharmony_cistruct kvm_cpuid { 24062306a36Sopenharmony_ci __u32 nent; 24162306a36Sopenharmony_ci __u32 padding; 24262306a36Sopenharmony_ci struct kvm_cpuid_entry entries[]; 24362306a36Sopenharmony_ci}; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistruct kvm_cpuid_entry2 { 24662306a36Sopenharmony_ci __u32 function; 24762306a36Sopenharmony_ci __u32 index; 24862306a36Sopenharmony_ci __u32 flags; 24962306a36Sopenharmony_ci __u32 eax; 25062306a36Sopenharmony_ci __u32 ebx; 25162306a36Sopenharmony_ci __u32 ecx; 25262306a36Sopenharmony_ci __u32 edx; 25362306a36Sopenharmony_ci __u32 padding[3]; 25462306a36Sopenharmony_ci}; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX (1 << 0) 25762306a36Sopenharmony_ci#define KVM_CPUID_FLAG_STATEFUL_FUNC (1 << 1) 25862306a36Sopenharmony_ci#define KVM_CPUID_FLAG_STATE_READ_NEXT (1 << 2) 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci/* for KVM_SET_CPUID2 */ 26162306a36Sopenharmony_cistruct kvm_cpuid2 { 26262306a36Sopenharmony_ci __u32 nent; 26362306a36Sopenharmony_ci __u32 padding; 26462306a36Sopenharmony_ci struct kvm_cpuid_entry2 entries[]; 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* for KVM_GET_PIT and KVM_SET_PIT */ 26862306a36Sopenharmony_cistruct kvm_pit_channel_state { 26962306a36Sopenharmony_ci __u32 count; /* can be 65536 */ 27062306a36Sopenharmony_ci __u16 latched_count; 27162306a36Sopenharmony_ci __u8 count_latched; 27262306a36Sopenharmony_ci __u8 status_latched; 27362306a36Sopenharmony_ci __u8 status; 27462306a36Sopenharmony_ci __u8 read_state; 27562306a36Sopenharmony_ci __u8 write_state; 27662306a36Sopenharmony_ci __u8 write_latch; 27762306a36Sopenharmony_ci __u8 rw_mode; 27862306a36Sopenharmony_ci __u8 mode; 27962306a36Sopenharmony_ci __u8 bcd; 28062306a36Sopenharmony_ci __u8 gate; 28162306a36Sopenharmony_ci __s64 count_load_time; 28262306a36Sopenharmony_ci}; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistruct kvm_debug_exit_arch { 28562306a36Sopenharmony_ci __u32 exception; 28662306a36Sopenharmony_ci __u32 pad; 28762306a36Sopenharmony_ci __u64 pc; 28862306a36Sopenharmony_ci __u64 dr6; 28962306a36Sopenharmony_ci __u64 dr7; 29062306a36Sopenharmony_ci}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci#define KVM_GUESTDBG_USE_SW_BP 0x00010000 29362306a36Sopenharmony_ci#define KVM_GUESTDBG_USE_HW_BP 0x00020000 29462306a36Sopenharmony_ci#define KVM_GUESTDBG_INJECT_DB 0x00040000 29562306a36Sopenharmony_ci#define KVM_GUESTDBG_INJECT_BP 0x00080000 29662306a36Sopenharmony_ci#define KVM_GUESTDBG_BLOCKIRQ 0x00100000 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci/* for KVM_SET_GUEST_DEBUG */ 29962306a36Sopenharmony_cistruct kvm_guest_debug_arch { 30062306a36Sopenharmony_ci __u64 debugreg[8]; 30162306a36Sopenharmony_ci}; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_cistruct kvm_pit_state { 30462306a36Sopenharmony_ci struct kvm_pit_channel_state channels[3]; 30562306a36Sopenharmony_ci}; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci#define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001 30862306a36Sopenharmony_ci#define KVM_PIT_FLAGS_SPEAKER_DATA_ON 0x00000002 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistruct kvm_pit_state2 { 31162306a36Sopenharmony_ci struct kvm_pit_channel_state channels[3]; 31262306a36Sopenharmony_ci __u32 flags; 31362306a36Sopenharmony_ci __u32 reserved[9]; 31462306a36Sopenharmony_ci}; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_cistruct kvm_reinject_control { 31762306a36Sopenharmony_ci __u8 pit_reinject; 31862306a36Sopenharmony_ci __u8 reserved[31]; 31962306a36Sopenharmony_ci}; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci/* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */ 32262306a36Sopenharmony_ci#define KVM_VCPUEVENT_VALID_NMI_PENDING 0x00000001 32362306a36Sopenharmony_ci#define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002 32462306a36Sopenharmony_ci#define KVM_VCPUEVENT_VALID_SHADOW 0x00000004 32562306a36Sopenharmony_ci#define KVM_VCPUEVENT_VALID_SMM 0x00000008 32662306a36Sopenharmony_ci#define KVM_VCPUEVENT_VALID_PAYLOAD 0x00000010 32762306a36Sopenharmony_ci#define KVM_VCPUEVENT_VALID_TRIPLE_FAULT 0x00000020 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci/* Interrupt shadow states */ 33062306a36Sopenharmony_ci#define KVM_X86_SHADOW_INT_MOV_SS 0x01 33162306a36Sopenharmony_ci#define KVM_X86_SHADOW_INT_STI 0x02 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci/* for KVM_GET/SET_VCPU_EVENTS */ 33462306a36Sopenharmony_cistruct kvm_vcpu_events { 33562306a36Sopenharmony_ci struct { 33662306a36Sopenharmony_ci __u8 injected; 33762306a36Sopenharmony_ci __u8 nr; 33862306a36Sopenharmony_ci __u8 has_error_code; 33962306a36Sopenharmony_ci __u8 pending; 34062306a36Sopenharmony_ci __u32 error_code; 34162306a36Sopenharmony_ci } exception; 34262306a36Sopenharmony_ci struct { 34362306a36Sopenharmony_ci __u8 injected; 34462306a36Sopenharmony_ci __u8 nr; 34562306a36Sopenharmony_ci __u8 soft; 34662306a36Sopenharmony_ci __u8 shadow; 34762306a36Sopenharmony_ci } interrupt; 34862306a36Sopenharmony_ci struct { 34962306a36Sopenharmony_ci __u8 injected; 35062306a36Sopenharmony_ci __u8 pending; 35162306a36Sopenharmony_ci __u8 masked; 35262306a36Sopenharmony_ci __u8 pad; 35362306a36Sopenharmony_ci } nmi; 35462306a36Sopenharmony_ci __u32 sipi_vector; 35562306a36Sopenharmony_ci __u32 flags; 35662306a36Sopenharmony_ci struct { 35762306a36Sopenharmony_ci __u8 smm; 35862306a36Sopenharmony_ci __u8 pending; 35962306a36Sopenharmony_ci __u8 smm_inside_nmi; 36062306a36Sopenharmony_ci __u8 latched_init; 36162306a36Sopenharmony_ci } smi; 36262306a36Sopenharmony_ci struct { 36362306a36Sopenharmony_ci __u8 pending; 36462306a36Sopenharmony_ci } triple_fault; 36562306a36Sopenharmony_ci __u8 reserved[26]; 36662306a36Sopenharmony_ci __u8 exception_has_payload; 36762306a36Sopenharmony_ci __u64 exception_payload; 36862306a36Sopenharmony_ci}; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci/* for KVM_GET/SET_DEBUGREGS */ 37162306a36Sopenharmony_cistruct kvm_debugregs { 37262306a36Sopenharmony_ci __u64 db[4]; 37362306a36Sopenharmony_ci __u64 dr6; 37462306a36Sopenharmony_ci __u64 dr7; 37562306a36Sopenharmony_ci __u64 flags; 37662306a36Sopenharmony_ci __u64 reserved[9]; 37762306a36Sopenharmony_ci}; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci/* for KVM_CAP_XSAVE and KVM_CAP_XSAVE2 */ 38062306a36Sopenharmony_cistruct kvm_xsave { 38162306a36Sopenharmony_ci /* 38262306a36Sopenharmony_ci * KVM_GET_XSAVE2 and KVM_SET_XSAVE write and read as many bytes 38362306a36Sopenharmony_ci * as are returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2) 38462306a36Sopenharmony_ci * respectively, when invoked on the vm file descriptor. 38562306a36Sopenharmony_ci * 38662306a36Sopenharmony_ci * The size value returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2) 38762306a36Sopenharmony_ci * will always be at least 4096. Currently, it is only greater 38862306a36Sopenharmony_ci * than 4096 if a dynamic feature has been enabled with 38962306a36Sopenharmony_ci * ``arch_prctl()``, but this may change in the future. 39062306a36Sopenharmony_ci * 39162306a36Sopenharmony_ci * The offsets of the state save areas in struct kvm_xsave follow 39262306a36Sopenharmony_ci * the contents of CPUID leaf 0xD on the host. 39362306a36Sopenharmony_ci */ 39462306a36Sopenharmony_ci __u32 region[1024]; 39562306a36Sopenharmony_ci __u32 extra[]; 39662306a36Sopenharmony_ci}; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci#define KVM_MAX_XCRS 16 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cistruct kvm_xcr { 40162306a36Sopenharmony_ci __u32 xcr; 40262306a36Sopenharmony_ci __u32 reserved; 40362306a36Sopenharmony_ci __u64 value; 40462306a36Sopenharmony_ci}; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_cistruct kvm_xcrs { 40762306a36Sopenharmony_ci __u32 nr_xcrs; 40862306a36Sopenharmony_ci __u32 flags; 40962306a36Sopenharmony_ci struct kvm_xcr xcrs[KVM_MAX_XCRS]; 41062306a36Sopenharmony_ci __u64 padding[16]; 41162306a36Sopenharmony_ci}; 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci#define KVM_SYNC_X86_REGS (1UL << 0) 41462306a36Sopenharmony_ci#define KVM_SYNC_X86_SREGS (1UL << 1) 41562306a36Sopenharmony_ci#define KVM_SYNC_X86_EVENTS (1UL << 2) 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci#define KVM_SYNC_X86_VALID_FIELDS \ 41862306a36Sopenharmony_ci (KVM_SYNC_X86_REGS| \ 41962306a36Sopenharmony_ci KVM_SYNC_X86_SREGS| \ 42062306a36Sopenharmony_ci KVM_SYNC_X86_EVENTS) 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci/* kvm_sync_regs struct included by kvm_run struct */ 42362306a36Sopenharmony_cistruct kvm_sync_regs { 42462306a36Sopenharmony_ci /* Members of this structure are potentially malicious. 42562306a36Sopenharmony_ci * Care must be taken by code reading, esp. interpreting, 42662306a36Sopenharmony_ci * data fields from them inside KVM to prevent TOCTOU and 42762306a36Sopenharmony_ci * double-fetch types of vulnerabilities. 42862306a36Sopenharmony_ci */ 42962306a36Sopenharmony_ci struct kvm_regs regs; 43062306a36Sopenharmony_ci struct kvm_sregs sregs; 43162306a36Sopenharmony_ci struct kvm_vcpu_events events; 43262306a36Sopenharmony_ci}; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci#define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0) 43562306a36Sopenharmony_ci#define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1) 43662306a36Sopenharmony_ci#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE (1 << 2) 43762306a36Sopenharmony_ci#define KVM_X86_QUIRK_OUT_7E_INC_RIP (1 << 3) 43862306a36Sopenharmony_ci#define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT (1 << 4) 43962306a36Sopenharmony_ci#define KVM_X86_QUIRK_FIX_HYPERCALL_INSN (1 << 5) 44062306a36Sopenharmony_ci#define KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS (1 << 6) 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci#define KVM_STATE_NESTED_FORMAT_VMX 0 44362306a36Sopenharmony_ci#define KVM_STATE_NESTED_FORMAT_SVM 1 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci#define KVM_STATE_NESTED_GUEST_MODE 0x00000001 44662306a36Sopenharmony_ci#define KVM_STATE_NESTED_RUN_PENDING 0x00000002 44762306a36Sopenharmony_ci#define KVM_STATE_NESTED_EVMCS 0x00000004 44862306a36Sopenharmony_ci#define KVM_STATE_NESTED_MTF_PENDING 0x00000008 44962306a36Sopenharmony_ci#define KVM_STATE_NESTED_GIF_SET 0x00000100 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci#define KVM_STATE_NESTED_SMM_GUEST_MODE 0x00000001 45262306a36Sopenharmony_ci#define KVM_STATE_NESTED_SMM_VMXON 0x00000002 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci#define KVM_STATE_NESTED_VMX_VMCS_SIZE 0x1000 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci#define KVM_STATE_NESTED_SVM_VMCB_SIZE 0x1000 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci#define KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE 0x00000001 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci/* attributes for system fd (group 0) */ 46162306a36Sopenharmony_ci#define KVM_X86_XCOMP_GUEST_SUPP 0 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_cistruct kvm_vmx_nested_state_data { 46462306a36Sopenharmony_ci __u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE]; 46562306a36Sopenharmony_ci __u8 shadow_vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE]; 46662306a36Sopenharmony_ci}; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistruct kvm_vmx_nested_state_hdr { 46962306a36Sopenharmony_ci __u64 vmxon_pa; 47062306a36Sopenharmony_ci __u64 vmcs12_pa; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci struct { 47362306a36Sopenharmony_ci __u16 flags; 47462306a36Sopenharmony_ci } smm; 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci __u16 pad; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci __u32 flags; 47962306a36Sopenharmony_ci __u64 preemption_timer_deadline; 48062306a36Sopenharmony_ci}; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_cistruct kvm_svm_nested_state_data { 48362306a36Sopenharmony_ci /* Save area only used if KVM_STATE_NESTED_RUN_PENDING. */ 48462306a36Sopenharmony_ci __u8 vmcb12[KVM_STATE_NESTED_SVM_VMCB_SIZE]; 48562306a36Sopenharmony_ci}; 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_cistruct kvm_svm_nested_state_hdr { 48862306a36Sopenharmony_ci __u64 vmcb_pa; 48962306a36Sopenharmony_ci}; 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci/* for KVM_CAP_NESTED_STATE */ 49262306a36Sopenharmony_cistruct kvm_nested_state { 49362306a36Sopenharmony_ci __u16 flags; 49462306a36Sopenharmony_ci __u16 format; 49562306a36Sopenharmony_ci __u32 size; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci union { 49862306a36Sopenharmony_ci struct kvm_vmx_nested_state_hdr vmx; 49962306a36Sopenharmony_ci struct kvm_svm_nested_state_hdr svm; 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci /* Pad the header to 128 bytes. */ 50262306a36Sopenharmony_ci __u8 pad[120]; 50362306a36Sopenharmony_ci } hdr; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci /* 50662306a36Sopenharmony_ci * Define data region as 0 bytes to preserve backwards-compatability 50762306a36Sopenharmony_ci * to old definition of kvm_nested_state in order to avoid changing 50862306a36Sopenharmony_ci * KVM_{GET,PUT}_NESTED_STATE ioctl values. 50962306a36Sopenharmony_ci */ 51062306a36Sopenharmony_ci union { 51162306a36Sopenharmony_ci __DECLARE_FLEX_ARRAY(struct kvm_vmx_nested_state_data, vmx); 51262306a36Sopenharmony_ci __DECLARE_FLEX_ARRAY(struct kvm_svm_nested_state_data, svm); 51362306a36Sopenharmony_ci } data; 51462306a36Sopenharmony_ci}; 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci/* for KVM_CAP_PMU_EVENT_FILTER */ 51762306a36Sopenharmony_cistruct kvm_pmu_event_filter { 51862306a36Sopenharmony_ci __u32 action; 51962306a36Sopenharmony_ci __u32 nevents; 52062306a36Sopenharmony_ci __u32 fixed_counter_bitmap; 52162306a36Sopenharmony_ci __u32 flags; 52262306a36Sopenharmony_ci __u32 pad[4]; 52362306a36Sopenharmony_ci __u64 events[]; 52462306a36Sopenharmony_ci}; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci#define KVM_PMU_EVENT_ALLOW 0 52762306a36Sopenharmony_ci#define KVM_PMU_EVENT_DENY 1 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci#define KVM_PMU_EVENT_FLAG_MASKED_EVENTS BIT(0) 53062306a36Sopenharmony_ci#define KVM_PMU_EVENT_FLAGS_VALID_MASK (KVM_PMU_EVENT_FLAG_MASKED_EVENTS) 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ci/* 53362306a36Sopenharmony_ci * Masked event layout. 53462306a36Sopenharmony_ci * Bits Description 53562306a36Sopenharmony_ci * ---- ----------- 53662306a36Sopenharmony_ci * 7:0 event select (low bits) 53762306a36Sopenharmony_ci * 15:8 umask match 53862306a36Sopenharmony_ci * 31:16 unused 53962306a36Sopenharmony_ci * 35:32 event select (high bits) 54062306a36Sopenharmony_ci * 36:54 unused 54162306a36Sopenharmony_ci * 55 exclude bit 54262306a36Sopenharmony_ci * 63:56 umask mask 54362306a36Sopenharmony_ci */ 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci#define KVM_PMU_ENCODE_MASKED_ENTRY(event_select, mask, match, exclude) \ 54662306a36Sopenharmony_ci (((event_select) & 0xFFULL) | (((event_select) & 0XF00ULL) << 24) | \ 54762306a36Sopenharmony_ci (((mask) & 0xFFULL) << 56) | \ 54862306a36Sopenharmony_ci (((match) & 0xFFULL) << 8) | \ 54962306a36Sopenharmony_ci ((__u64)(!!(exclude)) << 55)) 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci#define KVM_PMU_MASKED_ENTRY_EVENT_SELECT \ 55262306a36Sopenharmony_ci (GENMASK_ULL(7, 0) | GENMASK_ULL(35, 32)) 55362306a36Sopenharmony_ci#define KVM_PMU_MASKED_ENTRY_UMASK_MASK (GENMASK_ULL(63, 56)) 55462306a36Sopenharmony_ci#define KVM_PMU_MASKED_ENTRY_UMASK_MATCH (GENMASK_ULL(15, 8)) 55562306a36Sopenharmony_ci#define KVM_PMU_MASKED_ENTRY_EXCLUDE (BIT_ULL(55)) 55662306a36Sopenharmony_ci#define KVM_PMU_MASKED_ENTRY_UMASK_MASK_SHIFT (56) 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_ci/* for KVM_{GET,SET,HAS}_DEVICE_ATTR */ 55962306a36Sopenharmony_ci#define KVM_VCPU_TSC_CTRL 0 /* control group for the timestamp counter (TSC) */ 56062306a36Sopenharmony_ci#define KVM_VCPU_TSC_OFFSET 0 /* attribute for the TSC offset */ 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci/* x86-specific KVM_EXIT_HYPERCALL flags. */ 56362306a36Sopenharmony_ci#define KVM_EXIT_HYPERCALL_LONG_MODE BIT(0) 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci#endif /* _ASM_X86_KVM_H */ 566