bsp/leon3: Move SMP data to start.S

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.
This commit is contained in:
Sebastian Huber
2023-02-10 10:52:02 +01:00
parent 519e288a96
commit b993111594
2 changed files with 24 additions and 16 deletions

View File

@@ -59,11 +59,6 @@ int CPU_SPARC_HAS_SNOOPING;
/* Index of CPU, in an AMP system CPU-index may be non-zero */ /* Index of CPU, in an AMP system CPU-index may be non-zero */
uint32_t LEON3_Cpu_Index = 0; 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 * set_snooping
* *

View File

@@ -493,17 +493,13 @@ SYM(hard_reset):
mov %sp, %fp ! set frame pointer mov %sp, %fp ! set frame pointer
#if defined(START_LEON3_ENABLE_SMP) #if defined(START_LEON3_ENABLE_SMP)
/* If LEON3_Boot_Cpu < 0 then assign us as boot CPU and continue. */ /* If .Lbootcpuindex < 0 then assign us as boot CPU and continue. */
set SYM(LEON3_Boot_Cpu), %l0 set SYM(.Lbootcpuindex), %l0
ld [%l0], %l1 mov -1, %l1
tst %l1 casa [%l0] (10), %l1, %l7
bneg .Lbootcpu cmp %l1, %l7
nop bne .Lbootsecondarycpu
nop
call SYM(bsp_start_on_secondary_processor) ! does not return
mov %g6, %o0
.Lbootcpu:
st %l7, [%l0]
#endif #endif
/* clear the bss */ /* clear the bss */
@@ -527,4 +523,21 @@ SYM(hard_reset):
call SYM(boot_card) ! does not return call SYM(boot_card) ! does not return
mov %g0, %o0 ! command line 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 */ /* end of file */