Disable interrupts as the first step in _Internal_error_Occurred() to get a defined execution context for the fatal extensions. --- cpukit/score/include/rtems/score/interr.h | 4 +++- cpukit/score/src/interr.c | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/cpukit/score/include/rtems/score/interr.h b/cpukit/score/include/rtems/score/interr.h index 8f8d905..87abc7a 100644 --- a/cpukit/score/include/rtems/score/interr.h +++ b/cpukit/score/include/rtems/score/interr.h @@ -176,7 +176,9 @@ extern Internal_errors_Information _Internal_errors_What_happened; * determines that a fatal error has occurred or a final system state is * reached (for example after exit()). * - * The first action of this function is to call the fatal handler of the user + * The first action is to disable interrupts. + * + * The second action of this function is to call the fatal handler of the user * extensions. For the initial extensions the following conditions are * required * - a valid stack pointer and enough stack space, diff --git a/cpukit/score/src/interr.c b/cpukit/score/src/interr.c index 69e7681..38ac455 100644 --- a/cpukit/score/src/interr.c +++ b/cpukit/score/src/interr.c @@ -19,6 +19,7 @@ #endif #include <rtems/score/interr.h> +#include <rtems/score/isrlevel.h> #include <rtems/score/sysstate.h> #include <rtems/score/userextimpl.h> @@ -32,6 +33,11 @@ void _Internal_error_Occurred( Internal_errors_t the_error ) { + ISR_Level level; + + _ISR_Disable( level ); + (void) level; + _User_extensions_Fatal( the_source, is_internal, the_error ); _Internal_errors_What_happened.the_source = the_source; -- 1.7.7 _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel