diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-25 17:48:11 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-11-27 17:03:40 +0100 |
commit | 815994fd17c2f732aacaf273a1e476a62de5f4a6 (patch) | |
tree | 17fffb992fcf3e025462215ee3c7515919d2ced4 /c/src/lib/libbsp | |
parent | powerpc: Add CPU_Exception_frame (diff) | |
download | rtems-815994fd17c2f732aacaf273a1e476a62de5f4a6.tar.bz2 |
score: Add CPU_Exception_frame
Add CPU port type CPU_Exception_frame and function
_CPU_Exception_frame_print().
The CPU ports of avr, bfin, h8300, lm32, m32c, m32r, m68k, nios2, sh,
sparc64, and v850 use an empty default implementation of
_CPU_Exception_frame_print().
Add rtems_exception_frame and rtems_exception_frame_print().
Add RTEMS_FATAL_SOURCE_EXCEPTION for CPU exceptions. Use rtems_fatal()
with source RTEMS_FATAL_SOURCE_EXCEPTION in CPU ports of i386, powerpc,
and sparc for unexpected exceptions.
Add third parameter to RTEMS_BSP_CLEANUP_OPTIONS() which controls the
BSP_PRINT_EXCEPTION_CONTEXT define used in the default
bsp_fatal_extension().
Add test sptests/spfatal26.
Diffstat (limited to 'c/src/lib/libbsp')
-rw-r--r-- | c/src/lib/libbsp/mips/shared/irq/vectorexceptions.c | 6 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/psim/configure.ac | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/shared/bspclean.c | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/erc32/configure.ac | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/erc32/startup/spurious.c | 37 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon2/startup/spurious.c | 37 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/startup/spurious.c | 38 |
7 files changed, 74 insertions, 56 deletions
diff --git a/c/src/lib/libbsp/mips/shared/irq/vectorexceptions.c b/c/src/lib/libbsp/mips/shared/irq/vectorexceptions.c index 91ecf33b73..e0e175c6fb 100644 --- a/c/src/lib/libbsp/mips/shared/irq/vectorexceptions.c +++ b/c/src/lib/libbsp/mips/shared/irq/vectorexceptions.c @@ -24,9 +24,7 @@ #include <rtems/bspIo.h> #include <bsp/irq-generic.h> -void mips_vector_exceptions( CPU_Interrupt_frame *frame ); - -static const char *cause_strings[32] = +static const char *const cause_strings[32] = { /* 0 */ "Int", /* 1 */ "TLB Mods", @@ -79,7 +77,7 @@ static const struct regdef dumpregs[]= { { R_EPC,"R_EPC"}, { -1, NULL } }; -static void mips_dump_exception_frame( CPU_Interrupt_frame *frame ) +void _BSP_Exception_frame_print( const CPU_Exception_frame *frame ) { uint32_t *frame_u32; int i, j; diff --git a/c/src/lib/libbsp/powerpc/psim/configure.ac b/c/src/lib/libbsp/powerpc/psim/configure.ac index c21b7ec5ba..4d6c4535d5 100644 --- a/c/src/lib/libbsp/powerpc/psim/configure.ac +++ b/c/src/lib/libbsp/powerpc/psim/configure.ac @@ -45,7 +45,7 @@ Note that the policy can still be defined by the application CONFIGURE_MALLOC_BSP_SUPPORTS_SBRK this feature is removed and a little memory is saved.]) -RTEMS_BSP_CLEANUP_OPTIONS(0, 1) +RTEMS_BSP_CLEANUP_OPTIONS(0, 1, 1) # Explicitly list all Makefiles here AC_CONFIG_FILES([Makefile]) diff --git a/c/src/lib/libbsp/shared/bspclean.c b/c/src/lib/libbsp/shared/bspclean.c index 1d6f08a274..3e48c2993d 100644 --- a/c/src/lib/libbsp/shared/bspclean.c +++ b/c/src/lib/libbsp/shared/bspclean.c @@ -16,7 +16,7 @@ void bsp_fatal_extension( rtems_fatal_source source, bool is_internal, - rtems_fatal_code error + rtems_fatal_code code ) { #if (BSP_PRESS_KEY_FOR_RESET) @@ -31,6 +31,12 @@ void bsp_fatal_extension( printk("\n"); #endif + #if (BSP_PRINT_EXCEPTION_CONTEXT) + if ( source == RTEMS_FATAL_SOURCE_EXCEPTION ) { + rtems_exception_frame_print( (const rtems_exception_frame *) code ); + } + #endif + /* * Check both conditions -- if you want to ask for reboot, then * you must have meant to reset the board. diff --git a/c/src/lib/libbsp/sparc/erc32/configure.ac b/c/src/lib/libbsp/sparc/erc32/configure.ac index 5f1317c1e2..8155514c39 100644 --- a/c/src/lib/libbsp/sparc/erc32/configure.ac +++ b/c/src/lib/libbsp/sparc/erc32/configure.ac @@ -42,7 +42,7 @@ RTEMS_BSPOPTS_HELP([ENABLE_SIS_QUIRKS], BSP will be enabled. In particular, SIS requires special initialization not used on real ERC32 hardware.]) -RTEMS_BSP_CLEANUP_OPTIONS(0,1) +RTEMS_BSP_CLEANUP_OPTIONS(0,1,1) # Explicitly list all Makefiles here AC_CONFIG_FILES([Makefile]) diff --git a/c/src/lib/libbsp/sparc/erc32/startup/spurious.c b/c/src/lib/libbsp/sparc/erc32/startup/spurious.c index bbf6cca780..b74f0c7230 100644 --- a/c/src/lib/libbsp/sparc/erc32/startup/spurious.c +++ b/c/src/lib/libbsp/sparc/erc32/startup/spurious.c @@ -16,20 +16,15 @@ #include <bsp.h> #include <rtems/bspIo.h> -/* - * bsp_spurious_handler - * - * Print a message on the debug console and then die - */ - -rtems_isr bsp_spurious_handler( - rtems_vector_number trap, - CPU_Interrupt_frame *isf -) +void _BSP_Exception_frame_print( const CPU_Exception_frame *frame ) { - uint32_t real_trap; + uint32_t trap; + uint32_t real_trap; + const CPU_Interrupt_frame *isf; + trap = frame->trap; real_trap = SPARC_REAL_TRAP_NUMBER(trap); + isf = frame->isf; printk( "Unexpected trap (%2d) at address 0x%08x\n", real_trap, isf->tpc); @@ -121,12 +116,22 @@ rtems_isr bsp_spurious_handler( default: break; } +} - /* - * What else can we do but stop ... - */ - - __asm__ volatile( "mov 1, %g1; ta 0x0" ); +rtems_isr bsp_spurious_handler( + rtems_vector_number trap, + CPU_Interrupt_frame *isf +) +{ + CPU_Exception_frame frame = { + .trap = trap, + .isf = isf + }; + + rtems_fatal( + RTEMS_FATAL_SOURCE_EXCEPTION, + (rtems_fatal_code) &frame + ); } /* diff --git a/c/src/lib/libbsp/sparc/leon2/startup/spurious.c b/c/src/lib/libbsp/sparc/leon2/startup/spurious.c index c4bdf79af3..c0500c770d 100644 --- a/c/src/lib/libbsp/sparc/leon2/startup/spurious.c +++ b/c/src/lib/libbsp/sparc/leon2/startup/spurious.c @@ -16,20 +16,15 @@ #include <bsp.h> #include <rtems/bspIo.h> -/* - * bsp_spurious_handler - * - * Print a message on the debug console and then die - */ - -rtems_isr bsp_spurious_handler( - rtems_vector_number trap, - CPU_Interrupt_frame *isf -) +void _BSP_Exception_frame_print( const CPU_Exception_frame *frame ) { - uint32_t real_trap; + uint32_t trap; + uint32_t real_trap; + const CPU_Interrupt_frame *isf; + trap = frame->trap; real_trap = SPARC_REAL_TRAP_NUMBER(trap); + isf = frame->isf; printk( "Unexpected trap (%2d) at address 0x%08x\n", real_trap, isf->tpc); @@ -102,12 +97,22 @@ rtems_isr bsp_spurious_handler( default: break; } +} - /* - * What else can we do but stop ... - */ - - __asm__ volatile( "mov 1, %g1; ta 0x0" ); +rtems_isr bsp_spurious_handler( + rtems_vector_number trap, + CPU_Interrupt_frame *isf +) +{ + CPU_Exception_frame frame = { + .trap = trap, + .isf = isf + }; + + rtems_fatal( + RTEMS_FATAL_SOURCE_EXCEPTION, + (rtems_fatal_code) &frame + ); } /* diff --git a/c/src/lib/libbsp/sparc/leon3/startup/spurious.c b/c/src/lib/libbsp/sparc/leon3/startup/spurious.c index f060e284ca..e12ac018a6 100644 --- a/c/src/lib/libbsp/sparc/leon3/startup/spurious.c +++ b/c/src/lib/libbsp/sparc/leon3/startup/spurious.c @@ -18,23 +18,17 @@ */ #include <bsp.h> - #include <rtems/bspIo.h> -/* - * bsp_spurious_handler - * - * Print a message on the debug console and then die - */ - -rtems_isr bsp_spurious_handler( - rtems_vector_number trap, - CPU_Interrupt_frame *isf -) +void _BSP_Exception_frame_print( const CPU_Exception_frame *frame ) { - uint32_t real_trap; + uint32_t trap; + uint32_t real_trap; + const CPU_Interrupt_frame *isf; + trap = frame->trap; real_trap = SPARC_REAL_TRAP_NUMBER(trap); + isf = frame->isf; printk( "Unexpected trap (0x%02x) at address 0x%08x\n", real_trap, isf->tpc); @@ -113,12 +107,22 @@ rtems_isr bsp_spurious_handler( default: break; } +} - /* - * What else can we do but stop ... - */ - - __asm__ volatile( "mov 1, %g1; ta 0x0" ); +rtems_isr bsp_spurious_handler( + rtems_vector_number trap, + CPU_Interrupt_frame *isf +) +{ + CPU_Exception_frame frame = { + .trap = trap, + .isf = isf + }; + + rtems_fatal( + RTEMS_FATAL_SOURCE_EXCEPTION, + (rtems_fatal_code) &frame + ); } /* |