Looks ok. On Fri, Feb 10, 2023 at 3:57 AM Sebastian Huber < sebastian.hu...@embedded-brains.de> wrote:
> 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 >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel