[PATCH 1/5] Let CPU/BSP Fatal handler have access to source

Daniel Hellstrom daniel at gaisler.com
Fri Jul 4 08:49:18 UTC 2014


Hello Joel,

Thanks for your comments.


On 07/03/2014 04:27 PM, Joel Sherrill wrote:
> This looks mostly mechanical and the biggest issue is
> what to do with the source in the generic shutdown
> case.  The first thing is that I think this is already handled
> and the information is stored in
> _Internal_errors_What_happened in score/src/interr.c
> before _CPU_Fatal_halt() is invoked. I would lean to
> _CPU_Fatal_halt not taking any parameters since the
> information is already stored in memory
I agree to this approach. Having one parameter does not mean anything. I was sloppy and didn't see that _Internal_errors_What_happened was declared extern.

This means I could leave the CPU_Fatal_halt() defined as it is, and access _Internal_errors_What_happened in CPU_Fatal_halt() in SPARC.

>
> Beyond that, When you touch code across all the ports,
> it always highlights where there are unexpected deviations. :(
>
> First, with this patch, it was easy to see that two ports
> reference a fatal error handler in the BSP.  I don't
> see how that is correct or necessary given the code in
> _Terminate() in interr.c.
Ok, I looked at it as a reference..

>
> $ grep -ri bsp_fatal .
> ./powerpc/rtems/score/cpu.h:void _BSP_Fatal_error(unsigned int);
> ./powerpc/rtems/score/cpu.h:  _BSP_Fatal_error(_error)
> ./sh/rtems/score/cpu.h:#ifdef BSP_FATAL_HALT
> ./sh/rtems/score/cpu.h:  void bsp_fatal_halt( uint32_t   _error);
> ./sh/rtems/score/cpu.h:#define _CPU_Fatal_halt( _error ) bsp_fatal_halt(
> _error)
>
> I am guessing these references should be eliminated since the
> BSPs should be getting their fatal error handler invoked by other
> means now.
I don't have the historic picture clear here.

> Second, when I looked over in the BSPs for "grep -i bsp_fatal",
> I see that some PowerPC BSPs have _BSP_Fatal_error. I don't
> see this invoked anywhere. Does this code need to be eliminated?
> Can someone confirm me on this?
It is invoked from score/cpu/powerpc/rtems/score/cpu.h, but I guess this is not what you meant.

DanielH

>
> --joel
>
>
> On 7/3/2014 2:29 AM, Daniel Hellstrom wrote:
>> Without the source the error code does not say that much.
>> Let it be up to the CPU/BSP to determine the error code
>> reported on fatal shutdown.
>>
>> This patch does not change the current behaviour, just
>> adds the option to handle the source of the fatal halt.
>> ---
>>   cpukit/score/cpu/arm/rtems/score/cpu.h     |    2 +-
>>   cpukit/score/cpu/avr/rtems/score/cpu.h     |    2 +-
>>   cpukit/score/cpu/bfin/rtems/score/cpu.h    |    2 +-
>>   cpukit/score/cpu/h8300/rtems/score/cpu.h   |    4 ++--
>>   cpukit/score/cpu/i386/rtems/score/cpu.h    |    2 +-
>>   cpukit/score/cpu/lm32/rtems/score/cpu.h    |    2 +-
>>   cpukit/score/cpu/m32c/rtems/score/cpu.h    |    2 +-
>>   cpukit/score/cpu/m32r/rtems/score/cpu.h    |    2 +-
>>   cpukit/score/cpu/m68k/rtems/score/cpu.h    |    4 ++--
>>   cpukit/score/cpu/mips/rtems/score/cpu.h    |    2 +-
>>   cpukit/score/cpu/moxie/rtems/score/cpu.h   |    4 ++--
>>   cpukit/score/cpu/nios2/nios2-fatal-halt.c  |    2 +-
>>   cpukit/score/cpu/nios2/nios2-iic-irq.c     |    2 +-
>>   cpukit/score/cpu/nios2/rtems/score/cpu.h   |    3 ++-
>>   cpukit/score/cpu/no_cpu/rtems/score/cpu.h  |    2 +-
>>   cpukit/score/cpu/powerpc/rtems/score/cpu.h |    2 +-
>>   cpukit/score/cpu/sh/rtems/score/cpu.h      |    4 ++--
>>   cpukit/score/cpu/sparc/rtems/score/cpu.h   |    2 +-
>>   cpukit/score/cpu/sparc64/rtems/score/cpu.h |    2 +-
>>   cpukit/score/cpu/v850/rtems/score/cpu.h    |    2 +-
>>   cpukit/score/src/interr.c                  |    2 +-
>>   21 files changed, 26 insertions(+), 25 deletions(-)
>>
>> diff --git a/cpukit/score/cpu/arm/rtems/score/cpu.h b/cpukit/score/cpu/arm/rtems/score/cpu.h
>> index ad070df..98bd755 100644
>> --- a/cpukit/score/cpu/arm/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/arm/rtems/score/cpu.h
>> @@ -455,7 +455,7 @@ void _CPU_Context_Initialize(
>>       *(*(_destination)) = _CPU_Null_fp_context; \
>>     } while (0)
>>
>> -#define _CPU_Fatal_halt( _err )             \
>> +#define _CPU_Fatal_halt( _source, _err )    \
>>      do {                                     \
>>        uint32_t _level;                       \
>>        uint32_t _error = _err;                \
>> diff --git a/cpukit/score/cpu/avr/rtems/score/cpu.h b/cpukit/score/cpu/avr/rtems/score/cpu.h
>> index 70a0ddb..ba3bfb8 100644
>> --- a/cpukit/score/cpu/avr/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/avr/rtems/score/cpu.h
>> @@ -814,7 +814,7 @@ uint32_t   _CPU_ISR_Get_level( void );
>>    *  XXX document implementation including references if appropriate
>>    */
>>
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { \
>>     }
>>
>> diff --git a/cpukit/score/cpu/bfin/rtems/score/cpu.h b/cpukit/score/cpu/bfin/rtems/score/cpu.h
>> index 306e4eb..0b728e7 100644
>> --- a/cpukit/score/cpu/bfin/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/bfin/rtems/score/cpu.h
>> @@ -912,7 +912,7 @@ void _CPU_Context_Initialize(
>>    *
>>    * XXX document implementation including references if appropriate
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { \
>>       __asm__ volatile ( "cli R1; \
>>                       R1 = %0; \
>> diff --git a/cpukit/score/cpu/h8300/rtems/score/cpu.h b/cpukit/score/cpu/h8300/rtems/score/cpu.h
>> index 621b3f1..8170445 100644
>> --- a/cpukit/score/cpu/h8300/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/h8300/rtems/score/cpu.h
>> @@ -847,8 +847,8 @@ uint32_t   _CPU_ISR_Get_level( void );
>>    *  XXX
>>    */
>>
>> -#define _CPU_Fatal_halt( _error ) \
>> -       printk("Fatal Error %d Halted\n",_error); \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>> +       printk("Fatal Error %d.%d Halted\n",_source, _error); \
>>          for(;;)
>>
>>
>> diff --git a/cpukit/score/cpu/i386/rtems/score/cpu.h b/cpukit/score/cpu/i386/rtems/score/cpu.h
>> index 2d1472d..e0ab037 100644
>> --- a/cpukit/score/cpu/i386/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/i386/rtems/score/cpu.h
>> @@ -525,7 +525,7 @@ uint32_t   _CPU_ISR_Get_level( void );
>>    *    + disable interrupts and halt the CPU
>>    */
>>
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { \
>>       uint32_t _error_lvalue = ( _error ); \
>>       __asm__ volatile ( "cli ; \
>> diff --git a/cpukit/score/cpu/lm32/rtems/score/cpu.h b/cpukit/score/cpu/lm32/rtems/score/cpu.h
>> index 8e03245..17fa33c 100644
>> --- a/cpukit/score/cpu/lm32/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/lm32/rtems/score/cpu.h
>> @@ -915,7 +915,7 @@ extern char _gp[];
>>    *
>>    * XXX document implementation including references if appropriate
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { \
>>     }
>>
>> diff --git a/cpukit/score/cpu/m32c/rtems/score/cpu.h b/cpukit/score/cpu/m32c/rtems/score/cpu.h
>> index fa31d74..011fe48 100644
>> --- a/cpukit/score/cpu/m32c/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/m32c/rtems/score/cpu.h
>> @@ -906,7 +906,7 @@ void _CPU_Context_Restart_self(
>>    *
>>    * XXX document implementation including references if appropriate
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { \
>>     }
>>
>> diff --git a/cpukit/score/cpu/m32r/rtems/score/cpu.h b/cpukit/score/cpu/m32r/rtems/score/cpu.h
>> index bf1d3fc..d35bee8 100644
>> --- a/cpukit/score/cpu/m32r/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/m32r/rtems/score/cpu.h
>> @@ -924,7 +924,7 @@ void _CPU_Context_Restart_self(
>>    *
>>    * XXX document implementation including references if appropriate
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { \
>>     }
>>
>> diff --git a/cpukit/score/cpu/m68k/rtems/score/cpu.h b/cpukit/score/cpu/m68k/rtems/score/cpu.h
>> index fb0c60c..d222465 100644
>> --- a/cpukit/score/cpu/m68k/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/m68k/rtems/score/cpu.h
>> @@ -479,7 +479,7 @@ void *_CPU_Thread_Idle_body( uintptr_t ignored );
>>    */
>>
>>   #if ( defined(__mcoldfire__) )
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { __asm__ volatile( "move.w %%sr,%%d0\n\t" \
>>                    "or.l %2,%%d0\n\t" \
>>                    "move.w %%d0,%%sr\n\t" \
>> @@ -491,7 +491,7 @@ void *_CPU_Thread_Idle_body( uintptr_t ignored );
>>                    : "d0", "d1" ); \
>>     }
>>   #else
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { __asm__ volatile( "movl  %0,%%d0; " \
>>                     "orw   #0x0700,%%sr; " \
>>                     "stop  #0x2700" : "=d" ((_error)) : "0" ((_error)) ); \
>> diff --git a/cpukit/score/cpu/mips/rtems/score/cpu.h b/cpukit/score/cpu/mips/rtems/score/cpu.h
>> index 392a995..7fc639b 100644
>> --- a/cpukit/score/cpu/mips/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/mips/rtems/score/cpu.h
>> @@ -913,7 +913,7 @@ void _CPU_Context_Initialize(
>>    *  halts/stops the CPU.
>>    */
>>
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     do { \
>>       unsigned int _level; \
>>       _CPU_ISR_Disable(_level); \
>> diff --git a/cpukit/score/cpu/moxie/rtems/score/cpu.h b/cpukit/score/cpu/moxie/rtems/score/cpu.h
>> index 2c72bf6..cf22601 100644
>> --- a/cpukit/score/cpu/moxie/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/moxie/rtems/score/cpu.h
>> @@ -733,8 +733,8 @@ uint32_t   _CPU_ISR_Get_level( void );
>>    *
>>    *  XXX
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> -        printk("Fatal Error %d Halted\n",_error); \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>> +        printk("Fatal Error %d.%d Halted\n",_source,_error); \
>>           for(;;)
>>
>>   /* end of Fatal Error manager macros */
>> diff --git a/cpukit/score/cpu/nios2/nios2-fatal-halt.c b/cpukit/score/cpu/nios2/nios2-fatal-halt.c
>> index 7632fa5..40cae87 100644
>> --- a/cpukit/score/cpu/nios2/nios2-fatal-halt.c
>> +++ b/cpukit/score/cpu/nios2/nios2-fatal-halt.c
>> @@ -14,7 +14,7 @@
>>   #include <rtems/score/cpu.h>
>>   #include <rtems/score/nios2-utility.h>
>>
>> -void _CPU_Fatal_halt( uint32_t _error )
>> +void _CPU_Fatal_halt( uint32_t _source, uint32_t _error )
>>   {
>>     /* write 0 to status register (disable interrupts) */
>>     __builtin_wrctl( NIOS2_CTLREG_INDEX_STATUS, 0 );
>> diff --git a/cpukit/score/cpu/nios2/nios2-iic-irq.c b/cpukit/score/cpu/nios2/nios2-iic-irq.c
>> index 8f3f3b9..f51bc2d 100644
>> --- a/cpukit/score/cpu/nios2/nios2-iic-irq.c
>> +++ b/cpukit/score/cpu/nios2/nios2-iic-irq.c
>> @@ -133,5 +133,5 @@ void __ISR_Handler(void)
>>
>>   void __Exception_Handler(CPU_Exception_frame *efr)
>>   {
>> -  _CPU_Fatal_halt(0xECC0);
>> +  _CPU_Fatal_halt(RTEMS_FATAL_SOURCE_EXCEPTION, 0xECC0); /* source ignored */
>>   }
>> diff --git a/cpukit/score/cpu/nios2/rtems/score/cpu.h b/cpukit/score/cpu/nios2/rtems/score/cpu.h
>> index fcfef8d..a14392c 100644
>> --- a/cpukit/score/cpu/nios2/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/nios2/rtems/score/cpu.h
>> @@ -310,7 +310,8 @@ void _CPU_Context_Initialize(
>>   #define _CPU_Context_Restart_self( _the_context ) \
>>     _CPU_Context_restore( (_the_context) );
>>
>> -void _CPU_Fatal_halt( uint32_t _error ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
>> +void _CPU_Fatal_halt( uint32_t _source, uint32_t _error )
>> +  RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
>>
>>   /**
>>    * @brief CPU initialization.
>> diff --git a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
>> index 9570fb6..aa0ea52 100644
>> --- a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
>> @@ -1042,7 +1042,7 @@ uint32_t   _CPU_ISR_Get_level( void );
>>    *
>>    * XXX document implementation including references if appropriate
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     { \
>>     }
>>
>> diff --git a/cpukit/score/cpu/powerpc/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
>> index 3cad329..54d701d 100644
>> --- a/cpukit/score/cpu/powerpc/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
>> @@ -677,7 +677,7 @@ void _BSP_Fatal_error(unsigned int);
>>
>>   #endif /* ASM */
>>
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     _BSP_Fatal_error(_error)
>>
>>   /* end of Fatal Error manager macros */
>> diff --git a/cpukit/score/cpu/sh/rtems/score/cpu.h b/cpukit/score/cpu/sh/rtems/score/cpu.h
>> index cb89953..217eb7d 100644
>> --- a/cpukit/score/cpu/sh/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/sh/rtems/score/cpu.h
>> @@ -675,9 +675,9 @@ SCORE_EXTERN void _CPU_Context_Initialize(
>>   #ifdef BSP_FATAL_HALT
>>     /* we manage the fatal error in the board support package */
>>     void bsp_fatal_halt( uint32_t   _error);
>> -#define _CPU_Fatal_halt( _error ) bsp_fatal_halt( _error)
>> +#define _CPU_Fatal_halt( _source, _error ) bsp_fatal_halt( _error)
>>   #else
>> -#define _CPU_Fatal_halt( _error)\
>> +#define _CPU_Fatal_halt( _source, _error)\
>>   { \
>>     __asm__ volatile("mov.l %0,r0"::"m" (_error)); \
>>     __asm__ volatile("mov #1, r4"); \
>> diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h b/cpukit/score/cpu/sparc/rtems/score/cpu.h
>> index c010005..58c843a 100644
>> --- a/cpukit/score/cpu/sparc/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h
>> @@ -1080,7 +1080,7 @@ void _CPU_Context_Initialize(
>>    * location or a register, optionally disables interrupts, and
>>    * halts/stops the CPU.
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     do { \
>>       uint32_t   level; \
>>       \
>> diff --git a/cpukit/score/cpu/sparc64/rtems/score/cpu.h b/cpukit/score/cpu/sparc64/rtems/score/cpu.h
>> index bf7d4fb..dd5040a 100644
>> --- a/cpukit/score/cpu/sparc64/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/sparc64/rtems/score/cpu.h
>> @@ -905,7 +905,7 @@ void _CPU_Context_Initialize(
>>    *  halts/stops the CPU.
>>    */
>>
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     do { \
>>       uint32_t   level; \
>>       \
>> diff --git a/cpukit/score/cpu/v850/rtems/score/cpu.h b/cpukit/score/cpu/v850/rtems/score/cpu.h
>> index 7234d67..e76a2a2 100644
>> --- a/cpukit/score/cpu/v850/rtems/score/cpu.h
>> +++ b/cpukit/score/cpu/v850/rtems/score/cpu.h
>> @@ -871,7 +871,7 @@ void _CPU_Context_Initialize(
>>    *
>>    * Move the error code into r10, disable interrupts and halt.
>>    */
>> -#define _CPU_Fatal_halt( _error ) \
>> +#define _CPU_Fatal_halt( _source, _error ) \
>>     do { \
>>       __asm__ __volatile__ ( "di" ); \
>>       __asm__ __volatile__ ( "mov %0, r10; " : "=r" ((_error)) ); \
>> diff --git a/cpukit/score/src/interr.c b/cpukit/score/src/interr.c
>> index 97ca3c7..f7d6274 100644
>> --- a/cpukit/score/src/interr.c
>> +++ b/cpukit/score/src/interr.c
>> @@ -49,7 +49,7 @@ void _Terminate(
>>
>>     _System_state_Set( SYSTEM_STATE_TERMINATED );
>>
>> -  _CPU_Fatal_halt( the_error );
>> +  _CPU_Fatal_halt( the_source, the_error );
>>
>>     /* will not return from this routine */
>>     while (true);
>> --
>> 1.7.0.4
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel




More information about the devel mailing list