From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bandan Das Subject: [PATCH kvm-unit-tests 1/2] VMX: checks for validity of vmxon region Date: Wed, 4 Jun 2014 17:17:54 -0400 Message-ID: <1401916675-1568-2-git-send-email-bsd@redhat.com> References: <1401916675-1568-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]:19519 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751799AbaFDVSU (ORCPT ); Wed, 4 Jun 2014 17:18:20 -0400 In-Reply-To: <1401916675-1568-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 | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/x86/vmx.c b/x86/vmx.c index 1182eef..207eb81 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; @@ -598,13 +598,53 @@ static int test_vmx_feature_control(void) static int test_vmxon(void) { - int ret; + int ret, ret1; u64 rflags; + u64 *tmp_region = vmxon_region; + int width = cpuid(0x80000008).a & 0xff; + + /* Unaligned page access */ + vmxon_region = (u64 *)((intptr_t)vmxon_region + 1); + rflags = read_rflags() | X86_EFLAGS_CF | X86_EFLAGS_ZF; + write_rflags(rflags); + 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))); + rflags = read_rflags() | X86_EFLAGS_CF | X86_EFLAGS_ZF; + write_rflags(rflags); + 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; + rflags = read_rflags() | X86_EFLAGS_CF | X86_EFLAGS_ZF; + write_rflags(rflags); + 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; rflags = read_rflags() | X86_EFLAGS_CF | X86_EFLAGS_ZF; write_rflags(rflags); ret = vmx_on(); - report("test vmxon", !ret); + report("test vmxon with valid vmxon region", !ret); + +out: return ret; } -- 1.8.3.1