summaryrefslogtreecommitdiffstats
path: root/sys/amd64/vmm/intel
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2014-06-09 20:51:08 +0000
committerneel <neel@FreeBSD.org>2014-06-09 20:51:08 +0000
commitd4bb0b204ad21f0444db58fe460c39960212ae4e (patch)
tree4b2ec5ddd180f83cbadfe0e9e9dbd3a0aca2ac84 /sys/amd64/vmm/intel
parentd5cc055f47fa3629f9e9e88bd625ad247cd5dfdf (diff)
downloadFreeBSD-src-d4bb0b204ad21f0444db58fe460c39960212ae4e.zip
FreeBSD-src-d4bb0b204ad21f0444db58fe460c39960212ae4e.tar.gz
Add reserved bit checking when doing %CR8 emulation and inject #GP if required.
Pointed out by: grehan Reviewed by: tychon
Diffstat (limited to 'sys/amd64/vmm/intel')
-rw-r--r--sys/amd64/vmm/intel/vmx.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/amd64/vmm/intel/vmx.c b/sys/amd64/vmm/intel/vmx.c
index 5c74a6b..ddda13a 100644
--- a/sys/amd64/vmm/intel/vmx.c
+++ b/sys/amd64/vmm/intel/vmx.c
@@ -1602,20 +1602,23 @@ vmx_emulate_cr4_access(struct vmx *vmx, int vcpu, uint64_t exitqual)
static int
vmx_emulate_cr8_access(struct vmx *vmx, int vcpu, uint64_t exitqual)
{
- uint64_t regval;
+ struct vlapic *vlapic;
+ uint64_t cr8;
+ int regnum;
/* We only handle mov %cr8 to/from a register at this time. */
if ((exitqual & 0xe0) != 0x00) {
return (UNHANDLED);
}
+ vlapic = vm_lapic(vmx->vm, vcpu);
+ regnum = (exitqual >> 8) & 0xf;
if (exitqual & 0x10) {
- regval = vlapic_get_tpr(vm_lapic(vmx->vm, vcpu));
- vmx_set_guest_reg(vmx, vcpu, (exitqual >> 8) & 0xf,
- regval >> 4);
+ cr8 = vlapic_get_cr8(vlapic);
+ vmx_set_guest_reg(vmx, vcpu, regnum, cr8);
} else {
- regval = vmx_get_guest_reg(vmx, vcpu, (exitqual >> 8) & 0xf);
- vlapic_set_tpr(vm_lapic(vmx->vm, vcpu), regval << 4);
+ cr8 = vmx_get_guest_reg(vmx, vcpu, regnum);
+ vlapic_set_cr8(vlapic, cr8);
}
return (HANDLED);
OpenPOWER on IntegriCloud