17d36db35SAvi Kivity #ifndef __SVM_H 27d36db35SAvi Kivity #define __SVM_H 37d36db35SAvi Kivity 47d36db35SAvi Kivity #include "libcflat.h" 57d36db35SAvi Kivity 67d36db35SAvi Kivity enum { 77d36db35SAvi Kivity INTERCEPT_INTR, 87d36db35SAvi Kivity INTERCEPT_NMI, 97d36db35SAvi Kivity INTERCEPT_SMI, 107d36db35SAvi Kivity INTERCEPT_INIT, 117d36db35SAvi Kivity INTERCEPT_VINTR, 127d36db35SAvi Kivity INTERCEPT_SELECTIVE_CR0, 137d36db35SAvi Kivity INTERCEPT_STORE_IDTR, 147d36db35SAvi Kivity INTERCEPT_STORE_GDTR, 157d36db35SAvi Kivity INTERCEPT_STORE_LDTR, 167d36db35SAvi Kivity INTERCEPT_STORE_TR, 177d36db35SAvi Kivity INTERCEPT_LOAD_IDTR, 187d36db35SAvi Kivity INTERCEPT_LOAD_GDTR, 197d36db35SAvi Kivity INTERCEPT_LOAD_LDTR, 207d36db35SAvi Kivity INTERCEPT_LOAD_TR, 217d36db35SAvi Kivity INTERCEPT_RDTSC, 227d36db35SAvi Kivity INTERCEPT_RDPMC, 237d36db35SAvi Kivity INTERCEPT_PUSHF, 247d36db35SAvi Kivity INTERCEPT_POPF, 257d36db35SAvi Kivity INTERCEPT_CPUID, 267d36db35SAvi Kivity INTERCEPT_RSM, 277d36db35SAvi Kivity INTERCEPT_IRET, 287d36db35SAvi Kivity INTERCEPT_INTn, 297d36db35SAvi Kivity INTERCEPT_INVD, 307d36db35SAvi Kivity INTERCEPT_PAUSE, 317d36db35SAvi Kivity INTERCEPT_HLT, 327d36db35SAvi Kivity INTERCEPT_INVLPG, 337d36db35SAvi Kivity INTERCEPT_INVLPGA, 347d36db35SAvi Kivity INTERCEPT_IOIO_PROT, 357d36db35SAvi Kivity INTERCEPT_MSR_PROT, 367d36db35SAvi Kivity INTERCEPT_TASK_SWITCH, 377d36db35SAvi Kivity INTERCEPT_FERR_FREEZE, 387d36db35SAvi Kivity INTERCEPT_SHUTDOWN, 397d36db35SAvi Kivity INTERCEPT_VMRUN, 407d36db35SAvi Kivity INTERCEPT_VMMCALL, 417d36db35SAvi Kivity INTERCEPT_VMLOAD, 427d36db35SAvi Kivity INTERCEPT_VMSAVE, 437d36db35SAvi Kivity INTERCEPT_STGI, 447d36db35SAvi Kivity INTERCEPT_CLGI, 457d36db35SAvi Kivity INTERCEPT_SKINIT, 467d36db35SAvi Kivity INTERCEPT_RDTSCP, 477d36db35SAvi Kivity INTERCEPT_ICEBP, 487d36db35SAvi Kivity INTERCEPT_WBINVD, 497d36db35SAvi Kivity INTERCEPT_MONITOR, 507d36db35SAvi Kivity INTERCEPT_MWAIT, 517d36db35SAvi Kivity INTERCEPT_MWAIT_COND, 527d36db35SAvi Kivity }; 537d36db35SAvi Kivity 54*f7fa53dcSPaolo Bonzini enum { 55*f7fa53dcSPaolo Bonzini VMCB_CLEAN_INTERCEPTS = 1, /* Intercept vectors, TSC offset, pause filter count */ 56*f7fa53dcSPaolo Bonzini VMCB_CLEAN_PERM_MAP = 2, /* IOPM Base and MSRPM Base */ 57*f7fa53dcSPaolo Bonzini VMCB_CLEAN_ASID = 4, /* ASID */ 58*f7fa53dcSPaolo Bonzini VMCB_CLEAN_INTR = 8, /* int_ctl, int_vector */ 59*f7fa53dcSPaolo Bonzini VMCB_CLEAN_NPT = 16, /* npt_en, nCR3, gPAT */ 60*f7fa53dcSPaolo Bonzini VMCB_CLEAN_CR = 32, /* CR0, CR3, CR4, EFER */ 61*f7fa53dcSPaolo Bonzini VMCB_CLEAN_DR = 64, /* DR6, DR7 */ 62*f7fa53dcSPaolo Bonzini VMCB_CLEAN_DT = 128, /* GDT, IDT */ 63*f7fa53dcSPaolo Bonzini VMCB_CLEAN_SEG = 256, /* CS, DS, SS, ES, CPL */ 64*f7fa53dcSPaolo Bonzini VMCB_CLEAN_CR2 = 512, /* CR2 only */ 65*f7fa53dcSPaolo Bonzini VMCB_CLEAN_LBR = 1024, /* DBGCTL, BR_FROM, BR_TO, LAST_EX_FROM, LAST_EX_TO */ 66*f7fa53dcSPaolo Bonzini VMCB_CLEAN_AVIC = 2048, /* APIC_BAR, APIC_BACKING_PAGE, 67*f7fa53dcSPaolo Bonzini PHYSICAL_TABLE pointer, LOGICAL_TABLE pointer */ 68*f7fa53dcSPaolo Bonzini VMCB_CLEAN_ALL = 4095, 69*f7fa53dcSPaolo Bonzini }; 707d36db35SAvi Kivity 717d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb_control_area { 727d36db35SAvi Kivity u16 intercept_cr_read; 737d36db35SAvi Kivity u16 intercept_cr_write; 747d36db35SAvi Kivity u16 intercept_dr_read; 757d36db35SAvi Kivity u16 intercept_dr_write; 767d36db35SAvi Kivity u32 intercept_exceptions; 777d36db35SAvi Kivity u64 intercept; 787d36db35SAvi Kivity u8 reserved_1[42]; 797d36db35SAvi Kivity u16 pause_filter_count; 807d36db35SAvi Kivity u64 iopm_base_pa; 817d36db35SAvi Kivity u64 msrpm_base_pa; 827d36db35SAvi Kivity u64 tsc_offset; 837d36db35SAvi Kivity u32 asid; 847d36db35SAvi Kivity u8 tlb_ctl; 857d36db35SAvi Kivity u8 reserved_2[3]; 867d36db35SAvi Kivity u32 int_ctl; 877d36db35SAvi Kivity u32 int_vector; 887d36db35SAvi Kivity u32 int_state; 897d36db35SAvi Kivity u8 reserved_3[4]; 907d36db35SAvi Kivity u32 exit_code; 917d36db35SAvi Kivity u32 exit_code_hi; 927d36db35SAvi Kivity u64 exit_info_1; 937d36db35SAvi Kivity u64 exit_info_2; 947d36db35SAvi Kivity u32 exit_int_info; 957d36db35SAvi Kivity u32 exit_int_info_err; 967d36db35SAvi Kivity u64 nested_ctl; 977d36db35SAvi Kivity u8 reserved_4[16]; 987d36db35SAvi Kivity u32 event_inj; 997d36db35SAvi Kivity u32 event_inj_err; 1007d36db35SAvi Kivity u64 nested_cr3; 1017d36db35SAvi Kivity u64 lbr_ctl; 102*f7fa53dcSPaolo Bonzini u32 clean; 103*f7fa53dcSPaolo Bonzini u32 reserved_5; 1047d36db35SAvi Kivity u64 next_rip; 105*f7fa53dcSPaolo Bonzini u8 insn_len; 106*f7fa53dcSPaolo Bonzini u8 insn_bytes[15]; 107*f7fa53dcSPaolo Bonzini u8 reserved_6[800]; 1087d36db35SAvi Kivity }; 1097d36db35SAvi Kivity 1107d36db35SAvi Kivity #define TLB_CONTROL_DO_NOTHING 0 1117d36db35SAvi Kivity #define TLB_CONTROL_FLUSH_ALL_ASID 1 1127d36db35SAvi Kivity 1137d36db35SAvi Kivity #define V_TPR_MASK 0x0f 1147d36db35SAvi Kivity 1157d36db35SAvi Kivity #define V_IRQ_SHIFT 8 1167d36db35SAvi Kivity #define V_IRQ_MASK (1 << V_IRQ_SHIFT) 1177d36db35SAvi Kivity 1187d36db35SAvi Kivity #define V_INTR_PRIO_SHIFT 16 1197d36db35SAvi Kivity #define V_INTR_PRIO_MASK (0x0f << V_INTR_PRIO_SHIFT) 1207d36db35SAvi Kivity 1217d36db35SAvi Kivity #define V_IGN_TPR_SHIFT 20 1227d36db35SAvi Kivity #define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT) 1237d36db35SAvi Kivity 1247d36db35SAvi Kivity #define V_INTR_MASKING_SHIFT 24 1257d36db35SAvi Kivity #define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT) 1267d36db35SAvi Kivity 1277d36db35SAvi Kivity #define SVM_INTERRUPT_SHADOW_MASK 1 1287d36db35SAvi Kivity 1297d36db35SAvi Kivity #define SVM_IOIO_STR_SHIFT 2 1307d36db35SAvi Kivity #define SVM_IOIO_REP_SHIFT 3 1317d36db35SAvi Kivity #define SVM_IOIO_SIZE_SHIFT 4 1327d36db35SAvi Kivity #define SVM_IOIO_ASIZE_SHIFT 7 1337d36db35SAvi Kivity 1347d36db35SAvi Kivity #define SVM_IOIO_TYPE_MASK 1 1357d36db35SAvi Kivity #define SVM_IOIO_STR_MASK (1 << SVM_IOIO_STR_SHIFT) 1367d36db35SAvi Kivity #define SVM_IOIO_REP_MASK (1 << SVM_IOIO_REP_SHIFT) 1377d36db35SAvi Kivity #define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT) 1387d36db35SAvi Kivity #define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT) 1397d36db35SAvi Kivity 1407d36db35SAvi Kivity #define SVM_VM_CR_VALID_MASK 0x001fULL 1417d36db35SAvi Kivity #define SVM_VM_CR_SVM_LOCK_MASK 0x0008ULL 1427d36db35SAvi Kivity #define SVM_VM_CR_SVM_DIS_MASK 0x0010ULL 1437d36db35SAvi Kivity 1447d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb_seg { 1457d36db35SAvi Kivity u16 selector; 1467d36db35SAvi Kivity u16 attrib; 1477d36db35SAvi Kivity u32 limit; 1487d36db35SAvi Kivity u64 base; 1497d36db35SAvi Kivity }; 1507d36db35SAvi Kivity 1517d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb_save_area { 1527d36db35SAvi Kivity struct vmcb_seg es; 1537d36db35SAvi Kivity struct vmcb_seg cs; 1547d36db35SAvi Kivity struct vmcb_seg ss; 1557d36db35SAvi Kivity struct vmcb_seg ds; 1567d36db35SAvi Kivity struct vmcb_seg fs; 1577d36db35SAvi Kivity struct vmcb_seg gs; 1587d36db35SAvi Kivity struct vmcb_seg gdtr; 1597d36db35SAvi Kivity struct vmcb_seg ldtr; 1607d36db35SAvi Kivity struct vmcb_seg idtr; 1617d36db35SAvi Kivity struct vmcb_seg tr; 1627d36db35SAvi Kivity u8 reserved_1[43]; 1637d36db35SAvi Kivity u8 cpl; 1647d36db35SAvi Kivity u8 reserved_2[4]; 1657d36db35SAvi Kivity u64 efer; 1667d36db35SAvi Kivity u8 reserved_3[112]; 1677d36db35SAvi Kivity u64 cr4; 1687d36db35SAvi Kivity u64 cr3; 1697d36db35SAvi Kivity u64 cr0; 1707d36db35SAvi Kivity u64 dr7; 1717d36db35SAvi Kivity u64 dr6; 1727d36db35SAvi Kivity u64 rflags; 1737d36db35SAvi Kivity u64 rip; 1747d36db35SAvi Kivity u8 reserved_4[88]; 1757d36db35SAvi Kivity u64 rsp; 1767d36db35SAvi Kivity u8 reserved_5[24]; 1777d36db35SAvi Kivity u64 rax; 1787d36db35SAvi Kivity u64 star; 1797d36db35SAvi Kivity u64 lstar; 1807d36db35SAvi Kivity u64 cstar; 1817d36db35SAvi Kivity u64 sfmask; 1827d36db35SAvi Kivity u64 kernel_gs_base; 1837d36db35SAvi Kivity u64 sysenter_cs; 1847d36db35SAvi Kivity u64 sysenter_esp; 1857d36db35SAvi Kivity u64 sysenter_eip; 1867d36db35SAvi Kivity u64 cr2; 1877d36db35SAvi Kivity u8 reserved_6[32]; 1887d36db35SAvi Kivity u64 g_pat; 1897d36db35SAvi Kivity u64 dbgctl; 1907d36db35SAvi Kivity u64 br_from; 1917d36db35SAvi Kivity u64 br_to; 1927d36db35SAvi Kivity u64 last_excp_from; 1937d36db35SAvi Kivity u64 last_excp_to; 1947d36db35SAvi Kivity }; 1957d36db35SAvi Kivity 1967d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb { 1977d36db35SAvi Kivity struct vmcb_control_area control; 1987d36db35SAvi Kivity struct vmcb_save_area save; 1997d36db35SAvi Kivity }; 2007d36db35SAvi Kivity 2017d36db35SAvi Kivity #define SVM_CPUID_FEATURE_SHIFT 2 2027d36db35SAvi Kivity #define SVM_CPUID_FUNC 0x8000000a 2037d36db35SAvi Kivity 2047d36db35SAvi Kivity #define SVM_VM_CR_SVM_DISABLE 4 2057d36db35SAvi Kivity 2067d36db35SAvi Kivity #define SVM_SELECTOR_S_SHIFT 4 2077d36db35SAvi Kivity #define SVM_SELECTOR_DPL_SHIFT 5 2087d36db35SAvi Kivity #define SVM_SELECTOR_P_SHIFT 7 2097d36db35SAvi Kivity #define SVM_SELECTOR_AVL_SHIFT 8 2107d36db35SAvi Kivity #define SVM_SELECTOR_L_SHIFT 9 2117d36db35SAvi Kivity #define SVM_SELECTOR_DB_SHIFT 10 2127d36db35SAvi Kivity #define SVM_SELECTOR_G_SHIFT 11 2137d36db35SAvi Kivity 2147d36db35SAvi Kivity #define SVM_SELECTOR_TYPE_MASK (0xf) 2157d36db35SAvi Kivity #define SVM_SELECTOR_S_MASK (1 << SVM_SELECTOR_S_SHIFT) 2167d36db35SAvi Kivity #define SVM_SELECTOR_DPL_MASK (3 << SVM_SELECTOR_DPL_SHIFT) 2177d36db35SAvi Kivity #define SVM_SELECTOR_P_MASK (1 << SVM_SELECTOR_P_SHIFT) 2187d36db35SAvi Kivity #define SVM_SELECTOR_AVL_MASK (1 << SVM_SELECTOR_AVL_SHIFT) 2197d36db35SAvi Kivity #define SVM_SELECTOR_L_MASK (1 << SVM_SELECTOR_L_SHIFT) 2207d36db35SAvi Kivity #define SVM_SELECTOR_DB_MASK (1 << SVM_SELECTOR_DB_SHIFT) 2217d36db35SAvi Kivity #define SVM_SELECTOR_G_MASK (1 << SVM_SELECTOR_G_SHIFT) 2227d36db35SAvi Kivity 2237d36db35SAvi Kivity #define SVM_SELECTOR_WRITE_MASK (1 << 1) 2247d36db35SAvi Kivity #define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK 2257d36db35SAvi Kivity #define SVM_SELECTOR_CODE_MASK (1 << 3) 2267d36db35SAvi Kivity 2277d36db35SAvi Kivity #define INTERCEPT_CR0_MASK 1 2287d36db35SAvi Kivity #define INTERCEPT_CR3_MASK (1 << 3) 2297d36db35SAvi Kivity #define INTERCEPT_CR4_MASK (1 << 4) 2307d36db35SAvi Kivity #define INTERCEPT_CR8_MASK (1 << 8) 2317d36db35SAvi Kivity 2327d36db35SAvi Kivity #define INTERCEPT_DR0_MASK 1 2337d36db35SAvi Kivity #define INTERCEPT_DR1_MASK (1 << 1) 2347d36db35SAvi Kivity #define INTERCEPT_DR2_MASK (1 << 2) 2357d36db35SAvi Kivity #define INTERCEPT_DR3_MASK (1 << 3) 2367d36db35SAvi Kivity #define INTERCEPT_DR4_MASK (1 << 4) 2377d36db35SAvi Kivity #define INTERCEPT_DR5_MASK (1 << 5) 2387d36db35SAvi Kivity #define INTERCEPT_DR6_MASK (1 << 6) 2397d36db35SAvi Kivity #define INTERCEPT_DR7_MASK (1 << 7) 2407d36db35SAvi Kivity 2417d36db35SAvi Kivity #define SVM_EVTINJ_VEC_MASK 0xff 2427d36db35SAvi Kivity 2437d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_SHIFT 8 2447d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_MASK (7 << SVM_EVTINJ_TYPE_SHIFT) 2457d36db35SAvi Kivity 2467d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_INTR (0 << SVM_EVTINJ_TYPE_SHIFT) 2477d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_NMI (2 << SVM_EVTINJ_TYPE_SHIFT) 2487d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_EXEPT (3 << SVM_EVTINJ_TYPE_SHIFT) 2497d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_SOFT (4 << SVM_EVTINJ_TYPE_SHIFT) 2507d36db35SAvi Kivity 2517d36db35SAvi Kivity #define SVM_EVTINJ_VALID (1 << 31) 2527d36db35SAvi Kivity #define SVM_EVTINJ_VALID_ERR (1 << 11) 2537d36db35SAvi Kivity 2547d36db35SAvi Kivity #define SVM_EXITINTINFO_VEC_MASK SVM_EVTINJ_VEC_MASK 2557d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_MASK SVM_EVTINJ_TYPE_MASK 2567d36db35SAvi Kivity 2577d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_INTR SVM_EVTINJ_TYPE_INTR 2587d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_NMI SVM_EVTINJ_TYPE_NMI 2597d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_EXEPT SVM_EVTINJ_TYPE_EXEPT 2607d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_SOFT SVM_EVTINJ_TYPE_SOFT 2617d36db35SAvi Kivity 2627d36db35SAvi Kivity #define SVM_EXITINTINFO_VALID SVM_EVTINJ_VALID 2637d36db35SAvi Kivity #define SVM_EXITINTINFO_VALID_ERR SVM_EVTINJ_VALID_ERR 2647d36db35SAvi Kivity 2657d36db35SAvi Kivity #define SVM_EXITINFOSHIFT_TS_REASON_IRET 36 2667d36db35SAvi Kivity #define SVM_EXITINFOSHIFT_TS_REASON_JMP 38 2677d36db35SAvi Kivity #define SVM_EXITINFOSHIFT_TS_HAS_ERROR_CODE 44 2687d36db35SAvi Kivity 2697d36db35SAvi Kivity #define SVM_EXIT_READ_CR0 0x000 2707d36db35SAvi Kivity #define SVM_EXIT_READ_CR3 0x003 2717d36db35SAvi Kivity #define SVM_EXIT_READ_CR4 0x004 2727d36db35SAvi Kivity #define SVM_EXIT_READ_CR8 0x008 2737d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR0 0x010 2747d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR3 0x013 2757d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR4 0x014 2767d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR8 0x018 2777d36db35SAvi Kivity #define SVM_EXIT_READ_DR0 0x020 2787d36db35SAvi Kivity #define SVM_EXIT_READ_DR1 0x021 2797d36db35SAvi Kivity #define SVM_EXIT_READ_DR2 0x022 2807d36db35SAvi Kivity #define SVM_EXIT_READ_DR3 0x023 2817d36db35SAvi Kivity #define SVM_EXIT_READ_DR4 0x024 2827d36db35SAvi Kivity #define SVM_EXIT_READ_DR5 0x025 2837d36db35SAvi Kivity #define SVM_EXIT_READ_DR6 0x026 2847d36db35SAvi Kivity #define SVM_EXIT_READ_DR7 0x027 2857d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR0 0x030 2867d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR1 0x031 2877d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR2 0x032 2887d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR3 0x033 2897d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR4 0x034 2907d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR5 0x035 2917d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR6 0x036 2927d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR7 0x037 2937d36db35SAvi Kivity #define SVM_EXIT_EXCP_BASE 0x040 2947d36db35SAvi Kivity #define SVM_EXIT_INTR 0x060 2957d36db35SAvi Kivity #define SVM_EXIT_NMI 0x061 2967d36db35SAvi Kivity #define SVM_EXIT_SMI 0x062 2977d36db35SAvi Kivity #define SVM_EXIT_INIT 0x063 2987d36db35SAvi Kivity #define SVM_EXIT_VINTR 0x064 2997d36db35SAvi Kivity #define SVM_EXIT_CR0_SEL_WRITE 0x065 3007d36db35SAvi Kivity #define SVM_EXIT_IDTR_READ 0x066 3017d36db35SAvi Kivity #define SVM_EXIT_GDTR_READ 0x067 3027d36db35SAvi Kivity #define SVM_EXIT_LDTR_READ 0x068 3037d36db35SAvi Kivity #define SVM_EXIT_TR_READ 0x069 3047d36db35SAvi Kivity #define SVM_EXIT_IDTR_WRITE 0x06a 3057d36db35SAvi Kivity #define SVM_EXIT_GDTR_WRITE 0x06b 3067d36db35SAvi Kivity #define SVM_EXIT_LDTR_WRITE 0x06c 3077d36db35SAvi Kivity #define SVM_EXIT_TR_WRITE 0x06d 3087d36db35SAvi Kivity #define SVM_EXIT_RDTSC 0x06e 3097d36db35SAvi Kivity #define SVM_EXIT_RDPMC 0x06f 3107d36db35SAvi Kivity #define SVM_EXIT_PUSHF 0x070 3117d36db35SAvi Kivity #define SVM_EXIT_POPF 0x071 3127d36db35SAvi Kivity #define SVM_EXIT_CPUID 0x072 3137d36db35SAvi Kivity #define SVM_EXIT_RSM 0x073 3147d36db35SAvi Kivity #define SVM_EXIT_IRET 0x074 3157d36db35SAvi Kivity #define SVM_EXIT_SWINT 0x075 3167d36db35SAvi Kivity #define SVM_EXIT_INVD 0x076 3177d36db35SAvi Kivity #define SVM_EXIT_PAUSE 0x077 3187d36db35SAvi Kivity #define SVM_EXIT_HLT 0x078 3197d36db35SAvi Kivity #define SVM_EXIT_INVLPG 0x079 3207d36db35SAvi Kivity #define SVM_EXIT_INVLPGA 0x07a 3217d36db35SAvi Kivity #define SVM_EXIT_IOIO 0x07b 3227d36db35SAvi Kivity #define SVM_EXIT_MSR 0x07c 3237d36db35SAvi Kivity #define SVM_EXIT_TASK_SWITCH 0x07d 3247d36db35SAvi Kivity #define SVM_EXIT_FERR_FREEZE 0x07e 3257d36db35SAvi Kivity #define SVM_EXIT_SHUTDOWN 0x07f 3267d36db35SAvi Kivity #define SVM_EXIT_VMRUN 0x080 3277d36db35SAvi Kivity #define SVM_EXIT_VMMCALL 0x081 3287d36db35SAvi Kivity #define SVM_EXIT_VMLOAD 0x082 3297d36db35SAvi Kivity #define SVM_EXIT_VMSAVE 0x083 3307d36db35SAvi Kivity #define SVM_EXIT_STGI 0x084 3317d36db35SAvi Kivity #define SVM_EXIT_CLGI 0x085 3327d36db35SAvi Kivity #define SVM_EXIT_SKINIT 0x086 3337d36db35SAvi Kivity #define SVM_EXIT_RDTSCP 0x087 3347d36db35SAvi Kivity #define SVM_EXIT_ICEBP 0x088 3357d36db35SAvi Kivity #define SVM_EXIT_WBINVD 0x089 3367d36db35SAvi Kivity #define SVM_EXIT_MONITOR 0x08a 3377d36db35SAvi Kivity #define SVM_EXIT_MWAIT 0x08b 3387d36db35SAvi Kivity #define SVM_EXIT_MWAIT_COND 0x08c 3397d36db35SAvi Kivity #define SVM_EXIT_NPF 0x400 3407d36db35SAvi Kivity 3417d36db35SAvi Kivity #define SVM_EXIT_ERR -1 3427d36db35SAvi Kivity 3437d36db35SAvi Kivity #define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP) 3447d36db35SAvi Kivity 345eae10e8fSKrish Sadhukhan #define SVM_CR0_RESERVED_MASK 0xffffffff00000000U 3466d0ecbf6SKrish Sadhukhan #define SVM_CR3_LONG_MBZ_MASK 0xfff0000000000000U 3476d0ecbf6SKrish Sadhukhan #define SVM_CR3_LONG_RESERVED_MASK 0x0000000000000fe7U 3486d0ecbf6SKrish Sadhukhan #define SVM_CR3_PAE_LEGACY_RESERVED_MASK 0x0000000000000007U 349a79c9495SKrish Sadhukhan #define SVM_CR4_LEGACY_RESERVED_MASK 0xff88f000U 350a79c9495SKrish Sadhukhan #define SVM_CR4_RESERVED_MASK 0xffffffffff88f000U 351eae10e8fSKrish Sadhukhan #define SVM_DR6_RESERVED_MASK 0xffffffffffff1ff0U 352eae10e8fSKrish Sadhukhan #define SVM_DR7_RESERVED_MASK 0xffffffff0000cc00U 353eae10e8fSKrish Sadhukhan #define SVM_EFER_RESERVED_MASK 0xffffffffffff0200U 354eae10e8fSKrish Sadhukhan 355ad879127SKrish Sadhukhan #define MSR_BITMAP_SIZE 8192 3567d36db35SAvi Kivity 357ad879127SKrish Sadhukhan struct svm_test { 358ad879127SKrish Sadhukhan const char *name; 359ad879127SKrish Sadhukhan bool (*supported)(void); 360ad879127SKrish Sadhukhan void (*prepare)(struct svm_test *test); 361ad879127SKrish Sadhukhan void (*prepare_gif_clear)(struct svm_test *test); 362ad879127SKrish Sadhukhan void (*guest_func)(struct svm_test *test); 363ad879127SKrish Sadhukhan bool (*finished)(struct svm_test *test); 364ad879127SKrish Sadhukhan bool (*succeeded)(struct svm_test *test); 365ad879127SKrish Sadhukhan int exits; 366ad879127SKrish Sadhukhan ulong scratch; 3678660d1b5SKrish Sadhukhan /* Alternative test interface. */ 3688660d1b5SKrish Sadhukhan void (*v2)(void); 36948f67910SCathy Avery int on_vcpu; 37048f67910SCathy Avery bool on_vcpu_done; 371ad879127SKrish Sadhukhan }; 372ad879127SKrish Sadhukhan 373ad879127SKrish Sadhukhan struct regs { 374ad879127SKrish Sadhukhan u64 rax; 375ad879127SKrish Sadhukhan u64 rbx; 376ad879127SKrish Sadhukhan u64 rcx; 377ad879127SKrish Sadhukhan u64 rdx; 378ad879127SKrish Sadhukhan u64 cr2; 379ad879127SKrish Sadhukhan u64 rbp; 380ad879127SKrish Sadhukhan u64 rsi; 381ad879127SKrish Sadhukhan u64 rdi; 382ad879127SKrish Sadhukhan u64 r8; 383ad879127SKrish Sadhukhan u64 r9; 384ad879127SKrish Sadhukhan u64 r10; 385ad879127SKrish Sadhukhan u64 r11; 386ad879127SKrish Sadhukhan u64 r12; 387ad879127SKrish Sadhukhan u64 r13; 388ad879127SKrish Sadhukhan u64 r14; 389ad879127SKrish Sadhukhan u64 r15; 390ad879127SKrish Sadhukhan u64 rflags; 391ad879127SKrish Sadhukhan }; 392ad879127SKrish Sadhukhan 3938660d1b5SKrish Sadhukhan typedef void (*test_guest_func)(struct svm_test *); 3948660d1b5SKrish Sadhukhan 395ad879127SKrish Sadhukhan u64 *npt_get_pte(u64 address); 396ad879127SKrish Sadhukhan u64 *npt_get_pde(u64 address); 397ad879127SKrish Sadhukhan u64 *npt_get_pdpe(void); 398c6405e37SNadav Amit u64 *npt_get_pml4e(void); 399ad879127SKrish Sadhukhan bool smp_supported(void); 400ad879127SKrish Sadhukhan bool default_supported(void); 401ad879127SKrish Sadhukhan void default_prepare(struct svm_test *test); 402ad879127SKrish Sadhukhan void default_prepare_gif_clear(struct svm_test *test); 403ad879127SKrish Sadhukhan bool default_finished(struct svm_test *test); 404ad879127SKrish Sadhukhan bool npt_supported(void); 405ad879127SKrish Sadhukhan int get_test_stage(struct svm_test *test); 406ad879127SKrish Sadhukhan void set_test_stage(struct svm_test *test, int s); 407ad879127SKrish Sadhukhan void inc_test_stage(struct svm_test *test); 408ad879127SKrish Sadhukhan void vmcb_ident(struct vmcb *vmcb); 409ad879127SKrish Sadhukhan struct regs get_regs(void); 410ad879127SKrish Sadhukhan void vmmcall(void); 4118660d1b5SKrish Sadhukhan int svm_vmrun(void); 4128660d1b5SKrish Sadhukhan void test_set_guest(test_guest_func func); 413ad879127SKrish Sadhukhan 414096cf7feSPaolo Bonzini extern struct vmcb *vmcb; 415096cf7feSPaolo Bonzini extern struct svm_test svm_tests[]; 416096cf7feSPaolo Bonzini 417ad879127SKrish Sadhukhan #endif 418