mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86: Emulation of LMSW must only affect CR0 bits 0-3.
Emulation of SMSW is only restricted to 16-bit operation on memory operands. Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
This commit is contained in:
1 parent
80982c971f
commit
41d0fcff57
2 files changed
+6
-5
No files matched your search
@@ -1523,8 +1523,8 @@ static int vmx_cr_access(unsigned long exit_qualification,
|
||||
break;
|
||||
case VMX_CONTROL_REG_ACCESS_TYPE_LMSW:
|
||||
value = v->arch.hvm_vcpu.guest_cr[0];
|
||||
/* NB. LMSW can set, but never clear, PE. */
|
||||
value = (value & 0xFFFF0001) | ((exit_qualification >> 16) & 0xFFFF);
|
||||
/* LMSW can: (1) set bits 0-3; (2) clear bits 1-3. */
|
||||
value = (value & ~0xe) | ((exit_qualification >> 16) & 0xf);
|
||||
HVMTRACE_LONG_1D(LMSW, current, value);
|
||||
return !hvm_set_cr0(value);
|
||||
default:
|
||||
|
||||
@@ -3267,7 +3267,8 @@ x86_emulate(
|
||||
goto done;
|
||||
break;
|
||||
case 4: /* smsw */
|
||||
ea.bytes = 2;
|
||||
if ( ea.type == OP_MEM )
|
||||
ea.bytes = 2;
|
||||
dst = ea;
|
||||
fail_if(ops->read_cr == NULL);
|
||||
if ( (rc = ops->read_cr(0, &dst.val, ctxt)) )
|
||||
@@ -3284,8 +3285,8 @@ x86_emulate(
|
||||
else if ( (rc = ops->read(ea.mem.seg, ea.mem.off,
|
||||
&cr0w, 2, ctxt)) )
|
||||
goto done;
|
||||
cr0 &= 0xffff0001; /* lmsw can set, but never clear, PE */
|
||||
cr0 |= (uint16_t)cr0w;
|
||||
/* LMSW can: (1) set bits 0-3; (2) clear bits 1-3. */
|
||||
cr0 = (cr0 & ~0xe) | (cr0w & 0xf);
|
||||
if ( (rc = ops->write_cr(0, cr0, ctxt)) )
|
||||
goto done;
|
||||
break;
|
||||
|
||||