[PATCH 2/3] bsps: bsp_start_on_secondary_processor()
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Jul 24 12:38:06 UTC 2018
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
--
2.13.7
More information about the devel
mailing list