The LEON3_Boot_Cpu global object is only used by start.S. Move the definition of this object to start.S and use a local symbol .Lbootcpuindex for it.
Use a compare-and-swap instruction to assign the boot CPU. This allows a concurrent initialization. Close #4845. --- bsps/sparc/leon3/start/bspstart.c | 5 ----- bsps/sparc/shared/start/start.S | 35 +++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/bsps/sparc/leon3/start/bspstart.c b/bsps/sparc/leon3/start/bspstart.c index d93d73aca8..61f888247f 100644 --- a/bsps/sparc/leon3/start/bspstart.c +++ b/bsps/sparc/leon3/start/bspstart.c @@ -59,11 +59,6 @@ int CPU_SPARC_HAS_SNOOPING; /* Index of CPU, in an AMP system CPU-index may be non-zero */ uint32_t LEON3_Cpu_Index = 0; -#if defined(RTEMS_SMP) -/* Index of the boot CPU. Set by the first CPU at boot to its CPU ID. */ -int LEON3_Boot_Cpu = -1; -#endif - /* * set_snooping * diff --git a/bsps/sparc/shared/start/start.S b/bsps/sparc/shared/start/start.S index a67c6bc163..01f1353758 100644 --- a/bsps/sparc/shared/start/start.S +++ b/bsps/sparc/shared/start/start.S @@ -493,17 +493,13 @@ SYM(hard_reset): mov %sp, %fp ! set frame pointer #if defined(START_LEON3_ENABLE_SMP) - /* If LEON3_Boot_Cpu < 0 then assign us as boot CPU and continue. */ - set SYM(LEON3_Boot_Cpu), %l0 - ld [%l0], %l1 - tst %l1 - bneg .Lbootcpu - nop - - call SYM(bsp_start_on_secondary_processor) ! does not return - mov %g6, %o0 -.Lbootcpu: - st %l7, [%l0] + /* If .Lbootcpuindex < 0 then assign us as boot CPU and continue. */ + set SYM(.Lbootcpuindex), %l0 + mov -1, %l1 + casa [ %l0 ] (10), %l1, %l7 + cmp %l1, %l7 + bne .Lbootsecondarycpu + nop #endif /* clear the bss */ @@ -527,4 +523,21 @@ SYM(hard_reset): call SYM(boot_card) ! does not return mov %g0, %o0 ! command line +#if defined(START_LEON3_ENABLE_SMP) +.Lbootsecondarycpu: + call SYM(bsp_start_on_secondary_processor) ! does not return + mov %g6, %o0 + + /* + * This is the index of the boot CPU. Set by the first CPU at boot to + * its CPU index. + */ + .section .data, "aw" + .align 4 + .type .Lbootcpuindex, #object + .size .Lbootcpuindex, 4 +.Lbootcpuindex: + .long -1 +#endif + /* end of file */ -- 2.35.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel