score: Postpone SMP shutdown in _Terminate()

This enables fatal extensions to continue program execution after some
fatal errors.
This commit is contained in:
Sebastian Huber
2016-07-06 09:33:32 +02:00
parent 008efaff7f
commit 6f6cf78501
3 changed files with 24 additions and 25 deletions
+2 -2
View File
@@ -33,8 +33,6 @@ void _Terminate(
Internal_errors_t the_error
)
{
_SMP_Request_shutdown();
_User_extensions_Fatal( the_source, is_internal, the_error );
_Internal_errors_What_happened.the_source = the_source;
@@ -43,6 +41,8 @@ void _Terminate(
_System_state_Set( SYSTEM_STATE_TERMINATED );
_SMP_Request_shutdown();
_CPU_Fatal_halt( the_source, the_error );
/* will not return from this routine */
+5 -2
View File
@@ -158,9 +158,12 @@ void _SMP_Start_multitasking_on_secondary_processor( void )
void _SMP_Request_shutdown( void )
{
Per_CPU_Control *self_cpu = _Per_CPU_Get();
ISR_Level level;
_Per_CPU_State_change( self_cpu, PER_CPU_STATE_SHUTDOWN );
_ISR_Local_disable( level );
(void) level;
_Per_CPU_State_change( _Per_CPU_Get(), PER_CPU_STATE_SHUTDOWN );
}
void _SMP_Send_message( uint32_t cpu_index, unsigned long message )
+17 -21
View File
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
* Copyright (c) 2014, 2016 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -47,33 +47,29 @@ static void fatal_extension(
)
{
SMP_barrier_State barrier_state = SMP_BARRIER_STATE_INITIALIZER;
uint32_t self = rtems_get_current_processor();
if (
source == RTEMS_FATAL_SOURCE_APPLICATION
|| source == RTEMS_FATAL_SOURCE_SMP
) {
uint32_t self = rtems_get_current_processor();
assert(!is_internal);
assert(!is_internal);
if ( source == RTEMS_FATAL_SOURCE_APPLICATION ) {
uint32_t cpu;
if (self == main_cpu) {
uint32_t cpu;
assert(self == main_cpu);
assert(code == 0xdeadbeef);
assert(source == RTEMS_FATAL_SOURCE_APPLICATION);
assert(code == 0xdeadbeef);
_SMP_Request_shutdown();
for (cpu = 0; cpu < MAX_CPUS; ++cpu) {
const Per_CPU_Control *per_cpu = _Per_CPU_Get_by_index( cpu );
Per_CPU_State state = per_cpu->state;
for (cpu = 0; cpu < MAX_CPUS; ++cpu) {
const Per_CPU_Control *per_cpu = _Per_CPU_Get_by_index( cpu );
Per_CPU_State state = per_cpu->state;
assert(state == PER_CPU_STATE_SHUTDOWN);
}
TEST_END();
} else {
assert(source == RTEMS_FATAL_SOURCE_SMP);
assert(code == SMP_FATAL_SHUTDOWN);
assert(state == PER_CPU_STATE_SHUTDOWN);
}
TEST_END();
} else if ( source == RTEMS_FATAL_SOURCE_SMP ) {
assert(self != main_cpu);
assert(code == SMP_FATAL_SHUTDOWN);
}
_SMP_barrier_Wait(&barrier, &barrier_state, rtems_get_processor_count());