diff options
author | neel <neel@FreeBSD.org> | 2014-05-24 20:26:57 +0000 |
---|---|---|
committer | neel <neel@FreeBSD.org> | 2014-05-24 20:26:57 +0000 |
commit | 6a6e13c407a246faf2265a0ed79ab28fd9419bb6 (patch) | |
tree | 507882e99e7a06753f2707b9ed35d4f6aeea4020 /sys/amd64/vmm/intel | |
parent | 52a4f11861c5ba735a7bb75bd093905e734e16bd (diff) | |
download | FreeBSD-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.c | 24 |
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); |