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 547d36db35SAvi Kivity 557d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb_control_area { 567d36db35SAvi Kivity u16 intercept_cr_read; 577d36db35SAvi Kivity u16 intercept_cr_write; 587d36db35SAvi Kivity u16 intercept_dr_read; 597d36db35SAvi Kivity u16 intercept_dr_write; 607d36db35SAvi Kivity u32 intercept_exceptions; 617d36db35SAvi Kivity u64 intercept; 627d36db35SAvi Kivity u8 reserved_1[42]; 637d36db35SAvi Kivity u16 pause_filter_count; 647d36db35SAvi Kivity u64 iopm_base_pa; 657d36db35SAvi Kivity u64 msrpm_base_pa; 667d36db35SAvi Kivity u64 tsc_offset; 677d36db35SAvi Kivity u32 asid; 687d36db35SAvi Kivity u8 tlb_ctl; 697d36db35SAvi Kivity u8 reserved_2[3]; 707d36db35SAvi Kivity u32 int_ctl; 717d36db35SAvi Kivity u32 int_vector; 727d36db35SAvi Kivity u32 int_state; 737d36db35SAvi Kivity u8 reserved_3[4]; 747d36db35SAvi Kivity u32 exit_code; 757d36db35SAvi Kivity u32 exit_code_hi; 767d36db35SAvi Kivity u64 exit_info_1; 777d36db35SAvi Kivity u64 exit_info_2; 787d36db35SAvi Kivity u32 exit_int_info; 797d36db35SAvi Kivity u32 exit_int_info_err; 807d36db35SAvi Kivity u64 nested_ctl; 817d36db35SAvi Kivity u8 reserved_4[16]; 827d36db35SAvi Kivity u32 event_inj; 837d36db35SAvi Kivity u32 event_inj_err; 847d36db35SAvi Kivity u64 nested_cr3; 857d36db35SAvi Kivity u64 lbr_ctl; 867d36db35SAvi Kivity u64 reserved_5; 877d36db35SAvi Kivity u64 next_rip; 887d36db35SAvi Kivity u8 reserved_6[816]; 897d36db35SAvi Kivity }; 907d36db35SAvi Kivity 917d36db35SAvi Kivity 927d36db35SAvi Kivity #define TLB_CONTROL_DO_NOTHING 0 937d36db35SAvi Kivity #define TLB_CONTROL_FLUSH_ALL_ASID 1 947d36db35SAvi Kivity 957d36db35SAvi Kivity #define V_TPR_MASK 0x0f 967d36db35SAvi Kivity 977d36db35SAvi Kivity #define V_IRQ_SHIFT 8 987d36db35SAvi Kivity #define V_IRQ_MASK (1 << V_IRQ_SHIFT) 997d36db35SAvi Kivity 1007d36db35SAvi Kivity #define V_INTR_PRIO_SHIFT 16 1017d36db35SAvi Kivity #define V_INTR_PRIO_MASK (0x0f << V_INTR_PRIO_SHIFT) 1027d36db35SAvi Kivity 1037d36db35SAvi Kivity #define V_IGN_TPR_SHIFT 20 1047d36db35SAvi Kivity #define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT) 1057d36db35SAvi Kivity 1067d36db35SAvi Kivity #define V_INTR_MASKING_SHIFT 24 1077d36db35SAvi Kivity #define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT) 1087d36db35SAvi Kivity 1097d36db35SAvi Kivity #define SVM_INTERRUPT_SHADOW_MASK 1 1107d36db35SAvi Kivity 1117d36db35SAvi Kivity #define SVM_IOIO_STR_SHIFT 2 1127d36db35SAvi Kivity #define SVM_IOIO_REP_SHIFT 3 1137d36db35SAvi Kivity #define SVM_IOIO_SIZE_SHIFT 4 1147d36db35SAvi Kivity #define SVM_IOIO_ASIZE_SHIFT 7 1157d36db35SAvi Kivity 1167d36db35SAvi Kivity #define SVM_IOIO_TYPE_MASK 1 1177d36db35SAvi Kivity #define SVM_IOIO_STR_MASK (1 << SVM_IOIO_STR_SHIFT) 1187d36db35SAvi Kivity #define SVM_IOIO_REP_MASK (1 << SVM_IOIO_REP_SHIFT) 1197d36db35SAvi Kivity #define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT) 1207d36db35SAvi Kivity #define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT) 1217d36db35SAvi Kivity 1227d36db35SAvi Kivity #define SVM_VM_CR_VALID_MASK 0x001fULL 1237d36db35SAvi Kivity #define SVM_VM_CR_SVM_LOCK_MASK 0x0008ULL 1247d36db35SAvi Kivity #define SVM_VM_CR_SVM_DIS_MASK 0x0010ULL 1257d36db35SAvi Kivity 1267d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb_seg { 1277d36db35SAvi Kivity u16 selector; 1287d36db35SAvi Kivity u16 attrib; 1297d36db35SAvi Kivity u32 limit; 1307d36db35SAvi Kivity u64 base; 1317d36db35SAvi Kivity }; 1327d36db35SAvi Kivity 1337d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb_save_area { 1347d36db35SAvi Kivity struct vmcb_seg es; 1357d36db35SAvi Kivity struct vmcb_seg cs; 1367d36db35SAvi Kivity struct vmcb_seg ss; 1377d36db35SAvi Kivity struct vmcb_seg ds; 1387d36db35SAvi Kivity struct vmcb_seg fs; 1397d36db35SAvi Kivity struct vmcb_seg gs; 1407d36db35SAvi Kivity struct vmcb_seg gdtr; 1417d36db35SAvi Kivity struct vmcb_seg ldtr; 1427d36db35SAvi Kivity struct vmcb_seg idtr; 1437d36db35SAvi Kivity struct vmcb_seg tr; 1447d36db35SAvi Kivity u8 reserved_1[43]; 1457d36db35SAvi Kivity u8 cpl; 1467d36db35SAvi Kivity u8 reserved_2[4]; 1477d36db35SAvi Kivity u64 efer; 1487d36db35SAvi Kivity u8 reserved_3[112]; 1497d36db35SAvi Kivity u64 cr4; 1507d36db35SAvi Kivity u64 cr3; 1517d36db35SAvi Kivity u64 cr0; 1527d36db35SAvi Kivity u64 dr7; 1537d36db35SAvi Kivity u64 dr6; 1547d36db35SAvi Kivity u64 rflags; 1557d36db35SAvi Kivity u64 rip; 1567d36db35SAvi Kivity u8 reserved_4[88]; 1577d36db35SAvi Kivity u64 rsp; 1587d36db35SAvi Kivity u8 reserved_5[24]; 1597d36db35SAvi Kivity u64 rax; 1607d36db35SAvi Kivity u64 star; 1617d36db35SAvi Kivity u64 lstar; 1627d36db35SAvi Kivity u64 cstar; 1637d36db35SAvi Kivity u64 sfmask; 1647d36db35SAvi Kivity u64 kernel_gs_base; 1657d36db35SAvi Kivity u64 sysenter_cs; 1667d36db35SAvi Kivity u64 sysenter_esp; 1677d36db35SAvi Kivity u64 sysenter_eip; 1687d36db35SAvi Kivity u64 cr2; 1697d36db35SAvi Kivity u8 reserved_6[32]; 1707d36db35SAvi Kivity u64 g_pat; 1717d36db35SAvi Kivity u64 dbgctl; 1727d36db35SAvi Kivity u64 br_from; 1737d36db35SAvi Kivity u64 br_to; 1747d36db35SAvi Kivity u64 last_excp_from; 1757d36db35SAvi Kivity u64 last_excp_to; 1767d36db35SAvi Kivity }; 1777d36db35SAvi Kivity 1787d36db35SAvi Kivity struct __attribute__ ((__packed__)) vmcb { 1797d36db35SAvi Kivity struct vmcb_control_area control; 1807d36db35SAvi Kivity struct vmcb_save_area save; 1817d36db35SAvi Kivity }; 1827d36db35SAvi Kivity 1837d36db35SAvi Kivity #define SVM_CPUID_FEATURE_SHIFT 2 1847d36db35SAvi Kivity #define SVM_CPUID_FUNC 0x8000000a 1857d36db35SAvi Kivity 1867d36db35SAvi Kivity #define SVM_VM_CR_SVM_DISABLE 4 1877d36db35SAvi Kivity 1887d36db35SAvi Kivity #define SVM_SELECTOR_S_SHIFT 4 1897d36db35SAvi Kivity #define SVM_SELECTOR_DPL_SHIFT 5 1907d36db35SAvi Kivity #define SVM_SELECTOR_P_SHIFT 7 1917d36db35SAvi Kivity #define SVM_SELECTOR_AVL_SHIFT 8 1927d36db35SAvi Kivity #define SVM_SELECTOR_L_SHIFT 9 1937d36db35SAvi Kivity #define SVM_SELECTOR_DB_SHIFT 10 1947d36db35SAvi Kivity #define SVM_SELECTOR_G_SHIFT 11 1957d36db35SAvi Kivity 1967d36db35SAvi Kivity #define SVM_SELECTOR_TYPE_MASK (0xf) 1977d36db35SAvi Kivity #define SVM_SELECTOR_S_MASK (1 << SVM_SELECTOR_S_SHIFT) 1987d36db35SAvi Kivity #define SVM_SELECTOR_DPL_MASK (3 << SVM_SELECTOR_DPL_SHIFT) 1997d36db35SAvi Kivity #define SVM_SELECTOR_P_MASK (1 << SVM_SELECTOR_P_SHIFT) 2007d36db35SAvi Kivity #define SVM_SELECTOR_AVL_MASK (1 << SVM_SELECTOR_AVL_SHIFT) 2017d36db35SAvi Kivity #define SVM_SELECTOR_L_MASK (1 << SVM_SELECTOR_L_SHIFT) 2027d36db35SAvi Kivity #define SVM_SELECTOR_DB_MASK (1 << SVM_SELECTOR_DB_SHIFT) 2037d36db35SAvi Kivity #define SVM_SELECTOR_G_MASK (1 << SVM_SELECTOR_G_SHIFT) 2047d36db35SAvi Kivity 2057d36db35SAvi Kivity #define SVM_SELECTOR_WRITE_MASK (1 << 1) 2067d36db35SAvi Kivity #define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK 2077d36db35SAvi Kivity #define SVM_SELECTOR_CODE_MASK (1 << 3) 2087d36db35SAvi Kivity 2097d36db35SAvi Kivity #define INTERCEPT_CR0_MASK 1 2107d36db35SAvi Kivity #define INTERCEPT_CR3_MASK (1 << 3) 2117d36db35SAvi Kivity #define INTERCEPT_CR4_MASK (1 << 4) 2127d36db35SAvi Kivity #define INTERCEPT_CR8_MASK (1 << 8) 2137d36db35SAvi Kivity 2147d36db35SAvi Kivity #define INTERCEPT_DR0_MASK 1 2157d36db35SAvi Kivity #define INTERCEPT_DR1_MASK (1 << 1) 2167d36db35SAvi Kivity #define INTERCEPT_DR2_MASK (1 << 2) 2177d36db35SAvi Kivity #define INTERCEPT_DR3_MASK (1 << 3) 2187d36db35SAvi Kivity #define INTERCEPT_DR4_MASK (1 << 4) 2197d36db35SAvi Kivity #define INTERCEPT_DR5_MASK (1 << 5) 2207d36db35SAvi Kivity #define INTERCEPT_DR6_MASK (1 << 6) 2217d36db35SAvi Kivity #define INTERCEPT_DR7_MASK (1 << 7) 2227d36db35SAvi Kivity 2237d36db35SAvi Kivity #define SVM_EVTINJ_VEC_MASK 0xff 2247d36db35SAvi Kivity 2257d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_SHIFT 8 2267d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_MASK (7 << SVM_EVTINJ_TYPE_SHIFT) 2277d36db35SAvi Kivity 2287d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_INTR (0 << SVM_EVTINJ_TYPE_SHIFT) 2297d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_NMI (2 << SVM_EVTINJ_TYPE_SHIFT) 2307d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_EXEPT (3 << SVM_EVTINJ_TYPE_SHIFT) 2317d36db35SAvi Kivity #define SVM_EVTINJ_TYPE_SOFT (4 << SVM_EVTINJ_TYPE_SHIFT) 2327d36db35SAvi Kivity 2337d36db35SAvi Kivity #define SVM_EVTINJ_VALID (1 << 31) 2347d36db35SAvi Kivity #define SVM_EVTINJ_VALID_ERR (1 << 11) 2357d36db35SAvi Kivity 2367d36db35SAvi Kivity #define SVM_EXITINTINFO_VEC_MASK SVM_EVTINJ_VEC_MASK 2377d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_MASK SVM_EVTINJ_TYPE_MASK 2387d36db35SAvi Kivity 2397d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_INTR SVM_EVTINJ_TYPE_INTR 2407d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_NMI SVM_EVTINJ_TYPE_NMI 2417d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_EXEPT SVM_EVTINJ_TYPE_EXEPT 2427d36db35SAvi Kivity #define SVM_EXITINTINFO_TYPE_SOFT SVM_EVTINJ_TYPE_SOFT 2437d36db35SAvi Kivity 2447d36db35SAvi Kivity #define SVM_EXITINTINFO_VALID SVM_EVTINJ_VALID 2457d36db35SAvi Kivity #define SVM_EXITINTINFO_VALID_ERR SVM_EVTINJ_VALID_ERR 2467d36db35SAvi Kivity 2477d36db35SAvi Kivity #define SVM_EXITINFOSHIFT_TS_REASON_IRET 36 2487d36db35SAvi Kivity #define SVM_EXITINFOSHIFT_TS_REASON_JMP 38 2497d36db35SAvi Kivity #define SVM_EXITINFOSHIFT_TS_HAS_ERROR_CODE 44 2507d36db35SAvi Kivity 2517d36db35SAvi Kivity #define SVM_EXIT_READ_CR0 0x000 2527d36db35SAvi Kivity #define SVM_EXIT_READ_CR3 0x003 2537d36db35SAvi Kivity #define SVM_EXIT_READ_CR4 0x004 2547d36db35SAvi Kivity #define SVM_EXIT_READ_CR8 0x008 2557d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR0 0x010 2567d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR3 0x013 2577d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR4 0x014 2587d36db35SAvi Kivity #define SVM_EXIT_WRITE_CR8 0x018 2597d36db35SAvi Kivity #define SVM_EXIT_READ_DR0 0x020 2607d36db35SAvi Kivity #define SVM_EXIT_READ_DR1 0x021 2617d36db35SAvi Kivity #define SVM_EXIT_READ_DR2 0x022 2627d36db35SAvi Kivity #define SVM_EXIT_READ_DR3 0x023 2637d36db35SAvi Kivity #define SVM_EXIT_READ_DR4 0x024 2647d36db35SAvi Kivity #define SVM_EXIT_READ_DR5 0x025 2657d36db35SAvi Kivity #define SVM_EXIT_READ_DR6 0x026 2667d36db35SAvi Kivity #define SVM_EXIT_READ_DR7 0x027 2677d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR0 0x030 2687d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR1 0x031 2697d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR2 0x032 2707d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR3 0x033 2717d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR4 0x034 2727d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR5 0x035 2737d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR6 0x036 2747d36db35SAvi Kivity #define SVM_EXIT_WRITE_DR7 0x037 2757d36db35SAvi Kivity #define SVM_EXIT_EXCP_BASE 0x040 2767d36db35SAvi Kivity #define SVM_EXIT_INTR 0x060 2777d36db35SAvi Kivity #define SVM_EXIT_NMI 0x061 2787d36db35SAvi Kivity #define SVM_EXIT_SMI 0x062 2797d36db35SAvi Kivity #define SVM_EXIT_INIT 0x063 2807d36db35SAvi Kivity #define SVM_EXIT_VINTR 0x064 2817d36db35SAvi Kivity #define SVM_EXIT_CR0_SEL_WRITE 0x065 2827d36db35SAvi Kivity #define SVM_EXIT_IDTR_READ 0x066 2837d36db35SAvi Kivity #define SVM_EXIT_GDTR_READ 0x067 2847d36db35SAvi Kivity #define SVM_EXIT_LDTR_READ 0x068 2857d36db35SAvi Kivity #define SVM_EXIT_TR_READ 0x069 2867d36db35SAvi Kivity #define SVM_EXIT_IDTR_WRITE 0x06a 2877d36db35SAvi Kivity #define SVM_EXIT_GDTR_WRITE 0x06b 2887d36db35SAvi Kivity #define SVM_EXIT_LDTR_WRITE 0x06c 2897d36db35SAvi Kivity #define SVM_EXIT_TR_WRITE 0x06d 2907d36db35SAvi Kivity #define SVM_EXIT_RDTSC 0x06e 2917d36db35SAvi Kivity #define SVM_EXIT_RDPMC 0x06f 2927d36db35SAvi Kivity #define SVM_EXIT_PUSHF 0x070 2937d36db35SAvi Kivity #define SVM_EXIT_POPF 0x071 2947d36db35SAvi Kivity #define SVM_EXIT_CPUID 0x072 2957d36db35SAvi Kivity #define SVM_EXIT_RSM 0x073 2967d36db35SAvi Kivity #define SVM_EXIT_IRET 0x074 2977d36db35SAvi Kivity #define SVM_EXIT_SWINT 0x075 2987d36db35SAvi Kivity #define SVM_EXIT_INVD 0x076 2997d36db35SAvi Kivity #define SVM_EXIT_PAUSE 0x077 3007d36db35SAvi Kivity #define SVM_EXIT_HLT 0x078 3017d36db35SAvi Kivity #define SVM_EXIT_INVLPG 0x079 3027d36db35SAvi Kivity #define SVM_EXIT_INVLPGA 0x07a 3037d36db35SAvi Kivity #define SVM_EXIT_IOIO 0x07b 3047d36db35SAvi Kivity #define SVM_EXIT_MSR 0x07c 3057d36db35SAvi Kivity #define SVM_EXIT_TASK_SWITCH 0x07d 3067d36db35SAvi Kivity #define SVM_EXIT_FERR_FREEZE 0x07e 3077d36db35SAvi Kivity #define SVM_EXIT_SHUTDOWN 0x07f 3087d36db35SAvi Kivity #define SVM_EXIT_VMRUN 0x080 3097d36db35SAvi Kivity #define SVM_EXIT_VMMCALL 0x081 3107d36db35SAvi Kivity #define SVM_EXIT_VMLOAD 0x082 3117d36db35SAvi Kivity #define SVM_EXIT_VMSAVE 0x083 3127d36db35SAvi Kivity #define SVM_EXIT_STGI 0x084 3137d36db35SAvi Kivity #define SVM_EXIT_CLGI 0x085 3147d36db35SAvi Kivity #define SVM_EXIT_SKINIT 0x086 3157d36db35SAvi Kivity #define SVM_EXIT_RDTSCP 0x087 3167d36db35SAvi Kivity #define SVM_EXIT_ICEBP 0x088 3177d36db35SAvi Kivity #define SVM_EXIT_WBINVD 0x089 3187d36db35SAvi Kivity #define SVM_EXIT_MONITOR 0x08a 3197d36db35SAvi Kivity #define SVM_EXIT_MWAIT 0x08b 3207d36db35SAvi Kivity #define SVM_EXIT_MWAIT_COND 0x08c 3217d36db35SAvi Kivity #define SVM_EXIT_NPF 0x400 3227d36db35SAvi Kivity 3237d36db35SAvi Kivity #define SVM_EXIT_ERR -1 3247d36db35SAvi Kivity 3257d36db35SAvi Kivity #define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP) 3267d36db35SAvi Kivity 327eae10e8fSKrish Sadhukhan #define SVM_CR0_RESERVED_MASK 0xffffffff00000000U 328*6d0ecbf6SKrish Sadhukhan #define SVM_CR3_LONG_MBZ_MASK 0xfff0000000000000U 329*6d0ecbf6SKrish Sadhukhan #define SVM_CR3_LONG_RESERVED_MASK 0x0000000000000fe7U 330*6d0ecbf6SKrish Sadhukhan #define SVM_CR3_PAE_LEGACY_RESERVED_MASK 0x0000000000000007U 331a79c9495SKrish Sadhukhan #define SVM_CR4_LEGACY_RESERVED_MASK 0xff88f000U 332a79c9495SKrish Sadhukhan #define SVM_CR4_RESERVED_MASK 0xffffffffff88f000U 333eae10e8fSKrish Sadhukhan #define SVM_DR6_RESERVED_MASK 0xffffffffffff1ff0U 334eae10e8fSKrish Sadhukhan #define SVM_DR7_RESERVED_MASK 0xffffffff0000cc00U 335eae10e8fSKrish Sadhukhan #define SVM_EFER_RESERVED_MASK 0xffffffffffff0200U 336eae10e8fSKrish Sadhukhan 337ad879127SKrish Sadhukhan #define MSR_BITMAP_SIZE 8192 3387d36db35SAvi Kivity 339ad879127SKrish Sadhukhan struct svm_test { 340ad879127SKrish Sadhukhan const char *name; 341ad879127SKrish Sadhukhan bool (*supported)(void); 342ad879127SKrish Sadhukhan void (*prepare)(struct svm_test *test); 343ad879127SKrish Sadhukhan void (*prepare_gif_clear)(struct svm_test *test); 344ad879127SKrish Sadhukhan void (*guest_func)(struct svm_test *test); 345ad879127SKrish Sadhukhan bool (*finished)(struct svm_test *test); 346ad879127SKrish Sadhukhan bool (*succeeded)(struct svm_test *test); 347ad879127SKrish Sadhukhan int exits; 348ad879127SKrish Sadhukhan ulong scratch; 3498660d1b5SKrish Sadhukhan /* Alternative test interface. */ 3508660d1b5SKrish Sadhukhan void (*v2)(void); 351ad879127SKrish Sadhukhan }; 352ad879127SKrish Sadhukhan 353ad879127SKrish Sadhukhan struct regs { 354ad879127SKrish Sadhukhan u64 rax; 355ad879127SKrish Sadhukhan u64 rbx; 356ad879127SKrish Sadhukhan u64 rcx; 357ad879127SKrish Sadhukhan u64 rdx; 358ad879127SKrish Sadhukhan u64 cr2; 359ad879127SKrish Sadhukhan u64 rbp; 360ad879127SKrish Sadhukhan u64 rsi; 361ad879127SKrish Sadhukhan u64 rdi; 362ad879127SKrish Sadhukhan u64 r8; 363ad879127SKrish Sadhukhan u64 r9; 364ad879127SKrish Sadhukhan u64 r10; 365ad879127SKrish Sadhukhan u64 r11; 366ad879127SKrish Sadhukhan u64 r12; 367ad879127SKrish Sadhukhan u64 r13; 368ad879127SKrish Sadhukhan u64 r14; 369ad879127SKrish Sadhukhan u64 r15; 370ad879127SKrish Sadhukhan u64 rflags; 371ad879127SKrish Sadhukhan }; 372ad879127SKrish Sadhukhan 3738660d1b5SKrish Sadhukhan typedef void (*test_guest_func)(struct svm_test *); 3748660d1b5SKrish Sadhukhan 375ad879127SKrish Sadhukhan u64 *npt_get_pte(u64 address); 376ad879127SKrish Sadhukhan u64 *npt_get_pde(u64 address); 377ad879127SKrish Sadhukhan u64 *npt_get_pdpe(void); 378c6405e37SNadav Amit u64 *npt_get_pml4e(void); 379ad879127SKrish Sadhukhan bool smp_supported(void); 380ad879127SKrish Sadhukhan bool default_supported(void); 381ad879127SKrish Sadhukhan void default_prepare(struct svm_test *test); 382ad879127SKrish Sadhukhan void default_prepare_gif_clear(struct svm_test *test); 383ad879127SKrish Sadhukhan bool default_finished(struct svm_test *test); 384ad879127SKrish Sadhukhan bool npt_supported(void); 385ad879127SKrish Sadhukhan int get_test_stage(struct svm_test *test); 386ad879127SKrish Sadhukhan void set_test_stage(struct svm_test *test, int s); 387ad879127SKrish Sadhukhan void inc_test_stage(struct svm_test *test); 388ad879127SKrish Sadhukhan void vmcb_ident(struct vmcb *vmcb); 389ad879127SKrish Sadhukhan struct regs get_regs(void); 390ad879127SKrish Sadhukhan void vmmcall(void); 3918660d1b5SKrish Sadhukhan int svm_vmrun(void); 3928660d1b5SKrish Sadhukhan void test_set_guest(test_guest_func func); 393ad879127SKrish Sadhukhan 394096cf7feSPaolo Bonzini extern struct vmcb *vmcb; 395096cf7feSPaolo Bonzini extern struct svm_test svm_tests[]; 396096cf7feSPaolo Bonzini 397ad879127SKrish Sadhukhan #endif 398