diff --git a/proto/hypervisor.c b/proto/hypervisor.c index 5061d4853c985e72f3fadf5d098d9c46f093ab24..4f630e5c3fab159a513ad0b6110ea46d0a6d209a 100755 --- a/proto/hypervisor.c +++ b/proto/hypervisor.c @@ -22,6 +22,9 @@ // regions #define IA32_VMX_BASIC (0x480) +#define VMCS_REVISION_ID (__rdmsr(IA32_VMX_BASIC) & 0x7fffffff) +#define REGION_SIZE ((__rdmsr(IA32_VMX_BASIC) >> 32) & 0x1fff) + // Appendix 8 p. 4'592 of Intel SDM #define IA32_VMX_CR0_FIXED0 (0x486) #define IA32_VMX_CR0_FIXED1 (0x487) @@ -158,7 +161,7 @@ static int my_init(void) { printk(KERN_INFO "Allocating memory for VMXON region\n"); - if (!vmxon_region_alloc()) { + if (vmxon_region_alloc() != 0) { pr_err("Failed to allocated memory for the VMXON region\n"); return -1; } @@ -174,7 +177,10 @@ static int my_init(void) { unsigned long long vmx_basic_msr = __rdmsr(IA32_VMX_BASIC); pr_debug("IA32_VMX_BASIC_MSR = 0x%llx\n", vmx_basic_msr); - unsigned long vmcs_revision_id = vmx_basic_msr & 0x7fffffff; + unsigned long size_to_alloc = REGION_SIZE; + pr_debug("Region size to allocate = 0x%lx\n", size_to_alloc); + + unsigned long vmcs_revision_id = VMCS_REVISION_ID; pr_debug("VMCS revision identifier = 0x%lx\n", vmcs_revision_id); return 0;