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] |
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] |