mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-20 17:51:31 +08:00
score: Postpone SMP shutdown in _Terminate()
This enables fatal extensions to continue program execution after some fatal errors.
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user