Path: blob/master/tools/arch/x86/include/uapi/asm/kvm.h
29278 views
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */1#ifndef _ASM_X86_KVM_H2#define _ASM_X86_KVM_H34/*5* KVM x86 specific structures and definitions6*7*/89#include <linux/const.h>10#include <linux/bits.h>11#include <linux/types.h>12#include <linux/ioctl.h>13#include <linux/stddef.h>1415#define KVM_PIO_PAGE_OFFSET 116#define KVM_COALESCED_MMIO_PAGE_OFFSET 217#define KVM_DIRTY_LOG_PAGE_OFFSET 641819#define DE_VECTOR 020#define DB_VECTOR 121#define BP_VECTOR 322#define OF_VECTOR 423#define BR_VECTOR 524#define UD_VECTOR 625#define NM_VECTOR 726#define DF_VECTOR 827#define TS_VECTOR 1028#define NP_VECTOR 1129#define SS_VECTOR 1230#define GP_VECTOR 1331#define PF_VECTOR 1432#define MF_VECTOR 1633#define AC_VECTOR 1734#define MC_VECTOR 1835#define XM_VECTOR 1936#define VE_VECTOR 203738/* Select x86 specific features in <linux/kvm.h> */39#define __KVM_HAVE_PIT40#define __KVM_HAVE_IOAPIC41#define __KVM_HAVE_IRQ_LINE42#define __KVM_HAVE_MSI43#define __KVM_HAVE_USER_NMI44#define __KVM_HAVE_MSIX45#define __KVM_HAVE_MCE46#define __KVM_HAVE_PIT_STATE247#define __KVM_HAVE_XEN_HVM48#define __KVM_HAVE_VCPU_EVENTS49#define __KVM_HAVE_DEBUGREGS50#define __KVM_HAVE_XSAVE51#define __KVM_HAVE_XCRS5253/* Architectural interrupt line count. */54#define KVM_NR_INTERRUPTS 2565556/* for KVM_GET_IRQCHIP and KVM_SET_IRQCHIP */57struct kvm_pic_state {58__u8 last_irr; /* edge detection */59__u8 irr; /* interrupt request register */60__u8 imr; /* interrupt mask register */61__u8 isr; /* interrupt service register */62__u8 priority_add; /* highest irq priority */63__u8 irq_base;64__u8 read_reg_select;65__u8 poll;66__u8 special_mask;67__u8 init_state;68__u8 auto_eoi;69__u8 rotate_on_auto_eoi;70__u8 special_fully_nested_mode;71__u8 init4; /* true if 4 byte init */72__u8 elcr; /* PIIX edge/trigger selection */73__u8 elcr_mask;74};7576#define KVM_IOAPIC_NUM_PINS 2477struct kvm_ioapic_state {78__u64 base_address;79__u32 ioregsel;80__u32 id;81__u32 irr;82__u32 pad;83union {84__u64 bits;85struct {86__u8 vector;87__u8 delivery_mode:3;88__u8 dest_mode:1;89__u8 delivery_status:1;90__u8 polarity:1;91__u8 remote_irr:1;92__u8 trig_mode:1;93__u8 mask:1;94__u8 reserve:7;95__u8 reserved[4];96__u8 dest_id;97} fields;98} redirtbl[KVM_IOAPIC_NUM_PINS];99};100101#define KVM_IRQCHIP_PIC_MASTER 0102#define KVM_IRQCHIP_PIC_SLAVE 1103#define KVM_IRQCHIP_IOAPIC 2104#define KVM_NR_IRQCHIPS 3105106#define KVM_RUN_X86_SMM (1 << 0)107#define KVM_RUN_X86_BUS_LOCK (1 << 1)108#define KVM_RUN_X86_GUEST_MODE (1 << 2)109110/* for KVM_GET_REGS and KVM_SET_REGS */111struct kvm_regs {112/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */113__u64 rax, rbx, rcx, rdx;114__u64 rsi, rdi, rsp, rbp;115__u64 r8, r9, r10, r11;116__u64 r12, r13, r14, r15;117__u64 rip, rflags;118};119120/* for KVM_GET_LAPIC and KVM_SET_LAPIC */121#define KVM_APIC_REG_SIZE 0x400122struct kvm_lapic_state {123char regs[KVM_APIC_REG_SIZE];124};125126struct kvm_segment {127__u64 base;128__u32 limit;129__u16 selector;130__u8 type;131__u8 present, dpl, db, s, l, g, avl;132__u8 unusable;133__u8 padding;134};135136struct kvm_dtable {137__u64 base;138__u16 limit;139__u16 padding[3];140};141142143/* for KVM_GET_SREGS and KVM_SET_SREGS */144struct kvm_sregs {145/* out (KVM_GET_SREGS) / in (KVM_SET_SREGS) */146struct kvm_segment cs, ds, es, fs, gs, ss;147struct kvm_segment tr, ldt;148struct kvm_dtable gdt, idt;149__u64 cr0, cr2, cr3, cr4, cr8;150__u64 efer;151__u64 apic_base;152__u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];153};154155struct kvm_sregs2 {156/* out (KVM_GET_SREGS2) / in (KVM_SET_SREGS2) */157struct kvm_segment cs, ds, es, fs, gs, ss;158struct kvm_segment tr, ldt;159struct kvm_dtable gdt, idt;160__u64 cr0, cr2, cr3, cr4, cr8;161__u64 efer;162__u64 apic_base;163__u64 flags;164__u64 pdptrs[4];165};166#define KVM_SREGS2_FLAGS_PDPTRS_VALID 1167168/* for KVM_GET_FPU and KVM_SET_FPU */169struct kvm_fpu {170__u8 fpr[8][16];171__u16 fcw;172__u16 fsw;173__u8 ftwx; /* in fxsave format */174__u8 pad1;175__u16 last_opcode;176__u64 last_ip;177__u64 last_dp;178__u8 xmm[16][16];179__u32 mxcsr;180__u32 pad2;181};182183struct kvm_msr_entry {184__u32 index;185__u32 reserved;186__u64 data;187};188189/* for KVM_GET_MSRS and KVM_SET_MSRS */190struct kvm_msrs {191__u32 nmsrs; /* number of msrs in entries */192__u32 pad;193194struct kvm_msr_entry entries[];195};196197/* for KVM_GET_MSR_INDEX_LIST */198struct kvm_msr_list {199__u32 nmsrs; /* number of msrs in entries */200__u32 indices[];201};202203/* Maximum size of any access bitmap in bytes */204#define KVM_MSR_FILTER_MAX_BITMAP_SIZE 0x600205206/* for KVM_X86_SET_MSR_FILTER */207struct kvm_msr_filter_range {208#define KVM_MSR_FILTER_READ (1 << 0)209#define KVM_MSR_FILTER_WRITE (1 << 1)210#define KVM_MSR_FILTER_RANGE_VALID_MASK (KVM_MSR_FILTER_READ | \211KVM_MSR_FILTER_WRITE)212__u32 flags;213__u32 nmsrs; /* number of msrs in bitmap */214__u32 base; /* MSR index the bitmap starts at */215__u8 *bitmap; /* a 1 bit allows the operations in flags, 0 denies */216};217218#define KVM_MSR_FILTER_MAX_RANGES 16219struct kvm_msr_filter {220#ifndef __KERNEL__221#define KVM_MSR_FILTER_DEFAULT_ALLOW (0 << 0)222#endif223#define KVM_MSR_FILTER_DEFAULT_DENY (1 << 0)224#define KVM_MSR_FILTER_VALID_MASK (KVM_MSR_FILTER_DEFAULT_DENY)225__u32 flags;226struct kvm_msr_filter_range ranges[KVM_MSR_FILTER_MAX_RANGES];227};228229struct kvm_cpuid_entry {230__u32 function;231__u32 eax;232__u32 ebx;233__u32 ecx;234__u32 edx;235__u32 padding;236};237238/* for KVM_SET_CPUID */239struct kvm_cpuid {240__u32 nent;241__u32 padding;242struct kvm_cpuid_entry entries[];243};244245struct kvm_cpuid_entry2 {246__u32 function;247__u32 index;248__u32 flags;249__u32 eax;250__u32 ebx;251__u32 ecx;252__u32 edx;253__u32 padding[3];254};255256#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX (1 << 0)257#define KVM_CPUID_FLAG_STATEFUL_FUNC (1 << 1)258#define KVM_CPUID_FLAG_STATE_READ_NEXT (1 << 2)259260/* for KVM_SET_CPUID2 */261struct kvm_cpuid2 {262__u32 nent;263__u32 padding;264struct kvm_cpuid_entry2 entries[];265};266267/* for KVM_GET_PIT and KVM_SET_PIT */268struct kvm_pit_channel_state {269__u32 count; /* can be 65536 */270__u16 latched_count;271__u8 count_latched;272__u8 status_latched;273__u8 status;274__u8 read_state;275__u8 write_state;276__u8 write_latch;277__u8 rw_mode;278__u8 mode;279__u8 bcd;280__u8 gate;281__s64 count_load_time;282};283284struct kvm_debug_exit_arch {285__u32 exception;286__u32 pad;287__u64 pc;288__u64 dr6;289__u64 dr7;290};291292#define KVM_GUESTDBG_USE_SW_BP 0x00010000293#define KVM_GUESTDBG_USE_HW_BP 0x00020000294#define KVM_GUESTDBG_INJECT_DB 0x00040000295#define KVM_GUESTDBG_INJECT_BP 0x00080000296#define KVM_GUESTDBG_BLOCKIRQ 0x00100000297298/* for KVM_SET_GUEST_DEBUG */299struct kvm_guest_debug_arch {300__u64 debugreg[8];301};302303struct kvm_pit_state {304struct kvm_pit_channel_state channels[3];305};306307#define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001308#define KVM_PIT_FLAGS_SPEAKER_DATA_ON 0x00000002309310struct kvm_pit_state2 {311struct kvm_pit_channel_state channels[3];312__u32 flags;313__u32 reserved[9];314};315316struct kvm_reinject_control {317__u8 pit_reinject;318__u8 reserved[31];319};320321/* When set in flags, include corresponding fields on KVM_SET_VCPU_EVENTS */322#define KVM_VCPUEVENT_VALID_NMI_PENDING 0x00000001323#define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002324#define KVM_VCPUEVENT_VALID_SHADOW 0x00000004325#define KVM_VCPUEVENT_VALID_SMM 0x00000008326#define KVM_VCPUEVENT_VALID_PAYLOAD 0x00000010327#define KVM_VCPUEVENT_VALID_TRIPLE_FAULT 0x00000020328329/* Interrupt shadow states */330#define KVM_X86_SHADOW_INT_MOV_SS 0x01331#define KVM_X86_SHADOW_INT_STI 0x02332333/* for KVM_GET/SET_VCPU_EVENTS */334struct kvm_vcpu_events {335struct {336__u8 injected;337__u8 nr;338__u8 has_error_code;339__u8 pending;340__u32 error_code;341} exception;342struct {343__u8 injected;344__u8 nr;345__u8 soft;346__u8 shadow;347} interrupt;348struct {349__u8 injected;350__u8 pending;351__u8 masked;352__u8 pad;353} nmi;354__u32 sipi_vector;355__u32 flags;356struct {357__u8 smm;358__u8 pending;359__u8 smm_inside_nmi;360__u8 latched_init;361} smi;362struct {363__u8 pending;364} triple_fault;365__u8 reserved[26];366__u8 exception_has_payload;367__u64 exception_payload;368};369370/* for KVM_GET/SET_DEBUGREGS */371struct kvm_debugregs {372__u64 db[4];373__u64 dr6;374__u64 dr7;375__u64 flags;376__u64 reserved[9];377};378379/* for KVM_CAP_XSAVE and KVM_CAP_XSAVE2 */380struct kvm_xsave {381/*382* KVM_GET_XSAVE2 and KVM_SET_XSAVE write and read as many bytes383* as are returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)384* respectively, when invoked on the vm file descriptor.385*386* The size value returned by KVM_CHECK_EXTENSION(KVM_CAP_XSAVE2)387* will always be at least 4096. Currently, it is only greater388* than 4096 if a dynamic feature has been enabled with389* ``arch_prctl()``, but this may change in the future.390*391* The offsets of the state save areas in struct kvm_xsave follow392* the contents of CPUID leaf 0xD on the host.393*/394__u32 region[1024];395__u32 extra[];396};397398#define KVM_MAX_XCRS 16399400struct kvm_xcr {401__u32 xcr;402__u32 reserved;403__u64 value;404};405406struct kvm_xcrs {407__u32 nr_xcrs;408__u32 flags;409struct kvm_xcr xcrs[KVM_MAX_XCRS];410__u64 padding[16];411};412413#define KVM_SYNC_X86_REGS (1UL << 0)414#define KVM_SYNC_X86_SREGS (1UL << 1)415#define KVM_SYNC_X86_EVENTS (1UL << 2)416417#define KVM_SYNC_X86_VALID_FIELDS \418(KVM_SYNC_X86_REGS| \419KVM_SYNC_X86_SREGS| \420KVM_SYNC_X86_EVENTS)421422/* kvm_sync_regs struct included by kvm_run struct */423struct kvm_sync_regs {424/* Members of this structure are potentially malicious.425* Care must be taken by code reading, esp. interpreting,426* data fields from them inside KVM to prevent TOCTOU and427* double-fetch types of vulnerabilities.428*/429struct kvm_regs regs;430struct kvm_sregs sregs;431struct kvm_vcpu_events events;432};433434#define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)435#define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)436#define KVM_X86_QUIRK_LAPIC_MMIO_HOLE (1 << 2)437#define KVM_X86_QUIRK_OUT_7E_INC_RIP (1 << 3)438#define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT (1 << 4)439#define KVM_X86_QUIRK_FIX_HYPERCALL_INSN (1 << 5)440#define KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS (1 << 6)441#define KVM_X86_QUIRK_SLOT_ZAP_ALL (1 << 7)442#define KVM_X86_QUIRK_STUFF_FEATURE_MSRS (1 << 8)443#define KVM_X86_QUIRK_IGNORE_GUEST_PAT (1 << 9)444445#define KVM_STATE_NESTED_FORMAT_VMX 0446#define KVM_STATE_NESTED_FORMAT_SVM 1447448#define KVM_STATE_NESTED_GUEST_MODE 0x00000001449#define KVM_STATE_NESTED_RUN_PENDING 0x00000002450#define KVM_STATE_NESTED_EVMCS 0x00000004451#define KVM_STATE_NESTED_MTF_PENDING 0x00000008452#define KVM_STATE_NESTED_GIF_SET 0x00000100453454#define KVM_STATE_NESTED_SMM_GUEST_MODE 0x00000001455#define KVM_STATE_NESTED_SMM_VMXON 0x00000002456457#define KVM_STATE_NESTED_VMX_VMCS_SIZE 0x1000458459#define KVM_STATE_NESTED_SVM_VMCB_SIZE 0x1000460461#define KVM_STATE_VMX_PREEMPTION_TIMER_DEADLINE 0x00000001462463/* vendor-independent attributes for system fd (group 0) */464#define KVM_X86_GRP_SYSTEM 0465# define KVM_X86_XCOMP_GUEST_SUPP 0466467/* vendor-specific groups and attributes for system fd */468#define KVM_X86_GRP_SEV 1469# define KVM_X86_SEV_VMSA_FEATURES 0470471struct kvm_vmx_nested_state_data {472__u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];473__u8 shadow_vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];474};475476struct kvm_vmx_nested_state_hdr {477__u64 vmxon_pa;478__u64 vmcs12_pa;479480struct {481__u16 flags;482} smm;483484__u16 pad;485486__u32 flags;487__u64 preemption_timer_deadline;488};489490struct kvm_svm_nested_state_data {491/* Save area only used if KVM_STATE_NESTED_RUN_PENDING. */492__u8 vmcb12[KVM_STATE_NESTED_SVM_VMCB_SIZE];493};494495struct kvm_svm_nested_state_hdr {496__u64 vmcb_pa;497};498499/* for KVM_CAP_NESTED_STATE */500struct kvm_nested_state {501__u16 flags;502__u16 format;503__u32 size;504505union {506struct kvm_vmx_nested_state_hdr vmx;507struct kvm_svm_nested_state_hdr svm;508509/* Pad the header to 128 bytes. */510__u8 pad[120];511} hdr;512513/*514* Define data region as 0 bytes to preserve backwards-compatability515* to old definition of kvm_nested_state in order to avoid changing516* KVM_{GET,PUT}_NESTED_STATE ioctl values.517*/518union {519__DECLARE_FLEX_ARRAY(struct kvm_vmx_nested_state_data, vmx);520__DECLARE_FLEX_ARRAY(struct kvm_svm_nested_state_data, svm);521} data;522};523524/* for KVM_CAP_PMU_EVENT_FILTER */525struct kvm_pmu_event_filter {526__u32 action;527__u32 nevents;528__u32 fixed_counter_bitmap;529__u32 flags;530__u32 pad[4];531__u64 events[];532};533534#define KVM_PMU_EVENT_ALLOW 0535#define KVM_PMU_EVENT_DENY 1536537#define KVM_PMU_EVENT_FLAG_MASKED_EVENTS _BITUL(0)538#define KVM_PMU_EVENT_FLAGS_VALID_MASK (KVM_PMU_EVENT_FLAG_MASKED_EVENTS)539540/* for KVM_CAP_MCE */541struct kvm_x86_mce {542__u64 status;543__u64 addr;544__u64 misc;545__u64 mcg_status;546__u8 bank;547__u8 pad1[7];548__u64 pad2[3];549};550551/* for KVM_CAP_XEN_HVM */552#define KVM_XEN_HVM_CONFIG_HYPERCALL_MSR (1 << 0)553#define KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL (1 << 1)554#define KVM_XEN_HVM_CONFIG_SHARED_INFO (1 << 2)555#define KVM_XEN_HVM_CONFIG_RUNSTATE (1 << 3)556#define KVM_XEN_HVM_CONFIG_EVTCHN_2LEVEL (1 << 4)557#define KVM_XEN_HVM_CONFIG_EVTCHN_SEND (1 << 5)558#define KVM_XEN_HVM_CONFIG_RUNSTATE_UPDATE_FLAG (1 << 6)559#define KVM_XEN_HVM_CONFIG_PVCLOCK_TSC_UNSTABLE (1 << 7)560#define KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA (1 << 8)561562#define KVM_XEN_MSR_MIN_INDEX 0x40000000u563#define KVM_XEN_MSR_MAX_INDEX 0x4fffffffu564565struct kvm_xen_hvm_config {566__u32 flags;567__u32 msr;568__u64 blob_addr_32;569__u64 blob_addr_64;570__u8 blob_size_32;571__u8 blob_size_64;572__u8 pad2[30];573};574575struct kvm_xen_hvm_attr {576__u16 type;577__u16 pad[3];578union {579__u8 long_mode;580__u8 vector;581__u8 runstate_update_flag;582union {583__u64 gfn;584#define KVM_XEN_INVALID_GFN ((__u64)-1)585__u64 hva;586} shared_info;587struct {588__u32 send_port;589__u32 type; /* EVTCHNSTAT_ipi / EVTCHNSTAT_interdomain */590__u32 flags;591#define KVM_XEN_EVTCHN_DEASSIGN (1 << 0)592#define KVM_XEN_EVTCHN_UPDATE (1 << 1)593#define KVM_XEN_EVTCHN_RESET (1 << 2)594/*595* Events sent by the guest are either looped back to596* the guest itself (potentially on a different port#)597* or signalled via an eventfd.598*/599union {600struct {601__u32 port;602__u32 vcpu;603__u32 priority;604} port;605struct {606__u32 port; /* Zero for eventfd */607__s32 fd;608} eventfd;609__u32 padding[4];610} deliver;611} evtchn;612__u32 xen_version;613__u64 pad[8];614} u;615};616617618/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO */619#define KVM_XEN_ATTR_TYPE_LONG_MODE 0x0620#define KVM_XEN_ATTR_TYPE_SHARED_INFO 0x1621#define KVM_XEN_ATTR_TYPE_UPCALL_VECTOR 0x2622/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_EVTCHN_SEND */623#define KVM_XEN_ATTR_TYPE_EVTCHN 0x3624#define KVM_XEN_ATTR_TYPE_XEN_VERSION 0x4625/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_RUNSTATE_UPDATE_FLAG */626#define KVM_XEN_ATTR_TYPE_RUNSTATE_UPDATE_FLAG 0x5627/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA */628#define KVM_XEN_ATTR_TYPE_SHARED_INFO_HVA 0x6629630struct kvm_xen_vcpu_attr {631__u16 type;632__u16 pad[3];633union {634__u64 gpa;635#define KVM_XEN_INVALID_GPA ((__u64)-1)636__u64 hva;637__u64 pad[8];638struct {639__u64 state;640__u64 state_entry_time;641__u64 time_running;642__u64 time_runnable;643__u64 time_blocked;644__u64 time_offline;645} runstate;646__u32 vcpu_id;647struct {648__u32 port;649__u32 priority;650__u64 expires_ns;651} timer;652__u8 vector;653} u;654};655656/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO */657#define KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO 0x0658#define KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO 0x1659#define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR 0x2660#define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_CURRENT 0x3661#define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_DATA 0x4662#define KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADJUST 0x5663/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_EVTCHN_SEND */664#define KVM_XEN_VCPU_ATTR_TYPE_VCPU_ID 0x6665#define KVM_XEN_VCPU_ATTR_TYPE_TIMER 0x7666#define KVM_XEN_VCPU_ATTR_TYPE_UPCALL_VECTOR 0x8667/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO_HVA */668#define KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO_HVA 0x9669670/* Secure Encrypted Virtualization command */671enum sev_cmd_id {672/* Guest initialization commands */673KVM_SEV_INIT = 0,674KVM_SEV_ES_INIT,675/* Guest launch commands */676KVM_SEV_LAUNCH_START,677KVM_SEV_LAUNCH_UPDATE_DATA,678KVM_SEV_LAUNCH_UPDATE_VMSA,679KVM_SEV_LAUNCH_SECRET,680KVM_SEV_LAUNCH_MEASURE,681KVM_SEV_LAUNCH_FINISH,682/* Guest migration commands (outgoing) */683KVM_SEV_SEND_START,684KVM_SEV_SEND_UPDATE_DATA,685KVM_SEV_SEND_UPDATE_VMSA,686KVM_SEV_SEND_FINISH,687/* Guest migration commands (incoming) */688KVM_SEV_RECEIVE_START,689KVM_SEV_RECEIVE_UPDATE_DATA,690KVM_SEV_RECEIVE_UPDATE_VMSA,691KVM_SEV_RECEIVE_FINISH,692/* Guest status and debug commands */693KVM_SEV_GUEST_STATUS,694KVM_SEV_DBG_DECRYPT,695KVM_SEV_DBG_ENCRYPT,696/* Guest certificates commands */697KVM_SEV_CERT_EXPORT,698/* Attestation report */699KVM_SEV_GET_ATTESTATION_REPORT,700/* Guest Migration Extension */701KVM_SEV_SEND_CANCEL,702703/* Second time is the charm; improved versions of the above ioctls. */704KVM_SEV_INIT2,705706/* SNP-specific commands */707KVM_SEV_SNP_LAUNCH_START = 100,708KVM_SEV_SNP_LAUNCH_UPDATE,709KVM_SEV_SNP_LAUNCH_FINISH,710711KVM_SEV_NR_MAX,712};713714struct kvm_sev_cmd {715__u32 id;716__u32 pad0;717__u64 data;718__u32 error;719__u32 sev_fd;720};721722struct kvm_sev_init {723__u64 vmsa_features;724__u32 flags;725__u16 ghcb_version;726__u16 pad1;727__u32 pad2[8];728};729730struct kvm_sev_launch_start {731__u32 handle;732__u32 policy;733__u64 dh_uaddr;734__u32 dh_len;735__u32 pad0;736__u64 session_uaddr;737__u32 session_len;738__u32 pad1;739};740741struct kvm_sev_launch_update_data {742__u64 uaddr;743__u32 len;744__u32 pad0;745};746747748struct kvm_sev_launch_secret {749__u64 hdr_uaddr;750__u32 hdr_len;751__u32 pad0;752__u64 guest_uaddr;753__u32 guest_len;754__u32 pad1;755__u64 trans_uaddr;756__u32 trans_len;757__u32 pad2;758};759760struct kvm_sev_launch_measure {761__u64 uaddr;762__u32 len;763__u32 pad0;764};765766struct kvm_sev_guest_status {767__u32 handle;768__u32 policy;769__u32 state;770};771772struct kvm_sev_dbg {773__u64 src_uaddr;774__u64 dst_uaddr;775__u32 len;776__u32 pad0;777};778779struct kvm_sev_attestation_report {780__u8 mnonce[16];781__u64 uaddr;782__u32 len;783__u32 pad0;784};785786struct kvm_sev_send_start {787__u32 policy;788__u32 pad0;789__u64 pdh_cert_uaddr;790__u32 pdh_cert_len;791__u32 pad1;792__u64 plat_certs_uaddr;793__u32 plat_certs_len;794__u32 pad2;795__u64 amd_certs_uaddr;796__u32 amd_certs_len;797__u32 pad3;798__u64 session_uaddr;799__u32 session_len;800__u32 pad4;801};802803struct kvm_sev_send_update_data {804__u64 hdr_uaddr;805__u32 hdr_len;806__u32 pad0;807__u64 guest_uaddr;808__u32 guest_len;809__u32 pad1;810__u64 trans_uaddr;811__u32 trans_len;812__u32 pad2;813};814815struct kvm_sev_receive_start {816__u32 handle;817__u32 policy;818__u64 pdh_uaddr;819__u32 pdh_len;820__u32 pad0;821__u64 session_uaddr;822__u32 session_len;823__u32 pad1;824};825826struct kvm_sev_receive_update_data {827__u64 hdr_uaddr;828__u32 hdr_len;829__u32 pad0;830__u64 guest_uaddr;831__u32 guest_len;832__u32 pad1;833__u64 trans_uaddr;834__u32 trans_len;835__u32 pad2;836};837838struct kvm_sev_snp_launch_start {839__u64 policy;840__u8 gosvw[16];841__u16 flags;842__u8 pad0[6];843__u64 pad1[4];844};845846/* Kept in sync with firmware values for simplicity. */847#define KVM_SEV_PAGE_TYPE_INVALID 0x0848#define KVM_SEV_SNP_PAGE_TYPE_NORMAL 0x1849#define KVM_SEV_SNP_PAGE_TYPE_ZERO 0x3850#define KVM_SEV_SNP_PAGE_TYPE_UNMEASURED 0x4851#define KVM_SEV_SNP_PAGE_TYPE_SECRETS 0x5852#define KVM_SEV_SNP_PAGE_TYPE_CPUID 0x6853854struct kvm_sev_snp_launch_update {855__u64 gfn_start;856__u64 uaddr;857__u64 len;858__u8 type;859__u8 pad0;860__u16 flags;861__u32 pad1;862__u64 pad2[4];863};864865#define KVM_SEV_SNP_ID_BLOCK_SIZE 96866#define KVM_SEV_SNP_ID_AUTH_SIZE 4096867#define KVM_SEV_SNP_FINISH_DATA_SIZE 32868869struct kvm_sev_snp_launch_finish {870__u64 id_block_uaddr;871__u64 id_auth_uaddr;872__u8 id_block_en;873__u8 auth_key_en;874__u8 vcek_disabled;875__u8 host_data[KVM_SEV_SNP_FINISH_DATA_SIZE];876__u8 pad0[3];877__u16 flags;878__u64 pad1[4];879};880881#define KVM_X2APIC_API_USE_32BIT_IDS (1ULL << 0)882#define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK (1ULL << 1)883884struct kvm_hyperv_eventfd {885__u32 conn_id;886__s32 fd;887__u32 flags;888__u32 padding[3];889};890891#define KVM_HYPERV_CONN_ID_MASK 0x00ffffff892#define KVM_HYPERV_EVENTFD_DEASSIGN (1 << 0)893894/*895* Masked event layout.896* Bits Description897* ---- -----------898* 7:0 event select (low bits)899* 15:8 umask match900* 31:16 unused901* 35:32 event select (high bits)902* 36:54 unused903* 55 exclude bit904* 63:56 umask mask905*/906907#define KVM_PMU_ENCODE_MASKED_ENTRY(event_select, mask, match, exclude) \908(((event_select) & 0xFFULL) | (((event_select) & 0XF00ULL) << 24) | \909(((mask) & 0xFFULL) << 56) | \910(((match) & 0xFFULL) << 8) | \911((__u64)(!!(exclude)) << 55))912913#define KVM_PMU_MASKED_ENTRY_EVENT_SELECT \914(__GENMASK_ULL(7, 0) | __GENMASK_ULL(35, 32))915#define KVM_PMU_MASKED_ENTRY_UMASK_MASK (__GENMASK_ULL(63, 56))916#define KVM_PMU_MASKED_ENTRY_UMASK_MATCH (__GENMASK_ULL(15, 8))917#define KVM_PMU_MASKED_ENTRY_EXCLUDE (_BITULL(55))918#define KVM_PMU_MASKED_ENTRY_UMASK_MASK_SHIFT (56)919920/* for KVM_{GET,SET,HAS}_DEVICE_ATTR */921#define KVM_VCPU_TSC_CTRL 0 /* control group for the timestamp counter (TSC) */922#define KVM_VCPU_TSC_OFFSET 0 /* attribute for the TSC offset */923924/* x86-specific KVM_EXIT_HYPERCALL flags. */925#define KVM_EXIT_HYPERCALL_LONG_MODE _BITULL(0)926927#define KVM_X86_DEFAULT_VM 0928#define KVM_X86_SW_PROTECTED_VM 1929#define KVM_X86_SEV_VM 2930#define KVM_X86_SEV_ES_VM 3931#define KVM_X86_SNP_VM 4932#define KVM_X86_TDX_VM 5933934/* Trust Domain eXtension sub-ioctl() commands. */935enum kvm_tdx_cmd_id {936KVM_TDX_CAPABILITIES = 0,937KVM_TDX_INIT_VM,938KVM_TDX_INIT_VCPU,939KVM_TDX_INIT_MEM_REGION,940KVM_TDX_FINALIZE_VM,941KVM_TDX_GET_CPUID,942943KVM_TDX_CMD_NR_MAX,944};945946struct kvm_tdx_cmd {947/* enum kvm_tdx_cmd_id */948__u32 id;949/* flags for sub-commend. If sub-command doesn't use this, set zero. */950__u32 flags;951/*952* data for each sub-command. An immediate or a pointer to the actual953* data in process virtual address. If sub-command doesn't use it,954* set zero.955*/956__u64 data;957/*958* Auxiliary error code. The sub-command may return TDX SEAMCALL959* status code in addition to -Exxx.960*/961__u64 hw_error;962};963964struct kvm_tdx_capabilities {965__u64 supported_attrs;966__u64 supported_xfam;967968__u64 kernel_tdvmcallinfo_1_r11;969__u64 user_tdvmcallinfo_1_r11;970__u64 kernel_tdvmcallinfo_1_r12;971__u64 user_tdvmcallinfo_1_r12;972973__u64 reserved[250];974975/* Configurable CPUID bits for userspace */976struct kvm_cpuid2 cpuid;977};978979struct kvm_tdx_init_vm {980__u64 attributes;981__u64 xfam;982__u64 mrconfigid[6]; /* sha384 digest */983__u64 mrowner[6]; /* sha384 digest */984__u64 mrownerconfig[6]; /* sha384 digest */985986/* The total space for TD_PARAMS before the CPUIDs is 256 bytes */987__u64 reserved[12];988989/*990* Call KVM_TDX_INIT_VM before vcpu creation, thus before991* KVM_SET_CPUID2.992* This configuration supersedes KVM_SET_CPUID2s for VCPUs because the993* TDX module directly virtualizes those CPUIDs without VMM. The user994* space VMM, e.g. qemu, should make KVM_SET_CPUID2 consistent with995* those values. If it doesn't, KVM may have wrong idea of vCPUIDs of996* the guest, and KVM may wrongly emulate CPUIDs or MSRs that the TDX997* module doesn't virtualize.998*/999struct kvm_cpuid2 cpuid;1000};10011002#define KVM_TDX_MEASURE_MEMORY_REGION _BITULL(0)10031004struct kvm_tdx_init_mem_region {1005__u64 source_addr;1006__u64 gpa;1007__u64 nr_pages;1008};10091010#endif /* _ASM_X86_KVM_H */101110121013