[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