This is a small patch to add diagnostic exception dumps.
diff -r f9fbdb50ef16 packages/hal/cortexm/arch/current/ChangeLog
--- a/packages/hal/cortexm/arch/current/ChangeLog Thu Nov 06 14:09:13 2008 +0100
+++ b/packages/hal/cortexm/arch/current/ChangeLog Fri Nov 07 11:05:08 2008 +0100
@@ -1,3 +1,9 @@
+2008-11-07 Simon Kallweit <[EMAIL PROTECTED]>
+
+ * cdl/hal_cortexm.cdl:
+ * src/hal_misc.c:
+ Implemented diagnostic exception dumps.
+
2008-11-04 Simon Kallweit <[EMAIL PROTECTED]>
* include/hal_intr.h:
Fixed load value of SysTick counter.
diff -r f9fbdb50ef16 packages/hal/cortexm/arch/current/cdl/hal_cortexm.cdl
--- a/packages/hal/cortexm/arch/current/cdl/hal_cortexm.cdl Thu Nov 06 14:09:13 2008 +0100
+++ b/packages/hal/cortexm/arch/current/cdl/hal_cortexm.cdl Fri Nov 07 11:05:08 2008 +0100
@@ -115,6 +115,15 @@
Higher priorities are reserved for the DEBUG and SVC traps."
}
+ cdl_option CYGHWR_HAL_CORTEXM_DUMP_EXCEPTIONS {
+ display "Provide diagnostic dump for exceptions"
+ requires !CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
+ default_value 0
+ description "
+ Print messages about hardware exceptions, including
+ raw exception frame dump and register contents."
+ }
+
cdl_option CYGBLD_LINKER_SCRIPT {
display "Linker script"
flavor data
diff -r f9fbdb50ef16 packages/hal/cortexm/arch/current/src/hal_misc.c
--- a/packages/hal/cortexm/arch/current/src/hal_misc.c Thu Nov 06 14:09:13 2008 +0100
+++ b/packages/hal/cortexm/arch/current/src/hal_misc.c Fri Nov 07 11:05:08 2008 +0100
@@ -289,8 +289,59 @@
__externC void* volatile __mem_fault_handler;
#endif
+#ifdef CYGHWR_HAL_CORTEXM_DUMP_EXCEPTIONS
+void hal_dump_exception( HAL_SavedRegisters *regs )
+{
+ cyg_uint32 nvic = CYGARC_REG_NVIC_BASE;
+ cyg_uint32 cfsr, mmar, bfar;
+
+ HAL_READ_UINT32( nvic+CYGARC_REG_NVIC_CFSR, cfsr );
+ HAL_READ_UINT32( nvic+CYGARC_REG_NVIC_MMAR, mmar );
+ HAL_READ_UINT32( nvic+CYGARC_REG_NVIC_BFAR, bfar );
+
+ // Dump exception type
+ diag_printf("Exception (%d): ", regs->u.exception.vector);
+ switch (regs->u.exception.vector) {
+ case CYGNUM_HAL_VECTOR_MEMORY_MAN:
+ diag_printf("Memory manage");
+ break;
+ case CYGNUM_HAL_VECTOR_BUS_FAULT:
+ diag_printf("Bus fault");
+ break;
+ case CYGNUM_HAL_VECTOR_USAGE_FAULT:
+ diag_printf("Usage fault");
+ break;
+ default:
+ diag_printf("Unknown");
+ break;
+ }
+ diag_printf("\n");
+
+ // Dump registers
+ diag_printf(" r0: %08x r1: %08x r2: %08x r3: %08x\n",
+ regs->u.exception.r0, regs->u.exception.r1,
+ regs->u.exception.r2, regs->u.exception.r3);
+ diag_printf(" r4: %08x r5: %08x r6: %08x r7: %08x\n",
+ regs->u.exception.r4_11[0], regs->u.exception.r4_11[1],
+ regs->u.exception.r4_11[2], regs->u.exception.r4_11[3]);
+ diag_printf(" r8: %08x r9: %08x r10: %08x r11: %08x\n",
+ regs->u.exception.r4_11[4], regs->u.exception.r4_11[5],
+ regs->u.exception.r4_11[6], regs->u.exception.r4_11[7]);
+ diag_printf(" r12: %08x sp: %08x lr: %08x pc: %08x\n",
+ regs->u.exception.r12, (cyg_uint32) regs,
+ regs->u.exception.lr, regs->u.exception.pc);
+ diag_printf(" psr: %08x pri: %08x\n",
+ regs->u.exception.psr, regs->u.exception.basepri);
+ diag_printf("cfsr: %08x mmar: %08x bfar: %08x\n",
+ cfsr, mmar, bfar);
+}
+#endif
+
void hal_deliver_exception( HAL_SavedRegisters *regs )
{
+#ifdef CYGHWR_HAL_CORTEXM_DUMP_EXCEPTIONS
+ hal_dump_exception( regs );
+#endif
// Special case handler for code which has chosen to take care
// of data exceptions (i.e. code which expects them to happen)
// This is common in discovery code, e.g. checking for a particular