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