Update #3433. --- bsps/riscv/riscv/start/start.S | 10 ++ c/src/lib/libbsp/riscv/riscv/Makefile.am | 3 + cpukit/score/cpu/riscv/include/rtems/score/cpu.h | 101 +++------------------ .../score/cpu/riscv/include/rtems/score/cpuimpl.h | 6 ++ 4 files changed, 33 insertions(+), 87 deletions(-)
diff --git a/bsps/riscv/riscv/start/start.S b/bsps/riscv/riscv/start/start.S index 1f6b3f96f5..2c560cea35 100644 --- a/bsps/riscv/riscv/start/start.S +++ b/bsps/riscv/riscv/start/start.S @@ -52,6 +52,11 @@ SYM(_start): la gp, __global_pointer$ .option pop +#ifdef RTEMS_SMP + csrr s0, mhartid + bnez s0, .Lloop_forever +#endif + la t0, ISR_Handler csrw mtvec, t0 @@ -70,6 +75,11 @@ SYM(_start): j boot_card +#ifdef RTEMS_SMP +.Lloop_forever: + j .Lloop_forever +#endif + .align 4 bsp_start_vector_table_begin: .word _RISCV_Exception_default /* User int */ diff --git a/c/src/lib/libbsp/riscv/riscv/Makefile.am b/c/src/lib/libbsp/riscv/riscv/Makefile.am index 3d819f758b..0830b4f639 100644 --- a/c/src/lib/libbsp/riscv/riscv/Makefile.am +++ b/c/src/lib/libbsp/riscv/riscv/Makefile.am @@ -61,6 +61,9 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/cache/nocache.c # debugio librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/console/console-io.c +if HAS_SMP +librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/start/bspsmp-dummy.c +endif include $(top_srcdir)/../../../../automake/local.am include $(srcdir)/../../../../../../bsps/shared/irq-sources.am diff --git a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h index 83686267fb..290d6e74ad 100644 --- a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h +++ b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h @@ -480,102 +480,35 @@ static inline CPU_Counter_ticks _CPU_Counter_difference( } #ifdef RTEMS_SMP -/** - * @brief Performs CPU specific SMP initialization in the context of the boot - * processor. - * - * This function is invoked on the boot processor during system - * initialization. All interrupt stacks are allocated at this point in case - * the CPU port allocates the interrupt stacks. This function is called - * before _CPU_SMP_Start_processor() or _CPU_SMP_Finalize_initialization() is - * used. - * - * @return The count of physically or virtually available processors. - * Depending on the configuration the application may use not all processors. - */ uint32_t _CPU_SMP_Initialize( void ); -/** - * @brief Starts a processor specified by its index. - * - * This function is invoked on the boot processor during system - * initialization. - * - * This function will be called after _CPU_SMP_Initialize(). - * - * @param[in] cpu_index The processor index. - * - * @retval true Successful operation. - * @retval false Unable to start this processor. - */ bool _CPU_SMP_Start_processor( uint32_t cpu_index ); -/** - * @brief Performs final steps of CPU specific SMP initialization in the - * context of the boot processor. - * - * This function is invoked on the boot processor during system - * initialization. - * - * This function will be called after all processors requested by the - * application have been started. - * - * @param[in] cpu_count The minimum value of the count of processors - * requested by the application configuration and the count of physically or - * virtually available processors. - */ void _CPU_SMP_Finalize_initialization( uint32_t cpu_count ); -/** - * @brief Returns the index of the current processor. - * - * An architecture specific method must be used to obtain the index of the - * current processor in the system. The set of processor indices is the - * range of integers starting with zero up to the processor count minus one. - */ -uint32_t _CPU_SMP_Get_current_processor( void ); +void _CPU_SMP_Prepare_start_multitasking( void ); + +static inline uint32_t _CPU_SMP_Get_current_processor( void ) +{ + long mhartid; + + __asm__ volatile ( "csrr %0, mhartid" : "=&r" ( mhartid ) ); + + return mhartid; +} -/** - * @brief Sends an inter-processor interrupt to the specified target - * processor. - * - * This operation is undefined for target processor indices out of range. - * - * @param[in] target_processor_index The target processor index. - */ void _CPU_SMP_Send_interrupt( uint32_t target_processor_index ); -/** - * @brief Broadcasts a processor event. - * - * Some architectures provide a low-level synchronization primitive for - * processors in a multi-processor environment. Processors waiting for this - * event may go into a low-power state and stop generating system bus - * transactions. This function must ensure that preceding store operations - * can be observed by other processors. - * - * @see _CPU_SMP_Processor_event_receive(). - */ -void _CPU_SMP_Processor_event_broadcast( void ); +static inline void _CPU_SMP_Processor_event_broadcast( void ) +{ + __asm__ volatile ( "" : : : "memory" ); +} -/** - * @brief Receives a processor event. - * - * This function will wait for the processor event and may wait forever if no - * such event arrives. - * - * @see _CPU_SMP_Processor_event_broadcast(). - */ static inline void _CPU_SMP_Processor_event_receive( void ) { __asm__ volatile ( "" : : : "memory" ); } -/** - * @brief Gets the is executing indicator of the thread context. - * - * @param[in] context The context. - */ static inline bool _CPU_Context_Get_is_executing( const Context_Control *context ) @@ -583,12 +516,6 @@ static inline bool _CPU_Context_Get_is_executing( return context->is_executing; } -/** - * @brief Sets the is executing indicator of the thread context. - * - * @param[in] context The context. - * @param[in] is_executing The new value for the is executing indicator. - */ static inline void _CPU_Context_Set_is_executing( Context_Control *context, bool is_executing diff --git a/cpukit/score/cpu/riscv/include/rtems/score/cpuimpl.h b/cpukit/score/cpu/riscv/include/rtems/score/cpuimpl.h index 3904c84bf9..3096f5258b 100644 --- a/cpukit/score/cpu/riscv/include/rtems/score/cpuimpl.h +++ b/cpukit/score/cpu/riscv/include/rtems/score/cpuimpl.h @@ -36,6 +36,12 @@ #define CPU_PER_CPU_CONTROL_SIZE 0 +#if __riscv_xlen == 64 +#define CPU_INTERRUPT_FRAME_SIZE 288 +#else +#define CPU_INTERRUPT_FRAME_SIZE 144 +#endif + #ifndef ASM #ifdef __cplusplus -- 2.13.7 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel