{
case X86EMUL_UNHANDLEABLE:
case X86EMUL_UNIMPLEMENTED:
- hvm_dump_emulation_state(XENLOG_G_WARNING, "MMCFG", &ctxt);
+ hvm_dump_emulation_state(XENLOG_G_WARNING, "MMCFG", &ctxt, rc);
break;
case X86EMUL_EXCEPTION:
hvm_inject_event(&ctxt.ctxt.event);
return;
case X86EMUL_UNIMPLEMENTED:
case X86EMUL_UNHANDLEABLE:
- hvm_dump_emulation_state(XENLOG_G_DEBUG, "Mem event", &ctx);
+ hvm_dump_emulation_state(XENLOG_G_DEBUG, "Mem event", &ctx, rc);
hvm_inject_hw_exception(trapnr, errcode);
break;
case X86EMUL_EXCEPTION:
}
void hvm_dump_emulation_state(const char *loglvl, const char *prefix,
- struct hvm_emulate_ctxt *hvmemul_ctxt)
+ struct hvm_emulate_ctxt *hvmemul_ctxt, int rc)
{
struct vcpu *curr = current;
const char *mode_str = guest_x86_mode_to_str(hvm_guest_x86_mode(curr));
const struct segment_register *cs =
hvmemul_get_seg_reg(x86_seg_cs, hvmemul_ctxt);
- printk("%s%s emulation failed: %pv %s @ %04x:%08lx -> %*ph\n",
- loglvl, prefix, curr, mode_str, cs->sel, hvmemul_ctxt->insn_buf_eip,
- hvmemul_ctxt->insn_buf_bytes, hvmemul_ctxt->insn_buf);
+ printk("%s%s emulation failed (%d): %pv %s @ %04x:%08lx -> %*ph\n",
+ loglvl, prefix, rc, curr, mode_str, cs->sel,
+ hvmemul_ctxt->insn_buf_eip, hvmemul_ctxt->insn_buf_bytes,
+ hvmemul_ctxt->insn_buf);
}
/*
switch ( rc )
{
case X86EMUL_UNHANDLEABLE:
- hvm_dump_emulation_state(XENLOG_G_WARNING, descr, &ctxt);
+ hvm_dump_emulation_state(XENLOG_G_WARNING, descr, &ctxt, rc);
return false;
case X86EMUL_UNRECOGNIZED:
- hvm_dump_emulation_state(XENLOG_G_WARNING, descr, &ctxt);
+ hvm_dump_emulation_state(XENLOG_G_WARNING, descr, &ctxt, rc);
hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC);
break;
v->arch.paging.last_write_emul_ok = 0;
}
#endif
- SHADOW_PRINTK("emulator failure, unshadowing mfn %#lx\n",
- mfn_x(gmfn));
+ SHADOW_PRINTK("emulator failure (rc=%d), unshadowing mfn %#lx\n",
+ r, mfn_x(gmfn));
/* If this is actually a page table, then we have a bug, and need
* to support more operations in the emulator. More likely,
* though, this is a hint that this page should not be shadowed. */