On 7/3/2014 2:29 AM, Daniel Hellstrom wrote: > By removing the bsp_reset() mechanism and instead relying on the > CPU_Fatal_halt() routine SMP and single-core can halt by updating > the _Internal_errors_What_happened structure and set the state to > SYSTEM_STATE_TERMINATED (the generic way). This will be better > for test scripts and debugger that can generically look into why > the OS stopped. > > For SMP systems, only the fatal-reporting CPU waits until all other > CPUs are powered down (with a time out of one clock tick). The > reason why a fatal stop happend may be because CPU0 was soft-locked > up so we can never trust that CPU0 should do the halt for us.
And in the last patch, the reason for this series. :) Do we need a generic call to bsp_fatal_halt() before _CPU_Fatal_halt() in interr.c? And move setting _Internal_errors_What_happened up to just after disable interrupts? I am more comfortable adding a cross-architecture solution than hacking on _CPU_Fatal_halt() and introducing architecture specific differences. Sebastian did a nice job cleaning this path up. If there is a case missing, then we need to address it in a cross-BSP way. Hopefully Sebastian will pipe up soon. > --- > c/src/lib/libbsp/sparc/leon3/Makefile.am | 4 +- > c/src/lib/libbsp/sparc/leon3/configure.ac | 2 +- > c/src/lib/libbsp/sparc/leon3/startup/bspclean.c | 84 > +++++++++++++++++++++++ > c/src/lib/libbsp/sparc/leon3/startup/bspreset.c | 62 ----------------- > 4 files changed, 87 insertions(+), 65 deletions(-) > create mode 100644 c/src/lib/libbsp/sparc/leon3/startup/bspclean.c > delete mode 100644 c/src/lib/libbsp/sparc/leon3/startup/bspreset.c > > diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am > b/c/src/lib/libbsp/sparc/leon3/Makefile.am > index d1f07a7..9e60046 100644 > --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am > +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am > @@ -32,14 +32,14 @@ noinst_LIBRARIES += libbsp.a > libbsp_a_SOURCES = > > # startup > -libbsp_a_SOURCES += ../../shared/bspclean.c ../../shared/bsplibc.c \ > +libbsp_a_SOURCES += startup/bspclean.c > +libbsp_a_SOURCES += ../../shared/bsplibc.c \ > ../../shared/bsppost.c ../../shared/bootcard.c startup/bspstart.c \ > ../../sparc/shared/bsppretaskinghook.c startup/bsppredriver.c \ > ../../sparc/shared/startup/bspgetworkarea.c ../../shared/sbrk.c \ > startup/setvec.c \ > startup/spurious.c startup/bspidle.S startup/bspdelay.c \ > ../../shared/bspinit.c ../../sparc/shared/startup/early_malloc.c > -libbsp_a_SOURCES += startup/bspreset.c > libbsp_a_SOURCES += startup/cpucounter.c > libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_exit.c > libbsp_a_SOURCES += startup/bsp_fatal_halt.c > diff --git a/c/src/lib/libbsp/sparc/leon3/configure.ac > b/c/src/lib/libbsp/sparc/leon3/configure.ac > index 206a662..90e3b2b 100644 > --- a/c/src/lib/libbsp/sparc/leon3/configure.ac > +++ b/c/src/lib/libbsp/sparc/leon3/configure.ac > @@ -43,7 +43,7 @@ RTEMS_BSPOPTS_HELP([BSP_HALT_AT_FATAL_EXIT], > [If defined, CPU is powered down on fatal exit. Otherwise generate system > error which will hand over to debugger, simulator, etc.]) > > -RTEMS_BSP_CLEANUP_OPTIONS(0, 1, 1) > +RTEMS_BSP_CLEANUP_OPTIONS(0, 0, 1) > RTEMS_BSP_LINKCMDS > > # Explicitly list all Makefiles here > diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspclean.c > b/c/src/lib/libbsp/sparc/leon3/startup/bspclean.c > new file mode 100644 > index 0000000..3a036a0 > --- /dev/null > +++ b/c/src/lib/libbsp/sparc/leon3/startup/bspclean.c > @@ -0,0 +1,84 @@ > +/** > + * @file > + * @ingroup sparc_leon3 > + * @brief LEON3 BSP fatal extension > + * > + * Copyright (c) 2014 embedded brains GmbH. All rights reserved. > + * > + * embedded brains GmbH > + * Dornierstr. 4 > + * 82178 Puchheim > + * Germany > + * <rt...@embedded-brains.de> > + * > + * COPYRIGHT (c) 2014 > + * Aeroflex Gaisler > + * > + * The license and distribution terms for this file may be > + * found in the file LICENSE in this distribution or at > + * http://www.rtems.org/license/LICENSE. > + */ > + > +#include <bsp.h> > +#include <bsp/bootcard.h> > +#include <rtems/bspIo.h> > +#include <rtems/score/smpimpl.h> > + > +void bsp_fatal_extension( > + rtems_fatal_source source, > + bool is_internal, > + rtems_fatal_code code > +) > +{ > + /* On SMP we must wait for all other CPUs not requesting a fatal halt, they > + * are responding to another CPU's fatal request. These CPUs goes into > + * power-down. The CPU requesting fatal halt waits for the others and then > + * handles the system shutdown via the normal procedure. > + */ > + #ifdef RTEMS_SMP > + if ((source == RTEMS_FATAL_SOURCE_SMP) && > + (code == SMP_FATAL_SHUTDOWN_RESPONSE)) { > + leon3_power_down_loop(); /* CPU didn't start shutdown sequence .. */ > + } else { > + volatile struct irqmp_regs *irqmp = LEON3_IrqCtrl_Regs; > + > + if (irqmp != NULL) { > + /* > + * Value was choosen to get something in the magnitude of 1ms on a > 200MHz > + * processor. > + */ > + uint32_t max_wait = 1234567; > + uint32_t self_cpu = rtems_get_current_processor(); > + > + uint32_t cpu_count = rtems_get_processor_count(); > + uint32_t halt_mask = 0; > + uint32_t i; > + > + for (i = 0; i < cpu_count; ++i) { > + if (i != self_cpu) { > + halt_mask |= UINT32_C(1) << i; > + } > + } > + > + /* Wait some time for secondary processors to halt */ > + i = 0; > + while ((irqmp->mpstat & halt_mask) != halt_mask && i < max_wait) { > + ++i; > + } > + } > + } > + #endif > + > + #if (BSP_PRINT_EXCEPTION_CONTEXT) > + if ( source == RTEMS_FATAL_SOURCE_EXCEPTION ) { > + rtems_exception_frame_print( (const rtems_exception_frame *) code ); > + } > + #endif > + > + /* > + * If user wants to implement custom reset/reboot it can be done here > + */ > + #if (BSP_RESET_BOARD_AT_EXIT) > + bsp_reset(); > + #endif > +} > diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspreset.c > b/c/src/lib/libbsp/sparc/leon3/startup/bspreset.c > deleted file mode 100644 > index c642a75..0000000 > --- a/c/src/lib/libbsp/sparc/leon3/startup/bspreset.c > +++ /dev/null > @@ -1,62 +0,0 @@ > -/* > - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. > - * > - * embedded brains GmbH > - * Dornierstr. 4 > - * 82178 Puchheim > - * Germany > - * <rt...@embedded-brains.de> > - * > - * The license and distribution terms for this file may be > - * found in the file LICENSE in this distribution or at > - * http://www.rtems.org/license/LICENSE. > - */ > - > -#include <bsp.h> > -#include <bsp/bootcard.h> > -#include <leon.h> > - > -#ifdef RTEMS_SMP > - > -void bsp_reset(void) > -{ > - uint32_t self_cpu = rtems_get_current_processor(); > - > - if (self_cpu == 0) { > - volatile struct irqmp_regs *irqmp = LEON3_IrqCtrl_Regs; > - > - if (irqmp != NULL) { > - /* > - * Value was choosen to get something in the magnitude of 1ms on a > 200MHz > - * processor. > - */ > - uint32_t max_wait = 1234567; > - > - uint32_t cpu_count = rtems_get_processor_count(); > - uint32_t halt_mask = 0; > - uint32_t i; > - > - for (i = 0; i < cpu_count; ++i) { > - if (i != self_cpu) { > - halt_mask |= UINT32_C(1) << i; > - } > - } > - > - /* Wait some time for secondary processors to halt */ > - i = 0; > - while ((irqmp->mpstat & halt_mask) != halt_mask && i < max_wait) { > - ++i; > - } > - } > - > - __asm__ volatile ( > - "mov 1, %g1\n" > - "ta 0\n" > - "nop" > - ); > - } > - > - leon3_power_down_loop(); > -} > - > -#endif /* RTEMS_SMP */ -- Joel Sherrill, Ph.D. Director of Research & Development joel.sherr...@oarcorp.com On-Line Applications Research Ask me about RTEMS: a free RTOS Huntsville AL 35805 Support Available (256) 722-9985 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel