diff options
author | tychon <tychon@FreeBSD.org> | 2015-03-24 17:12:36 +0000 |
---|---|---|
committer | tychon <tychon@FreeBSD.org> | 2015-03-24 17:12:36 +0000 |
commit | b925086de0c55cdfbaf91ed147f66c84d02b82b3 (patch) | |
tree | 781c2f05d97aef978b92a7a4fa2c321ae3694302 /sys/amd64/vmm/intel | |
parent | baf4ea8ca8f540542e799c44517f022c9c73d448 (diff) | |
download | FreeBSD-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.c | 6 |
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; } |