*/
return;
case X86EMUL_UNHANDLEABLE:
- gdprintk(XENLOG_DEBUG, "Emulation failed @ %04x:%lx: "
- "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
- hvmemul_get_seg_reg(x86_seg_cs, &ctx)->sel,
- ctx.insn_buf_eip,
- ctx.insn_buf[0], ctx.insn_buf[1],
- ctx.insn_buf[2], ctx.insn_buf[3],
- ctx.insn_buf[4], ctx.insn_buf[5],
- ctx.insn_buf[6], ctx.insn_buf[7],
- ctx.insn_buf[8], ctx.insn_buf[9]);
+ hvm_dump_emulation_state(XENLOG_G_DEBUG "Mem event", &ctx);
hvm_inject_hw_exception(trapnr, errcode);
break;
case X86EMUL_EXCEPTION:
return &hvmemul_ctxt->seg_reg[seg];
}
+static const char *guest_x86_mode_to_str(int mode)
+{
+ switch ( mode )
+ {
+ case 0: return "Real";
+ case 1: return "v86";
+ case 2: return "16bit";
+ case 4: return "32bit";
+ case 8: return "64bit";
+ default: return "Unknown";
+ }
+}
+
+void hvm_dump_emulation_state(const char *prefix,
+ struct hvm_emulate_ctxt *hvmemul_ctxt)
+{
+ 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 emulation failed: %pv %s @ %04x:%08lx -> %*ph\n",
+ prefix, curr, mode_str, cs->sel, hvmemul_ctxt->insn_buf_eip,
+ hvmemul_ctxt->insn_buf_bytes, hvmemul_ctxt->insn_buf);
+}
+
/*
* Local variables:
* mode: C
switch ( rc )
{
case X86EMUL_UNHANDLEABLE:
- gdprintk(XENLOG_WARNING,
- "MMIO emulation failed @ %04x:%lx: "
- "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
- hvmemul_get_seg_reg(x86_seg_cs, &ctxt)->sel,
- ctxt.insn_buf_eip,
- ctxt.insn_buf[0], ctxt.insn_buf[1],
- ctxt.insn_buf[2], ctxt.insn_buf[3],
- ctxt.insn_buf[4], ctxt.insn_buf[5],
- ctxt.insn_buf[6], ctxt.insn_buf[7],
- ctxt.insn_buf[8], ctxt.insn_buf[9]);
+ hvm_dump_emulation_state(XENLOG_G_WARNING "MMIO", &ctxt);
return 0;
case X86EMUL_EXCEPTION:
if ( ctxt.exn_pending )
return;
fail:
- gdprintk(XENLOG_ERR,
- "Real-mode emulation failed @ %04x:%08lx: "
- "%02x %02x %02x %02x %02x %02x\n",
- hvmemul_get_seg_reg(x86_seg_cs, hvmemul_ctxt)->sel,
- hvmemul_ctxt->insn_buf_eip,
- hvmemul_ctxt->insn_buf[0], hvmemul_ctxt->insn_buf[1],
- hvmemul_ctxt->insn_buf[2], hvmemul_ctxt->insn_buf[3],
- hvmemul_ctxt->insn_buf[4], hvmemul_ctxt->insn_buf[5]);
+ hvm_dump_emulation_state(XENLOG_G_ERR "Real-mode", hvmemul_ctxt);
domain_crash(curr->domain);
}
unsigned long port, unsigned long *reps, int size,
paddr_t ram_gpa, int dir, int df, void *p_data);
+void hvm_dump_emulation_state(const char *prefix,
+ struct hvm_emulate_ctxt *hvmemul_ctxt);
+
#endif /* __ASM_X86_HVM_EMULATE_H__ */