Path: blob/master/tools/testing/selftests/kvm/include/x86/svm.h
49546 views
/* SPDX-License-Identifier: GPL-2.0 */1#ifndef SELFTEST_KVM_SVM_H2#define SELFTEST_KVM_SVM_H34enum {5INTERCEPT_INTR,6INTERCEPT_NMI,7INTERCEPT_SMI,8INTERCEPT_INIT,9INTERCEPT_VINTR,10INTERCEPT_SELECTIVE_CR0,11INTERCEPT_STORE_IDTR,12INTERCEPT_STORE_GDTR,13INTERCEPT_STORE_LDTR,14INTERCEPT_STORE_TR,15INTERCEPT_LOAD_IDTR,16INTERCEPT_LOAD_GDTR,17INTERCEPT_LOAD_LDTR,18INTERCEPT_LOAD_TR,19INTERCEPT_RDTSC,20INTERCEPT_RDPMC,21INTERCEPT_PUSHF,22INTERCEPT_POPF,23INTERCEPT_CPUID,24INTERCEPT_RSM,25INTERCEPT_IRET,26INTERCEPT_INTn,27INTERCEPT_INVD,28INTERCEPT_PAUSE,29INTERCEPT_HLT,30INTERCEPT_INVLPG,31INTERCEPT_INVLPGA,32INTERCEPT_IOIO_PROT,33INTERCEPT_MSR_PROT,34INTERCEPT_TASK_SWITCH,35INTERCEPT_FERR_FREEZE,36INTERCEPT_SHUTDOWN,37INTERCEPT_VMRUN,38INTERCEPT_VMMCALL,39INTERCEPT_VMLOAD,40INTERCEPT_VMSAVE,41INTERCEPT_STGI,42INTERCEPT_CLGI,43INTERCEPT_SKINIT,44INTERCEPT_RDTSCP,45INTERCEPT_ICEBP,46INTERCEPT_WBINVD,47INTERCEPT_MONITOR,48INTERCEPT_MWAIT,49INTERCEPT_MWAIT_COND,50INTERCEPT_XSETBV,51INTERCEPT_RDPRU,52};5354struct hv_vmcb_enlightenments {55struct __packed hv_enlightenments_control {56u32 nested_flush_hypercall:1;57u32 msr_bitmap:1;58u32 enlightened_npt_tlb: 1;59u32 reserved:29;60} __packed hv_enlightenments_control;61u32 hv_vp_id;62u64 hv_vm_id;63u64 partition_assist_page;64u64 reserved;65} __packed;6667/*68* Hyper-V uses the software reserved clean bit in VMCB69*/70#define HV_VMCB_NESTED_ENLIGHTENMENTS (1U << 31)7172/* Synthetic VM-Exit */73#define HV_SVM_EXITCODE_ENL 0xf000000074#define HV_SVM_ENL_EXITCODE_TRAP_AFTER_FLUSH (1)7576struct __attribute__ ((__packed__)) vmcb_control_area {77u32 intercept_cr;78u32 intercept_dr;79u32 intercept_exceptions;80u64 intercept;81u8 reserved_1[40];82u16 pause_filter_thresh;83u16 pause_filter_count;84u64 iopm_base_pa;85u64 msrpm_base_pa;86u64 tsc_offset;87u32 asid;88u8 tlb_ctl;89u8 reserved_2[3];90u32 int_ctl;91u32 int_vector;92u32 int_state;93u8 reserved_3[4];94u32 exit_code;95u32 exit_code_hi;96u64 exit_info_1;97u64 exit_info_2;98u32 exit_int_info;99u32 exit_int_info_err;100u64 nested_ctl;101u64 avic_vapic_bar;102u8 reserved_4[8];103u32 event_inj;104u32 event_inj_err;105u64 nested_cr3;106u64 virt_ext;107u32 clean;108u32 reserved_5;109u64 next_rip;110u8 insn_len;111u8 insn_bytes[15];112u64 avic_backing_page; /* Offset 0xe0 */113u8 reserved_6[8]; /* Offset 0xe8 */114u64 avic_logical_id; /* Offset 0xf0 */115u64 avic_physical_id; /* Offset 0xf8 */116u8 reserved_7[8];117u64 vmsa_pa; /* Used for an SEV-ES guest */118u8 reserved_8[720];119/*120* Offset 0x3e0, 32 bytes reserved121* for use by hypervisor/software.122*/123union {124struct hv_vmcb_enlightenments hv_enlightenments;125u8 reserved_sw[32];126};127};128129130#define TLB_CONTROL_DO_NOTHING 0131#define TLB_CONTROL_FLUSH_ALL_ASID 1132#define TLB_CONTROL_FLUSH_ASID 3133#define TLB_CONTROL_FLUSH_ASID_LOCAL 7134135#define V_TPR_MASK 0x0f136137#define V_IRQ_SHIFT 8138#define V_IRQ_MASK (1 << V_IRQ_SHIFT)139140#define V_GIF_SHIFT 9141#define V_GIF_MASK (1 << V_GIF_SHIFT)142143#define V_INTR_PRIO_SHIFT 16144#define V_INTR_PRIO_MASK (0x0f << V_INTR_PRIO_SHIFT)145146#define V_IGN_TPR_SHIFT 20147#define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT)148149#define V_INTR_MASKING_SHIFT 24150#define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT)151152#define V_GIF_ENABLE_SHIFT 25153#define V_GIF_ENABLE_MASK (1 << V_GIF_ENABLE_SHIFT)154155#define AVIC_ENABLE_SHIFT 31156#define AVIC_ENABLE_MASK (1 << AVIC_ENABLE_SHIFT)157158#define LBR_CTL_ENABLE_MASK BIT_ULL(0)159#define VIRTUAL_VMLOAD_VMSAVE_ENABLE_MASK BIT_ULL(1)160161#define SVM_INTERRUPT_SHADOW_MASK 1162163#define SVM_IOIO_STR_SHIFT 2164#define SVM_IOIO_REP_SHIFT 3165#define SVM_IOIO_SIZE_SHIFT 4166#define SVM_IOIO_ASIZE_SHIFT 7167168#define SVM_IOIO_TYPE_MASK 1169#define SVM_IOIO_STR_MASK (1 << SVM_IOIO_STR_SHIFT)170#define SVM_IOIO_REP_MASK (1 << SVM_IOIO_REP_SHIFT)171#define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT)172#define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT)173174#define SVM_VM_CR_VALID_MASK 0x001fULL175#define SVM_VM_CR_SVM_LOCK_MASK 0x0008ULL176#define SVM_VM_CR_SVM_DIS_MASK 0x0010ULL177178#define SVM_NESTED_CTL_NP_ENABLE BIT(0)179#define SVM_NESTED_CTL_SEV_ENABLE BIT(1)180181struct __attribute__ ((__packed__)) vmcb_seg {182u16 selector;183u16 attrib;184u32 limit;185u64 base;186};187188struct __attribute__ ((__packed__)) vmcb_save_area {189struct vmcb_seg es;190struct vmcb_seg cs;191struct vmcb_seg ss;192struct vmcb_seg ds;193struct vmcb_seg fs;194struct vmcb_seg gs;195struct vmcb_seg gdtr;196struct vmcb_seg ldtr;197struct vmcb_seg idtr;198struct vmcb_seg tr;199u8 reserved_1[43];200u8 cpl;201u8 reserved_2[4];202u64 efer;203u8 reserved_3[112];204u64 cr4;205u64 cr3;206u64 cr0;207u64 dr7;208u64 dr6;209u64 rflags;210u64 rip;211u8 reserved_4[88];212u64 rsp;213u8 reserved_5[24];214u64 rax;215u64 star;216u64 lstar;217u64 cstar;218u64 sfmask;219u64 kernel_gs_base;220u64 sysenter_cs;221u64 sysenter_esp;222u64 sysenter_eip;223u64 cr2;224u8 reserved_6[32];225u64 g_pat;226u64 dbgctl;227u64 br_from;228u64 br_to;229u64 last_excp_from;230u64 last_excp_to;231};232233struct __attribute__ ((__packed__)) vmcb {234struct vmcb_control_area control;235struct vmcb_save_area save;236};237238#define SVM_VM_CR_SVM_DISABLE 4239240#define SVM_SELECTOR_S_SHIFT 4241#define SVM_SELECTOR_DPL_SHIFT 5242#define SVM_SELECTOR_P_SHIFT 7243#define SVM_SELECTOR_AVL_SHIFT 8244#define SVM_SELECTOR_L_SHIFT 9245#define SVM_SELECTOR_DB_SHIFT 10246#define SVM_SELECTOR_G_SHIFT 11247248#define SVM_SELECTOR_TYPE_MASK (0xf)249#define SVM_SELECTOR_S_MASK (1 << SVM_SELECTOR_S_SHIFT)250#define SVM_SELECTOR_DPL_MASK (3 << SVM_SELECTOR_DPL_SHIFT)251#define SVM_SELECTOR_P_MASK (1 << SVM_SELECTOR_P_SHIFT)252#define SVM_SELECTOR_AVL_MASK (1 << SVM_SELECTOR_AVL_SHIFT)253#define SVM_SELECTOR_L_MASK (1 << SVM_SELECTOR_L_SHIFT)254#define SVM_SELECTOR_DB_MASK (1 << SVM_SELECTOR_DB_SHIFT)255#define SVM_SELECTOR_G_MASK (1 << SVM_SELECTOR_G_SHIFT)256257#define SVM_SELECTOR_WRITE_MASK (1 << 1)258#define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK259#define SVM_SELECTOR_CODE_MASK (1 << 3)260261#define INTERCEPT_CR0_READ 0262#define INTERCEPT_CR3_READ 3263#define INTERCEPT_CR4_READ 4264#define INTERCEPT_CR8_READ 8265#define INTERCEPT_CR0_WRITE (16 + 0)266#define INTERCEPT_CR3_WRITE (16 + 3)267#define INTERCEPT_CR4_WRITE (16 + 4)268#define INTERCEPT_CR8_WRITE (16 + 8)269270#define INTERCEPT_DR0_READ 0271#define INTERCEPT_DR1_READ 1272#define INTERCEPT_DR2_READ 2273#define INTERCEPT_DR3_READ 3274#define INTERCEPT_DR4_READ 4275#define INTERCEPT_DR5_READ 5276#define INTERCEPT_DR6_READ 6277#define INTERCEPT_DR7_READ 7278#define INTERCEPT_DR0_WRITE (16 + 0)279#define INTERCEPT_DR1_WRITE (16 + 1)280#define INTERCEPT_DR2_WRITE (16 + 2)281#define INTERCEPT_DR3_WRITE (16 + 3)282#define INTERCEPT_DR4_WRITE (16 + 4)283#define INTERCEPT_DR5_WRITE (16 + 5)284#define INTERCEPT_DR6_WRITE (16 + 6)285#define INTERCEPT_DR7_WRITE (16 + 7)286287#define SVM_EVTINJ_VEC_MASK 0xff288289#define SVM_EVTINJ_TYPE_SHIFT 8290#define SVM_EVTINJ_TYPE_MASK (7 << SVM_EVTINJ_TYPE_SHIFT)291292#define SVM_EVTINJ_TYPE_INTR (0 << SVM_EVTINJ_TYPE_SHIFT)293#define SVM_EVTINJ_TYPE_NMI (2 << SVM_EVTINJ_TYPE_SHIFT)294#define SVM_EVTINJ_TYPE_EXEPT (3 << SVM_EVTINJ_TYPE_SHIFT)295#define SVM_EVTINJ_TYPE_SOFT (4 << SVM_EVTINJ_TYPE_SHIFT)296297#define SVM_EVTINJ_VALID (1 << 31)298#define SVM_EVTINJ_VALID_ERR (1 << 11)299300#define SVM_EXITINTINFO_VEC_MASK SVM_EVTINJ_VEC_MASK301#define SVM_EXITINTINFO_TYPE_MASK SVM_EVTINJ_TYPE_MASK302303#define SVM_EXITINTINFO_TYPE_INTR SVM_EVTINJ_TYPE_INTR304#define SVM_EXITINTINFO_TYPE_NMI SVM_EVTINJ_TYPE_NMI305#define SVM_EXITINTINFO_TYPE_EXEPT SVM_EVTINJ_TYPE_EXEPT306#define SVM_EXITINTINFO_TYPE_SOFT SVM_EVTINJ_TYPE_SOFT307308#define SVM_EXITINTINFO_VALID SVM_EVTINJ_VALID309#define SVM_EXITINTINFO_VALID_ERR SVM_EVTINJ_VALID_ERR310311#define SVM_EXITINFOSHIFT_TS_REASON_IRET 36312#define SVM_EXITINFOSHIFT_TS_REASON_JMP 38313#define SVM_EXITINFOSHIFT_TS_HAS_ERROR_CODE 44314315#define SVM_EXITINFO_REG_MASK 0x0F316317#define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP)318319#endif /* SELFTEST_KVM_SVM_H */320321322