struct segment_register cs, ds, ss, es, tr;
const char *errstr;
int rc;
+ unsigned long valid;
if ( ctx->pad != 0 )
return -EINVAL;
if ( v->arch.hvm.guest_efer & EFER_LME )
v->arch.hvm.guest_efer |= EFER_LMA;
- if ( v->arch.hvm.guest_cr[4] & ~hvm_cr4_guest_valid_bits(d) )
+ valid = hvm_cr4_guest_valid_bits(d);
+ if ( v->arch.hvm.guest_cr[4] & ~valid )
{
- gprintk(XENLOG_ERR, "Bad CR4 value: %#016lx\n",
- v->arch.hvm.guest_cr[4]);
+ gprintk(XENLOG_ERR, "Bad CR4 %#lx (valid %#lx, rejected %#lx)\n",
+ v->arch.hvm.guest_cr[4], valid,
+ v->arch.hvm.guest_cr[4] & ~valid);
return -EINVAL;
}
struct hvm_hw_cpu ctxt;
struct segment_register seg;
const char *errstr;
+ unsigned long valid;
/* Which vcpu is this? */
if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL )
return -EINVAL;
}
- if ( ctxt.cr4 & ~hvm_cr4_guest_valid_bits(d) )
+ valid = hvm_cr4_guest_valid_bits(d);
+ if ( ctxt.cr4 & ~valid )
{
- printk(XENLOG_G_ERR "HVM%d restore: bad CR4 %#" PRIx64 "\n",
- d->domain_id, ctxt.cr4);
+ printk(XENLOG_G_ERR "HVM%d restore: bad CR4 %#lx (valid %#lx, rejected %#lx)\n",
+ d->domain_id, ctxt.cr4, valid, ctxt.cr4 & ~valid);
return -EINVAL;
}
int hvm_set_cr4(unsigned long value, bool may_defer)
{
struct vcpu *v = current;
- unsigned long old_cr;
+ unsigned long old_cr, valid = hvm_cr4_guest_valid_bits(v->domain);
- if ( value & ~hvm_cr4_guest_valid_bits(v->domain) )
+ if ( value & ~valid )
{
- HVM_DBG_LOG(DBG_LEVEL_1,
- "Guest attempts to set reserved bit in CR4: %lx",
- value);
+ HVM_DBG_LOG(DBG_LEVEL_1, "Bad CR4 %#lx (valid %#lx, rejected %#lx)",
+ value, valid, value & ~valid);
return X86EMUL_EXCEPTION;
}
valid = hvm_cr4_guest_valid_bits(v->domain);
if ( cr4 & ~valid )
- PRINTF("CR4: invalid bits are set (%#"PRIx64", valid: %#"PRIx64")\n",
- cr4, valid);
+ PRINTF("CR4: invalid value %#lx (valid %#lx, rejected %#lx)\n",
+ cr4, valid, cr4 & ~valid);
if ( vmcb_get_dr6(vmcb) >> 32 )
PRINTF("DR6: bits [63:32] are not zero (%#"PRIx64")\n",