From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bandan Das Subject: [PATCH kvm-unit-tests v2 2/3] VMX: Add more checks to test_vmxon Date: Mon, 9 Jun 2014 17:04:53 -0400 Message-ID: <1402347894-13659-3-git-send-email-bsd@redhat.com> References: <1402347894-13659-1-git-send-email-bsd@redhat.com> Cc: Paolo Bonzini , Jan Kiszka To: kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:61132 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932189AbaFIVFS (ORCPT ); Mon, 9 Jun 2014 17:05:18 -0400 In-Reply-To: <1402347894-13659-1-git-send-email-bsd@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Verify that vmon fails with unaligned vmxon region or any bits set beyong the physical address width. Also verify failure with an invalid revision identifier. Signed-off-by: Bandan Das --- x86/vmx.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index 768d07f..13e2be8 100644 --- a/x86/vmx.c +++ b/x86/vmx.c @@ -37,7 +37,7 @@ #include "smp.h" #include "io.h" -u32 *vmxon_region; +u64 *vmxon_region; struct vmcs *vmcs_root; u32 vpid_cnt; void *guest_stack, *guest_syscall_stack; @@ -596,10 +596,44 @@ static int test_vmx_feature_control(void) static int test_vmxon(void) { - int ret; + int ret, ret1; + u64 *tmp_region = vmxon_region; + int width = cpuid(0x80000008).a & 0xff; + + /* Unaligned page access */ + vmxon_region = (u64 *)((intptr_t)vmxon_region + 1); + ret1 = vmx_on(); + report("test vmxon with unaligned vmxon region", ret1); + if (!ret1) { + ret = 1; + goto out; + } + + /* gpa bits beyond physical address width are set*/ + vmxon_region = (u64 *)((intptr_t)tmp_region | ((u64)1 << (width+1))); + ret1 = vmx_on(); + report("test vmxon with bits set beyond physical address width", ret1); + if (!ret1) { + ret = 1; + goto out; + } + /* invalid revision indentifier */ + vmxon_region = tmp_region; + *vmxon_region = 0xba9da9; + ret1 = vmx_on(); + report("test vmxon with invalid revision identifier", ret1); + if (!ret1) { + ret = 1; + goto out; + } + + /* and finally a valid region */ + *vmxon_region = basic.revision; ret = vmx_on(); - report("test vmxon", !ret); + report("test vmxon with valid vmxon region", !ret); + +out: return ret; } -- 1.8.3.1