From: Julien Grall Date: Thu, 19 Jun 2014 14:09:49 +0000 (+0100) Subject: xen/arm: Add some useful debug in coprocessor trapping X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4764 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=42642dbd8511a8a3c2e70792a31d725b780a7744;p=xen.git xen/arm: Add some useful debug in coprocessor trapping XSA-93 adds a couple of new functions to trap coprocessor registers. They unconditionally inject an undefined instruction to guest. When debugging an OS at early stage, it may be hard to know why the guest received an UNDEFINED. Add some debug message to help the developer when Xen is built in debug mode. Signed-off-by: Julien Grall Acked-by: Ian Campbell --- diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 994b654846..2fde0dd5ef 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1546,23 +1546,43 @@ bad_cp: static void do_cp14_dbg(struct cpu_user_regs *regs, union hsr hsr) { +#ifndef NDEBUG + struct hsr_cp64 cp64 = hsr.cp64; +#endif + if ( !check_conditional_instr(regs, hsr) ) { advance_pc(regs, hsr); return; } +#ifndef NDEBUG + gdprintk(XENLOG_ERR, + "%s p14, %d, r%d, r%d, cr%d @ 0x%"PRIregister"\n", + cp64.read ? "mrrc" : "mcrr", + cp64.op1, cp64.reg1, cp64.reg2, cp64.crm, regs->pc); + gdprintk(XENLOG_ERR, "unhandled 64-bit CP14 access %#x\n", + hsr.bits & HSR_CP64_REGS_MASK); +#endif inject_undef32_exception(regs); } static void do_cp(struct cpu_user_regs *regs, union hsr hsr) { +#ifndef NDEBUG + struct hsr_cp cp = hsr.cp; +#endif + if ( !check_conditional_instr(regs, hsr) ) { advance_pc(regs, hsr); return; } +#ifndef NDEBUG + ASSERT(!cp.tas); /* We don't trap SIMD instruction */ + gdprintk(XENLOG_ERR, "unhandled CP%d access\n", cp.coproc); +#endif inject_undef32_exception(regs); } diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h index ebc683d752..3be86f18c3 100644 --- a/xen/include/asm-arm/processor.h +++ b/xen/include/asm-arm/processor.h @@ -295,6 +295,17 @@ union hsr { unsigned long ec:6; /* Exception Class */ } cp64; /* HSR_EC_CP15_64, HSR_EC_CP14_64 */ + struct hsr_cp { + unsigned long coproc:4; /* Number of coproc accessed */ + unsigned long sbz0p:1; + unsigned long tas:1; /* Trapped Advanced SIMD */ + unsigned long res0:14; + unsigned long cc:4; /* Condition Code */ + unsigned long ccvalid:1;/* CC Valid */ + unsigned long len:1; /* Instruction length */ + unsigned long ec:6; /* Exception Class */ + } cp; /* HSR_EC_CP */ + #ifdef CONFIG_ARM_64 struct hsr_sysreg { unsigned long read:1; /* Direction */