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 <bsd@xxxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html