On Jul 4, 2014 3:47 AM, Daniel Hellstrom <dan...@gaisler.com> wrote: > > On 07/03/2014 04:55 PM, Joel Sherrill wrote: > > I am wondering if I don't have a vision for what this > > series of patches is trying to accomplish in whole. > * make exit-code propagate to debugger/hypervisor. I though this would be > nice for other architectures as well. > * make SMP fatal exit work > * instead of using BSP specific reset on LEON3, rely on RTEMS and SPARC to > stop execution > * fix bad behaviour of SPARC fatal halt, always spinning. > > > > > And I am hung up on not wanting BSP references in > > score. So I would like an elegant solution. > I understand that, however some part of me still thinks that halting is very > BSP specific. What makes me a bit confused is that there is just one halt > approach, there is no difference between reset, > reboot, halt and power-down. I remember Win95 or Linux, when you type halt it > does not reboot or power-down the machine, since you can see the last > terminal shutdown message and push the power-down > button yourself ;) > > > How does tweaking the bsp_reset() method not > > address all of this? It is invoked along the _Terminate() > > path already. > > > > As an aside, should the _Internal_errors_What_happened > > structure be filled in earlier in _Terminate? How about > > just after disabling interrupts? > That is one of the problems I faced. > * bsp_reset() does not have any arguments of what gone wrong > * _Internal_errors_What_happened is not modified until after bsp_reset() > * _Internal_errors_What_happened can not be updated before bsp_reset() on > SMP since it will be written by all CPUs > * The exit codes of CPUs are different. If one CPU finds a problem, signals > to the others to shut down, their IPI handler will call fatal handler with > another exit code. Now the BSP in the fatal > extions can look at the exit codes to determine which CPU requested the fatal > exit and handle them differently. The BSP makes sure that only one CPU ends > up in the >
Would it help if bsp_reset() took arguments? I see the problem now. > > > > On 7/3/2014 2:29 AM, Daniel Hellstrom wrote: > >> PATCHv2: BSP_fatal_halt renamed to _BSP_Fatal_halt > >> > >> The Fatal_halt handler now have two options, either halt > >> as before or enter system error state to return to > >> debugger or simulator. The exit-code is now also > >> propagated to the debugger which is very useful for > >> testing. > >> > >> The CPU_Fatal_halt handler was split up into two, since > >> the only the LEON3 support the CPU power down. > >> > >> The LEON3 halt now uses the power-down instruction to save > >> CPU power. This doesn't stop a potential watch-dog timer > >> from expiring. > >> --- > >> c/src/lib/libbsp/sparc/erc32/Makefile.am | 1 + > >> c/src/lib/libbsp/sparc/erc32/configure.ac | 5 +++ > >> c/src/lib/libbsp/sparc/leon2/Makefile.am | 1 + > >> c/src/lib/libbsp/sparc/leon2/configure.ac | 5 +++ > >> c/src/lib/libbsp/sparc/leon3/Makefile.am | 1 + > >> c/src/lib/libbsp/sparc/leon3/configure.ac | 5 +++ > >> .../libbsp/sparc/leon3/startup/bsp_fatal_halt.c | 36 > >> ++++++++++++++++++ > >> .../libbsp/sparc/shared/startup/bsp_fatal_halt.c | 38 > >> ++++++++++++++++++++ > >> cpukit/score/cpu/sparc/rtems/score/cpu.h | 12 ++---- > >> 9 files changed, 96 insertions(+), 8 deletions(-) > >> create mode 100644 c/src/lib/libbsp/sparc/leon3/startup/bsp_fatal_halt.c > >> create mode 100644 c/src/lib/libbsp/sparc/shared/startup/bsp_fatal_halt.c > >> > >> diff --git a/c/src/lib/libbsp/sparc/erc32/Makefile.am > >> b/c/src/lib/libbsp/sparc/erc32/Makefile.am > >> index b9f1c53..00e398b 100644 > >> --- a/c/src/lib/libbsp/sparc/erc32/Makefile.am > >> +++ b/c/src/lib/libbsp/sparc/erc32/Makefile.am > >> @@ -46,6 +46,7 @@ libbsp_a_SOURCES += startup/bspidle.c > >> libbsp_a_SOURCES += startup/bspdelay.c > >> libbsp_a_SOURCES += ../../sparc/shared/startup/early_malloc.c > >> libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_exit.c > >> +libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_halt.c > >> # ISR Handler > >> libbsp_a_SOURCES += ../../sparc/shared/cpu.c > >> libbsp_a_SOURCES += ../../sparc/shared/irq_asm.S > >> diff --git a/c/src/lib/libbsp/sparc/erc32/configure.ac > >> b/c/src/lib/libbsp/sparc/erc32/configure.ac > >> index 4cbfb7e..bb5174a 100644 > >> --- a/c/src/lib/libbsp/sparc/erc32/configure.ac > >> +++ b/c/src/lib/libbsp/sparc/erc32/configure.ac > >> @@ -43,6 +43,11 @@ RTEMS_BSPOPTS_HELP([ENABLE_SIS_QUIRKS], > >> BSP will be enabled. In particular, SIS requires special > >> initialization not used on real ERC32 hardware.]) > >> > >> +RTEMS_BSPOPTS_SET([BSP_HALT_AT_FATAL_EXIT],[*],[]) > >> +RTEMS_BSPOPTS_HELP([BSP_HALT_AT_FATAL_EXIT], > >> +[If defined, CPU is spinning on fatal exit. Otherwise generate system > >> + error which will hand over to debugger, simulator, etc.]) > >> + > > Why would anyone want the CPU to go into a spin? > This was the previous behaviour of SPARC CPU_fatal_halt(), the only reason > for that as I could come up with would be that the watchdog timer expires and > causes a hard reset. I wanted to preserve the > current behaviour, I change quite much in the patch series anyway. > > >> RTEMS_BSP_CLEANUP_OPTIONS(0,1,1) > >> > >> # Explicitly list all Makefiles here > >> diff --git a/c/src/lib/libbsp/sparc/leon2/Makefile.am > >> b/c/src/lib/libbsp/sparc/leon2/Makefile.am > >> index 3f8edf4..ac6f327 100644 > >> --- a/c/src/lib/libbsp/sparc/leon2/Makefile.am > >> +++ b/c/src/lib/libbsp/sparc/leon2/Makefile.am > >> @@ -61,6 +61,7 @@ libbsp_a_SOURCES += ../../shared/bspinit.c > >> libbsp_a_SOURCES += startup/bspdelay.c > >> libbsp_a_SOURCES += ../../sparc/shared/startup/early_malloc.c > >> libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_exit.c > >> +libbsp_a_SOURCES += ../../sparc/shared/startup/bsp_fatal_halt.c > >> > >> # ISR Handler > >> libbsp_a_SOURCES += ../../sparc/shared/cpu.c > >> diff --git a/c/src/lib/libbsp/sparc/leon2/configure.ac > >> b/c/src/lib/libbsp/sparc/leon2/configure.ac > >> index 610a049..1975a10 100644 > >> --- a/c/src/lib/libbsp/sparc/leon2/configure.ac > >> +++ b/c/src/lib/libbsp/sparc/leon2/configure.ac > >> @@ -36,6 +36,11 @@ RTEMS_BSPOPTS_HELP([SIMSPARC_FAST_IDLE], > >> time spent in the idle task is minimized. This significantly reduces > >> the wall time required to execute the RTEMS test suites.]) > >> > >> +RTEMS_BSPOPTS_SET([BSP_HALT_AT_FATAL_EXIT],[*],[]) > >> +RTEMS_BSPOPTS_HELP([BSP_HALT_AT_FATAL_EXIT], > >> +[If defined, CPU is spinning on fatal exit. Otherwise generate system > >> + error which will hand over to debugger, simulator, etc.]) > >> + > >> RTEMS_BSP_CLEANUP_OPTIONS(0, 1, 1) > >> > >> # Explicitly list all Makefiles here > >> diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am > >> b/c/src/lib/libbsp/sparc/leon3/Makefile.am > >> index 54c9f22..d1f07a7 100644 > >> --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am > >> +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am > >> @@ -42,6 +42,7 @@ libbsp_a_SOURCES += ../../shared/bspclean.c > >> ../../shared/bsplibc.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 > >> > >> # ISR Handler > >> libbsp_a_SOURCES += ../../sparc/shared/cpu.c > >> diff --git a/c/src/lib/libbsp/sparc/leon3/configure.ac > >> b/c/src/lib/libbsp/sparc/leon3/configure.ac > >> index 3fe1e48..206a662 100644 > >> --- a/c/src/lib/libbsp/sparc/leon3/configure.ac > >> +++ b/c/src/lib/libbsp/sparc/leon3/configure.ac > >> @@ -38,6 +38,11 @@ RTEMS_BSPOPTS_HELP([BSP_LEON3_SMP], > >> [Always defined when on a LEON3 to enable the LEON3 support for > >> determining the CPU core number in an SMP configuration.]) > >> > >> +RTEMS_BSPOPTS_SET([BSP_HALT_AT_FATAL_EXIT],[*],[]) > >> +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_LINKCMDS > >> > >> diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bsp_fatal_halt.c > >> b/c/src/lib/libbsp/sparc/leon3/startup/bsp_fatal_halt.c > >> new file mode 100644 > >> index 0000000..4350faf > >> --- /dev/null > >> +++ b/c/src/lib/libbsp/sparc/leon3/startup/bsp_fatal_halt.c > >> @@ -0,0 +1,36 @@ > >> +/** > >> + * @file > >> + * @ingroup sparc_leon3 > >> + * @brief LEON3 BSP Fatal_halt handler. > >> + * > >> + * COPYRIGHT (c) 2014. > >> + * Aeroflex Gaisler AB. > >> + * > >> + * 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 <leon.h> > >> +#include <rtems/score/sparc.h> > >> + > >> +#ifdef BSP_HALT_AT_FATAL_EXIT > >> + > >> +/* Power down LEON CPU on fatal error exit */ > >> +void _BSP_Fatal_halt(uint32_t source, uint32_t error) > >> +{ > >> + sparc_disable_interrupts(); > >> + leon3_power_down_loop(); > >> +} > >> + > >> +#else > >> + > >> +/* return to debugger, simulator, hypervisor or similar by exiting > >> + * with an error code. g1=1, g2=FATAL_SOURCE, G3=error-code. > >> + */ > >> +void _BSP_Fatal_halt(uint32_t source, uint32_t error) > >> +{ > >> + sparc_syscall_exit(source, error); > >> +} > >> + > >> +#endif > >> diff --git a/c/src/lib/libbsp/sparc/shared/startup/bsp_fatal_halt.c > >> b/c/src/lib/libbsp/sparc/shared/startup/bsp_fatal_halt.c > >> new file mode 100644 > >> index 0000000..349db20 > >> --- /dev/null > >> +++ b/c/src/lib/libbsp/sparc/shared/startup/bsp_fatal_halt.c > >> @@ -0,0 +1,38 @@ > >> +/** > >> + * @file > >> + * @ingroup sparc_bsp > >> + * @brief ERC32/LEON2 BSP Fatal_halt handler. > >> + * > >> + * COPYRIGHT (c) 2014. > >> + * Aeroflex Gaisler AB. > >> + * > >> + * 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 <rtems/score/sparc.h> > >> + > >> +#ifdef BSP_HALT_AT_FATAL_EXIT > >> + > >> +/* Spin CPU on fatal error exit */ > >> +void _BSP_Fatal_halt(uint32_t source, uint32_t error) > >> +{ > >> + uint32_t level = sparc_disable_interrupts(); > >> + > >> + __asm__ volatile ( "mov %0, %%g1 " : "=r" (level) : "0" (level) ); > >> + > >> + while (1) ; /* loop forever */ > >> +} > >> + > >> +#else > >> + > >> +/* return to debugger, simulator, hypervisor or similar by exiting > >> + * with an error code. g1=1, g2=FATAL_SOURCE, G3=error-code. > >> + */ > >> +void _BSP_Fatal_halt(uint32_t source, uint32_t error) > >> +{ > >> + sparc_syscall_exit(source, error); > >> +} > >> + > >> +#endif > >> diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h > >> b/cpukit/score/cpu/sparc/rtems/score/cpu.h > >> index 58c843a..0bb1bf5 100644 > >> --- a/cpukit/score/cpu/sparc/rtems/score/cpu.h > >> +++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h > >> @@ -1075,19 +1075,15 @@ void _CPU_Context_Initialize( > >> > >> /* Fatal Error manager macros */ > >> > >> +extern void _BSP_Fatal_halt(uint32_t source, uint32_t error) > >> + RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; > >> + > > I am really having trouble invoking a BSP specific routine > > out of score/cpu. Can't you do this in the bsp_reset() > > method? > No, the debugger/hypervisor typically reads registers as exit-codes not > memory so it has to be done last. I'm not sure how it works on other > architectures, can we always rely on memory for getting > exit-codes? If we would read the exit codes from memory from > loader/debugger/hypervisor it would require ELF capability or that the BSP > defines which address _Internal_errors_What_happened is to be > located at I guess > > > If not, the leon3 is now a multilib so you can just have a > > leon3 specific version of this macro. > I'm not sure I follow here. > > > Please see the code below where the SPARC implements an endless spin after > disabling interrupt. I substituted that with a power-down instead, as the > commit message suggests it does not stop a watchdog > to expire and reset. > >> /** > >> * This routine copies _error into a known place -- typically a stack > >> * location or a register, optionally disables interrupts, and > >> * halts/stops the CPU. > >> */ > >> -#define _CPU_Fatal_halt( _source, _error ) \ > >> - do { \ > >> - uint32_t level; \ > >> - \ > >> - level = sparc_disable_interrupts(); \ > >> - __asm__ volatile ( "mov %0, %%g1 " : "=r" (level) : "0" (level) ); \ > >> - while (1); /* loop forever */ \ > >> - } while (0) > >> +#define _CPU_Fatal_halt( _source, _error ) _BSP_Fatal_halt( _source, > >> _error ) > >> > >> /* end of Fatal Error manager macros */ > >> >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel