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