summaryrefslogtreecommitdiffstats
path: root/sys/amd64/vmm/intel
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2014-05-24 20:26:57 +0000
committerneel <neel@FreeBSD.org>2014-05-24 20:26:57 +0000
commit6a6e13c407a246faf2265a0ed79ab28fd9419bb6 (patch)
tree507882e99e7a06753f2707b9ed35d4f6aeea4020 /sys/amd64/vmm/intel
parent52a4f11861c5ba735a7bb75bd093905e734e16bd (diff)
downloadFreeBSD-src-6a6e13c407a246faf2265a0ed79ab28fd9419bb6.zip
FreeBSD-src-6a6e13c407a246faf2265a0ed79ab28fd9419bb6.tar.gz
Consolidate all the information needed by the guest page table walker into
'struct vm_guest_paging'. Check for canonical addressing in vmm_gla2gpa() and inject a protection fault into the guest if a violation is detected. If the page table walk is restarted in vmm_gla2gpa() then reset 'ptpphys' to point to the root of the page tables.
Diffstat (limited to 'sys/amd64/vmm/intel')
-rw-r--r--sys/amd64/vmm/intel/vmx.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/sys/amd64/vmm/intel/vmx.c b/sys/amd64/vmm/intel/vmx.c
index 5754b22..8efb667 100644
--- a/sys/amd64/vmm/intel/vmx.c
+++ b/sys/amd64/vmm/intel/vmx.c
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <machine/vmm.h>
#include <machine/vmm_dev.h>
+#include <machine/vmm_instruction_emul.h>
#include "vmm_host.h"
#include "vmm_ioport.h"
#include "vmm_ipi.h"
@@ -1517,7 +1518,7 @@ vmx_cpl(void)
return ((ssar >> 5) & 0x3);
}
-static enum vie_cpu_mode
+static enum vm_cpu_mode
vmx_cpu_mode(void)
{
@@ -1527,7 +1528,7 @@ vmx_cpu_mode(void)
return (CPU_MODE_COMPATIBILITY);
}
-static enum vie_paging_mode
+static enum vm_paging_mode
vmx_paging_mode(void)
{
@@ -1607,15 +1608,21 @@ inout_str_seginfo(struct vmx *vmx, int vcpuid, uint32_t inst_info, int in,
}
static void
+vmx_paging_info(struct vm_guest_paging *paging)
+{
+ paging->cr3 = vmcs_guest_cr3();
+ paging->cpl = vmx_cpl();
+ paging->cpu_mode = vmx_cpu_mode();
+ paging->paging_mode = vmx_paging_mode();
+}
+
+static void
vmexit_inst_emul(struct vm_exit *vmexit, uint64_t gpa, uint64_t gla)
{
vmexit->exitcode = VM_EXITCODE_INST_EMUL;
vmexit->u.inst_emul.gpa = gpa;
vmexit->u.inst_emul.gla = gla;
- vmexit->u.inst_emul.cr3 = vmcs_guest_cr3();
- vmexit->u.inst_emul.cpu_mode = vmx_cpu_mode();
- vmexit->u.inst_emul.paging_mode = vmx_paging_mode();
- vmexit->u.inst_emul.cpl = vmx_cpl();
+ vmx_paging_info(&vmexit->u.inst_emul.paging);
}
static int
@@ -1998,12 +2005,9 @@ vmx_exit_process(struct vmx *vmx, int vcpu, struct vm_exit *vmexit)
inst_info = vmcs_read(VMCS_EXIT_INSTRUCTION_INFO);
vmexit->exitcode = VM_EXITCODE_INOUT_STR;
vis = &vmexit->u.inout_str;
- vis->cpu_mode = vmx_cpu_mode();
- vis->paging_mode = vmx_paging_mode();
+ vmx_paging_info(&vis->paging);
vis->rflags = vmcs_read(VMCS_GUEST_RFLAGS);
vis->cr0 = vmcs_read(VMCS_GUEST_CR0);
- vis->cr3 = vmcs_read(VMCS_GUEST_CR3);
- vis->cpl = vmx_cpl();
vis->index = inout_str_index(vmx, vcpu, in);
vis->count = inout_str_count(vmx, vcpu, vis->inout.rep);
vis->addrsize = inout_str_addrsize(inst_info);
OpenPOWER on IntegriCloud