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);
}
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 */