The lmsw instruction can be used to set CR0_PE, but can never clear
it, once set.
Signed-off-by: Trolle Selander <trolle.selander@eu.citrix.com>
break;
case VMX_CONTROL_REG_ACCESS_TYPE_LMSW:
value = v->arch.hvm_vcpu.guest_cr[0];
- value = (value & ~0xFFFF) | ((exit_qualification >> 16) & 0xFFFF);
+ /* NB. LMSW can set, but never clear, PE. */
+ value = (value & 0xFFFF0001) | ((exit_qualification >> 16) & 0xFFFF);
HVMTRACE_LONG_1D(LMSW, current, value);
return !hvm_set_cr0(value);
default:
else if ( (rc = ops->read(ea.mem.seg, ea.mem.off,
&cr0w, 2, ctxt)) )
goto done;
- cr0 &= 0xffff0000;
+ cr0 &= 0xffff0001; /* lmsw can set, but never clear, PE */
cr0 |= (uint16_t)cr0w;
if ( (rc = ops->write_cr(0, cr0, ctxt)) )
goto done;