From 4678d1a8b0e74a12809122ef071324c99e78d7ff Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 24 Jul 2018 10:50:39 +0200 Subject: bsps: bsp_start_on_secondary_processor() Pass current processor control as first parameter in bsp_start_on_secondary_processor() and qoriq_start_thread() to make dependency more explicit. --- bsps/include/bsp/bootcard.h | 4 +++- bsps/powerpc/qoriq/include/bsp.h | 4 +++- bsps/powerpc/qoriq/start/bspsmp.c | 10 ++++------ bsps/powerpc/qoriq/start/start.S | 8 +++++--- bsps/sparc/leon3/start/bspsmp.c | 5 +++-- bsps/sparc/shared/start/start.S | 1 + testsuites/smptests/smpfatal08/init.c | 6 ++++-- 7 files changed, 23 insertions(+), 15 deletions(-) diff --git a/bsps/include/bsp/bootcard.h b/bsps/include/bsp/bootcard.h index 4dc3f4c2b0..f78000587a 100644 --- a/bsps/include/bsp/bootcard.h +++ b/bsps/include/bsp/bootcard.h @@ -167,6 +167,8 @@ static inline void bsp_work_area_initialize_with_table( void bsp_work_area_initialize(void); +struct Per_CPU_Control; + /** * @brief Standard start routine for secondary processors. * @@ -175,7 +177,7 @@ void bsp_work_area_initialize(void); * of this function is a call to * _SMP_Start_multitasking_on_secondary_processor(). */ -void bsp_start_on_secondary_processor(void); +void bsp_start_on_secondary_processor(struct Per_CPU_Control *cpu_self); /** @} */ diff --git a/bsps/powerpc/qoriq/include/bsp.h b/bsps/powerpc/qoriq/include/bsp.h index d7e9e95b3f..1c292f6767 100644 --- a/bsps/powerpc/qoriq/include/bsp.h +++ b/bsps/powerpc/qoriq/include/bsp.h @@ -105,7 +105,9 @@ typedef struct { extern qoriq_start_spin_table * qoriq_start_spin_table_addr[QORIQ_CPU_COUNT / QORIQ_THREAD_COUNT]; -void qoriq_start_thread(void); +struct Per_CPU_Control; + +void qoriq_start_thread(struct Per_CPU_Control *); void qoriq_restart_secondary_processor( const qoriq_start_spin_table *spin_table diff --git a/bsps/powerpc/qoriq/start/bspsmp.c b/bsps/powerpc/qoriq/start/bspsmp.c index 048275b1fc..2b95f943dd 100644 --- a/bsps/powerpc/qoriq/start/bspsmp.c +++ b/bsps/powerpc/qoriq/start/bspsmp.c @@ -44,10 +44,8 @@ static bool is_started_by_u_boot(uint32_t cpu_index) return cpu_index % QORIQ_THREAD_COUNT == 0; } -void qoriq_start_thread(void) +void qoriq_start_thread(Per_CPU_Control *cpu_self) { - const Per_CPU_Control *cpu_self = _Per_CPU_Get(); - ppc_exc_initialize_interrupt_stack( (uintptr_t) cpu_self->interrupt_stack_low, rtems_configuration_get_interrupt_stack_size() @@ -85,14 +83,14 @@ static void start_thread_if_necessary(uint32_t cpu_index_self) #endif } -void bsp_start_on_secondary_processor(void) +void bsp_start_on_secondary_processor(Per_CPU_Control *cpu_self) { - uint32_t cpu_index_self = _SMP_Get_current_processor(); - const Per_CPU_Control *cpu_self = _Per_CPU_Get_by_index(cpu_index_self); + uint32_t cpu_index_self; qoriq_initialize_exceptions(cpu_self->interrupt_stack_low); bsp_interrupt_facility_initialize(); + cpu_index_self = _Per_CPU_Get_index(cpu_self); start_thread_if_necessary(cpu_index_self); _SMP_Start_multitasking_on_secondary_processor(); diff --git a/bsps/powerpc/qoriq/start/start.S b/bsps/powerpc/qoriq/start/start.S index 96e00bf38b..57342971b6 100644 --- a/bsps/powerpc/qoriq/start/start.S +++ b/bsps/powerpc/qoriq/start/start.S @@ -38,6 +38,7 @@ #define START_STACK r15 #define SAVED_LINK_REGISTER r16 #define FDT_REGISTER r17 +#define CPU_SELF r18 .globl _start #ifdef RTEMS_SMP @@ -195,7 +196,7 @@ _start: LA r13, _SDA_BASE_ #endif - SET_SELF_CPU_CONTROL r4, r5 + SET_SELF_CPU_CONTROL CPU_SELF, r5 blr @@ -316,8 +317,7 @@ _start_thread: bl .Linitearly /* Initialize start stack */ - GET_SELF_CPU_CONTROL r3 - PPC_REG_LOAD r3, PER_CPU_INTERRUPT_STACK_HIGH(r3) + PPC_REG_LOAD r3, PER_CPU_INTERRUPT_STACK_HIGH(CPU_SELF) subi r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE clrrwi r1, r1, PPC_STACK_ALIGN_POWER li r0, 0 @@ -327,6 +327,7 @@ _start_thread: bl .Linitfpu #endif + mr r3, CPU_SELF b qoriq_start_thread PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE #endif @@ -339,6 +340,7 @@ _start_secondary_processor: bl .Linitmore li r3, 0 bl .Linitmmu + mr r3, CPU_SELF b bsp_start_on_secondary_processor PPC64_NOP_FOR_LINKER_TOC_POINTER_RESTORE #endif /* RTEMS_SMP */ diff --git a/bsps/sparc/leon3/start/bspsmp.c b/bsps/sparc/leon3/start/bspsmp.c index 1ef6e8eb3b..5b939fc765 100644 --- a/bsps/sparc/leon3/start/bspsmp.c +++ b/bsps/sparc/leon3/start/bspsmp.c @@ -35,9 +35,9 @@ static rtems_isr bsp_inter_processor_interrupt( _SMP_Inter_processor_interrupt_handler(_Per_CPU_Get()); } -void bsp_start_on_secondary_processor() +void bsp_start_on_secondary_processor(Per_CPU_Control *cpu_self) { - uint32_t cpu_index_self = _CPU_SMP_Get_current_processor(); + uint32_t cpu_index_self; /* * If data cache snooping is not enabled we terminate using BSP_fatal_exit() @@ -49,6 +49,7 @@ void bsp_start_on_secondary_processor() BSP_fatal_exit( LEON3_FATAL_INVALID_CACHE_CONFIG_SECONDARY_PROCESSOR ); /* Unmask IPI interrupts at Interrupt controller for this CPU */ + cpu_index_self = _Per_CPU_Get_index(cpu_self); LEON3_IrqCtrl_Regs->mask[cpu_index_self] |= 1U << LEON3_mp_irq; _SMP_Start_multitasking_on_secondary_processor(); diff --git a/bsps/sparc/shared/start/start.S b/bsps/sparc/shared/start/start.S index 5bd2937a13..222c5bb164 100644 --- a/bsps/sparc/shared/start/start.S +++ b/bsps/sparc/shared/start/start.S @@ -310,6 +310,7 @@ SYM(hard_reset): andn %sp, 0x0f, %sp ! align stack on 16-byte boundary mov %sp, %fp ! set frame pointer + mv %o0, %g6 call SYM(bsp_start_on_secondary_processor) ! does not return sub %sp, SPARC_MINIMUM_STACK_FRAME_SIZE, %sp .Lbootcpu: diff --git a/testsuites/smptests/smpfatal08/init.c b/testsuites/smptests/smpfatal08/init.c index abe0132aa8..209b79c60c 100644 --- a/testsuites/smptests/smpfatal08/init.c +++ b/testsuites/smptests/smpfatal08/init.c @@ -34,15 +34,17 @@ const char rtems_test_name[] = "SMPFATAL 8"; * without BSP support. */ -void bsp_start_on_secondary_processor(void) +void bsp_start_on_secondary_processor(struct Per_CPU_Control *cpu_self) { /* Provided to avoid multiple definitions of the CPU SMP support functions */ + (void) cpu_self; } #if QORIQ_THREAD_COUNT > 1 -void qoriq_start_thread(void) +void qoriq_start_thread(Per_CPU_Control *cpu_self) { /* Provided to avoid multiple definitions of the CPU SMP support functions */ + (void) cpu_self; } #endif -- cgit v1.2.3