From 2f6108f93b3ee4dcc85b236593d4c57c7652bf1b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 28 May 2013 10:58:19 +0200 Subject: smp: Simplify SMP initialization sequence Delete bsp_smp_wait_for(). Other parts of the system work without timeout, e.g. the spinlocks. Using a timeout here does not make the system more robust. Delete bsp_smp_cpu_state and replace it with Per_CPU_State. The Per_CPU_State follows the Score naming conventions. Add _Per_CPU_Change_state() and _Per_CPU_Wait_for_state() functions to change and observe states. Use Per_CPU_State in Per_CPU_Control instead of the anonymous integer. Add _CPU_Processor_event_broadcast() and _CPU_Processor_event_receive() functions provided by the CPU port. Use these functions in _Per_CPU_Change_state() and _Per_CPU_Wait_for_state(). Add prototype for _SMP_Send_message(). Delete RTEMS_BSP_SMP_FIRST_TASK message. The first context switch is now performed in rtems_smp_secondary_cpu_initialize(). Issuing the first context switch in the context of the inter-processor interrupt is not possible on systems with a modern interrupt controller. Such an interrupt controler usually requires a handshake protocol with interrupt acknowledge and end of interrupt signals. A direct context switch in an interrupt handler circumvents the interrupt processing epilogue and may leave the system in an inconsistent state. Release lock in rtems_smp_process_interrupt() even if no message was delivered. This prevents deadlock of the system. Simplify and format _SMP_Send_message(), _SMP_Request_other_cores_to_perform_first_context_switch(), _SMP_Request_other_cores_to_dispatch() and _SMP_Request_other_cores_to_shutdown(). --- cpukit/score/cpu/i386/rtems/score/cpu.h | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'cpukit/score/cpu/i386/rtems/score/cpu.h') diff --git a/cpukit/score/cpu/i386/rtems/score/cpu.h b/cpukit/score/cpu/i386/rtems/score/cpu.h index 6a19fb128c..c262e3cf45 100644 --- a/cpukit/score/cpu/i386/rtems/score/cpu.h +++ b/cpukit/score/cpu/i386/rtems/score/cpu.h @@ -463,6 +463,16 @@ uint32_t _CPU_ISR_Get_level( void ); "1" (_value) : \ "cc"); \ } while (0) + + static inline void _CPU_Processor_event_broadcast( void ) + { + __asm__ volatile ( "" : : : "memory" ); + } + + static inline void _CPU_Processor_event_receive( void ) + { + __asm__ volatile ( "" : : : "memory" ); + } #endif #define _CPU_Context_Fp_start( _base, _offset ) \ -- cgit v1.2.3