arm: Print NXP MPU error information in BusFault dump
The NXP MPU triggers a bus fault when a memory access error occurs. Add support in the bus fault handler to dump error details from the NXP MPU, including the port number, mode (supervisor or user), address, bus master number, and regions. Signed-off-by: Maureen Helm <maureen.helm@nxp.com>
This commit is contained in:
parent
889b290a98
commit
41dd6622ce
1 changed files with 32 additions and 0 deletions
|
@ -38,6 +38,12 @@
|
|||
} while ((0))
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(CONFIG_NXP_MPU)
|
||||
#define EMN(edr) (((edr) & SYSMPU_EDR_EMN_MASK) >> SYSMPU_EDR_EMN_SHIFT)
|
||||
#define EACD(edr) (((edr) & SYSMPU_EDR_EACD_MASK) >> SYSMPU_EDR_EACD_SHIFT)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARM_SECURE_FIRMWARE)
|
||||
|
||||
/* Exception Return (EXC_RETURN) is provided in LR upon exception entry.
|
||||
|
@ -350,6 +356,32 @@ static void _BusFault(const NANO_ESF *esf, int fromHardFault)
|
|||
}
|
||||
#endif /* !defined(CONFIG_ARMV7_M_ARMV8_M_FP) */
|
||||
|
||||
#if defined(CONFIG_NXP_MPU)
|
||||
u32_t sperr = SYSMPU->CESR & SYSMPU_CESR_SPERR_MASK;
|
||||
u32_t mask = BIT(31);
|
||||
int i;
|
||||
|
||||
if (sperr) {
|
||||
for (i = 0; i < SYSMPU_EAR_COUNT; i++, mask >>= 1) {
|
||||
if (!(sperr & mask)) {
|
||||
continue;
|
||||
}
|
||||
STORE_xFAR(edr, SYSMPU->SP[i].EDR);
|
||||
STORE_xFAR(ear, SYSMPU->SP[i].EAR);
|
||||
|
||||
PR_EXC(" NXP MPU error, port %d\n", i);
|
||||
PR_EXC(" Mode: %s, %s Address: 0x%x\n",
|
||||
edr & BIT(2) ? "Supervisor" : "User",
|
||||
edr & BIT(1) ? "Data" : "Instruction",
|
||||
ear);
|
||||
PR_EXC(" Type: %s, Master: %d, Regions: 0x%x\n",
|
||||
edr & BIT(0) ? "Write" : "Read",
|
||||
EMN(edr), EACD(edr));
|
||||
}
|
||||
SYSMPU->CESR &= ~sperr;
|
||||
}
|
||||
#endif /* CONFIG_NXP_MPU */
|
||||
|
||||
#if defined(CONFIG_ARMV8_M_MAINLINE)
|
||||
/* clear BSFR sticky bits */
|
||||
SCB->CFSR |= SCB_CFSR_BUSFAULTSR_Msk;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue