Check that VMPTRLD when eVMCS is active results in #UD. This matches genuine Hyper-V's behavior. Signed-off-by: Vitaly Kuznetsov --- tools/testing/selftests/kvm/include/x86/vmx.h | 3 --- tools/testing/selftests/kvm/x86/hyperv_evmcs.c | 13 +++++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/vmx.h b/tools/testing/selftests/kvm/include/x86/vmx.h index 047d02aa9688..e2178a6683ca 100644 --- a/tools/testing/selftests/kvm/include/x86/vmx.h +++ b/tools/testing/selftests/kvm/include/x86/vmx.h @@ -325,9 +325,6 @@ static inline int vmptrld(u64 vmcs_pa) { u8 ret; - if (enable_evmcs) - return -1; - __asm__ __volatile__ ("vmptrld %[pa]; setna %[ret]" : [ret]"=rm"(ret) : [pa]"m"(vmcs_pa) diff --git a/tools/testing/selftests/kvm/x86/hyperv_evmcs.c b/tools/testing/selftests/kvm/x86/hyperv_evmcs.c index 88262ddf7fcb..6a6d940a7891 100644 --- a/tools/testing/selftests/kvm/x86/hyperv_evmcs.c +++ b/tools/testing/selftests/kvm/x86/hyperv_evmcs.c @@ -18,12 +18,16 @@ #include "hyperv.h" #include "vmx.h" +#define VMLAUNCH_INSN_SIZE 3 +#define VMPTRLD_INSN_SIZE 5 + static int ud_count; +static int ud_insn_skip_size; static void guest_ud_handler(struct ex_regs *regs) { ud_count++; - regs->rip += 3; /* VMLAUNCH */ + regs->rip += ud_insn_skip_size; } static void guest_nmi_handler(struct ex_regs *regs) @@ -182,10 +186,15 @@ void guest_code(struct vmx_pages *vmx_pages, struct hyperv_test_pages *hv_pages, GUEST_ASSERT(vmreadz(VM_EXIT_REASON) == EXIT_REASON_VMCALL); GUEST_SYNC(11); + ud_insn_skip_size = VMPTRLD_INSN_SIZE; + vmptrld(hv_pages->enlightened_vmcs_gpa); + GUEST_ASSERT(ud_count == 1); + /* Try enlightened vmptrld with an incorrect GPA */ + ud_insn_skip_size = VMLAUNCH_INSN_SIZE; evmcs_vmptrld(0xdeadbeef, hv_pages->enlightened_vmcs); GUEST_ASSERT(vmlaunch()); - GUEST_ASSERT(ud_count == 1); + GUEST_ASSERT(ud_count == 2); GUEST_DONE(); } -- 2.55.0