forked from Imagelibrary/rtems
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:
@@ -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
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user