[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 10/19] xen: arm: implement handling of registers trapped by CPTR_EL2.TTA
Add explicit handler for 64-bit CP14 accesses, with more relevant debug message (as per other handlers) and to provide a place for a comment. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- v2: Changed title from "xen: arm: Annotate registers trapped by CPTR_EL2.TTA" Add "And all other unknown registers" to new annotation. --- xen/arch/arm/traps.c | 45 +++++++++++++++++++++++++++++++++++++- xen/include/asm-arm/perfc_defn.h | 1 + 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index d908738..afa8a95 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1816,6 +1816,15 @@ static void do_cp14_32(struct cpu_user_regs *regs, const union hsr hsr) case HSR_CPREG32(DBGOSLAR): return handle_wo_wi(regs, r, cp32.read, hsr, 1); + + /* + * CPTR_EL2.TTA + * + * ARMv7 (DDI 0406C.b): B1.14.16 + * ARMv8 (DDI 0487A.d): D1-1507 Table D1-54 + * + * And all other unknown registers. + */ default: gdprintk(XENLOG_ERR, "%s p14, %d, r%d, cr%d, cr%d, %d @ 0x%"PRIregister"\n", @@ -1830,7 +1839,7 @@ static void do_cp14_32(struct cpu_user_regs *regs, const union hsr hsr) advance_pc(regs, hsr); } -static void do_cp14_dbg(struct cpu_user_regs *regs, const union hsr hsr) +static void do_cp14_64(struct cpu_user_regs *regs, const union hsr hsr) { const struct hsr_cp64 cp64 = hsr.cp64; @@ -1840,12 +1849,37 @@ static void do_cp14_dbg(struct cpu_user_regs *regs, const union hsr hsr) return; } + /* + * CPTR_EL2.TTA + * + * ARMv7 (DDI 0406C.b): B1.14.16 + * ARMv8 (DDI 0487A.d): D1-1507 Table D1-54 + */ 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); + inject_undef_exception(regs, hsr); +} + +static void do_cp14_dbg(struct cpu_user_regs *regs, const union hsr hsr) +{ + struct hsr_cp64 cp64 = hsr.cp64; + + if ( !check_conditional_instr(regs, hsr) ) + { + advance_pc(regs, hsr); + return; + } + + 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 DBG access %#x\n", + hsr.bits & HSR_CP64_REGS_MASK); inject_undef_exception(regs, hsr); } @@ -1968,6 +2002,10 @@ static void do_sysreg(struct cpu_user_regs *regs, * * ARMv8 (DDI 0487A.d): D1-1501 Table D1-43 * + * CPTR_EL2.TTA + * + * ARMv8 (DDI 0487A.d): D1-1507 Table D1-54 + * * And all other unknown registers. */ default: @@ -2162,6 +2200,11 @@ asmlinkage void do_trap_hypervisor(struct cpu_user_regs *regs) perfc_incr(trap_cp14_32); do_cp14_32(regs, hsr); break; + case HSR_EC_CP14_64: + GUEST_BUG_ON(!psr_mode_is_32bit(regs->cpsr)); + perfc_incr(trap_cp14_64); + do_cp14_64(regs, hsr); + break; case HSR_EC_CP14_DBG: GUEST_BUG_ON(!psr_mode_is_32bit(regs->cpsr)); perfc_incr(trap_cp14_dbg); diff --git a/xen/include/asm-arm/perfc_defn.h b/xen/include/asm-arm/perfc_defn.h index 46015f5..69fabe7 100644 --- a/xen/include/asm-arm/perfc_defn.h +++ b/xen/include/asm-arm/perfc_defn.h @@ -9,6 +9,7 @@ PERFCOUNTER(trap_wfe, "trap: wfe") PERFCOUNTER(trap_cp15_32, "trap: cp15 32-bit access") PERFCOUNTER(trap_cp15_64, "trap: cp15 64-bit access") PERFCOUNTER(trap_cp14_32, "trap: cp14 32-bit access") +PERFCOUNTER(trap_cp14_64, "trap: cp14 64-bit access") PERFCOUNTER(trap_cp14_dbg, "trap: cp14 dbg access") PERFCOUNTER(trap_cp, "trap: cp access") PERFCOUNTER(trap_smc32, "trap: 32-bit smc") -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |