Skip to content
Snippets Groups Projects
Commit c60ae0a8 authored by iliya.saroukha's avatar iliya.saroukha :first_quarter_moon:
Browse files

wip: associating a vmxon region to its corresponding vcpu

parent d8060b52
Branches
No related tags found
No related merge requests found
......@@ -16,8 +16,10 @@
#include "asm/special_insns.h"
#include "asm/tlbflush.h"
#include "debug/debug.h"
#include "linux/threads.h"
#include "msr/msr.h"
#include "region/vxmon_reg.h"
#include "region/vxmon.h"
#include "vcpu/vcpu.h"
#define NULL ((void *)0)
......@@ -27,7 +29,7 @@
/* : clobbered registers list (optional)*/
/* );*/
static struct vmxon_region_t vmxon_region;
static struct vcpu_t vcpus[1];
static int cr4_enable_vmx(void) {
unsigned long cr4;
......@@ -177,18 +179,22 @@ static int my_init(void) {
DEBUG_FMT("IA32_VMX_BASIC_MSR = 0x%llx\n", __rdmsr(IA32_VMX_BASIC));
pr_info("Initializing VMXON region\n");
int ret_init_vmxon;
if ((ret_init_vmxon = init_vmxon_reg(&vmxon_region)) != 0) {
pr_err("Failed to initialized the VMXON region\n");
return -ret_init_vmxon;
pr_info("Allocating VMXON region\n");
struct vmxon_t *vmxon_reg = alloc_vmxon();
if (!vmxon_reg) {
pr_err("VMXON region allocation failed\n");
return -ENOMEM;
}
pr_info("VA of the allocated region = 0x%px\n", vmxon_region.va);
pr_info("PA of the allocated region = 0x%llx\n", vmxon_region.pa);
vmxon_regions[0] = vmxon_reg;
pr_info("VA of the allocated region = 0x%px\n", vmxon_reg);
pr_info("PA of the allocated region = 0x%lx\n", __pa(vmxon_reg));
pr_info("Reading VMXON region for VMCS ID: 0x%lx\n",
(*(unsigned long *)vmxon_region.va));
pr_info("Reading VMXON region for VMCS ID: 0x%x\n",
vmxon_reg->header.vmcs_rev_id);
pr_info("Patching CR0 and CR4 depending on the value of their respective "
"MSRs\n");
......@@ -209,18 +215,18 @@ static int my_init(void) {
return -EPERM;
}
pr_info("Executing VMXON with address = 0x%llx as its operand\n",
vmxon_region.pa);
pr_info("Executing VMXON with address = 0x%lx as its operand\n",
__pa(vmxon_reg));
unsigned char vmxon_ret = 0;
/*if ((vmxon_ret = vmxon(vmxon_region.pa) != 0)) {*/
if ((vmxon_ret = kvm_cpu_vmxon(vmxon_region.pa) != 0)) {
if ((vmxon_ret = kvm_cpu_vmxon(__pa(vmxon_reg)) != 0)) {
/*unsigned long vm_err = __rdmsr(0x4400);*/
/*pr_err("VM_ERR val = 0x%lx\n", vm_err);*/
cr4_clear_bits(13);
kfree(vmxon_region.va);
kfree(vmxon_reg);
/*__asm__ volatile("vmxoff");*/
pr_err("`vmxon` failed with return code %d\n", vmxon_ret);
return -1;
......@@ -242,7 +248,7 @@ static void my_exit(void) {
}
pr_info("Freeing memory of the VMXON region\n");
kfree(vmxon_region.va);
kfree(vmxon_regions[0]);
pr_info("vmbr.ko has exited\n");
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment