This is the mail archive of the ecos-patches@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Cortex-M diagnostic exception dumps


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  <simon.kallweit@intefo.ch>
+
+	* cdl/hal_cortexm.cdl:
+	* src/hal_misc.c:
+	Implemented diagnostic exception dumps.
+
 2008-11-04  Simon Kallweit  <simon.kallweit@intefo.ch>
 	* 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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]