summaryrefslogtreecommitdiffstats
path: root/sys/amd64/vmm/intel
diff options
context:
space:
mode:
authortychon <tychon@FreeBSD.org>2015-03-24 17:12:36 +0000
committertychon <tychon@FreeBSD.org>2015-03-24 17:12:36 +0000
commitb925086de0c55cdfbaf91ed147f66c84d02b82b3 (patch)
tree781c2f05d97aef978b92a7a4fa2c321ae3694302 /sys/amd64/vmm/intel
parentbaf4ea8ca8f540542e799c44517f022c9c73d448 (diff)
downloadFreeBSD-src-b925086de0c55cdfbaf91ed147f66c84d02b82b3.zip
FreeBSD-src-b925086de0c55cdfbaf91ed147f66c84d02b82b3.tar.gz
When fetching an instruction in non-64bit mode, consider the value of the
code segment base address. Also if an instruction doesn't support a mod R/M (modRM) byte, don't be concerned if the CPU is in real mode. Reviewed by: neel
Diffstat (limited to 'sys/amd64/vmm/intel')
-rw-r--r--sys/amd64/vmm/intel/vmx.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/amd64/vmm/intel/vmx.c b/sys/amd64/vmm/intel/vmx.c
index 6dbf38a..03d755c 100644
--- a/sys/amd64/vmm/intel/vmx.c
+++ b/sys/amd64/vmm/intel/vmx.c
@@ -1784,12 +1784,18 @@ vmexit_inst_emul(struct vm_exit *vmexit, uint64_t gpa, uint64_t gla)
vmexit->u.inst_emul.gla = gla;
vmx_paging_info(paging);
switch (paging->cpu_mode) {
+ case CPU_MODE_REAL:
+ vmexit->u.inst_emul.cs_base = vmcs_read(VMCS_GUEST_CS_BASE);
+ vmexit->u.inst_emul.cs_d = 0;
+ break;
case CPU_MODE_PROTECTED:
case CPU_MODE_COMPATIBILITY:
+ vmexit->u.inst_emul.cs_base = vmcs_read(VMCS_GUEST_CS_BASE);
csar = vmcs_read(VMCS_GUEST_CS_ACCESS_RIGHTS);
vmexit->u.inst_emul.cs_d = SEG_DESC_DEF32(csar);
break;
default:
+ vmexit->u.inst_emul.cs_base = 0;
vmexit->u.inst_emul.cs_d = 0;
break;
}
OpenPOWER on IntegriCloud