mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-06-09 23:36:03 +09:00
riscv: support SPL stack and global data relocation
To support relocation of the stack and global data on RISC-V, the secondary harts must be notified of the change using IPIs. We can reuse the hart relocation code for this purpose. It uses global data to store the new stack pointer and global data pointer for the secondary harts. This means that we cannot update the global data pointer of the main hart in spl_relocate_stack_gd(), because the secondary harts have not yet been relocated at this point. It is updated after the secondary harts have been notified. Signed-off-by: Lukas Auer <lukas.auer@aisec.fraunhofer.de> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
This commit is contained in:
parent
8c59f2023c
commit
c7e1effb96
|
@ -169,13 +169,46 @@ wait_for_gd_init:
|
|||
spl_clear_bss:
|
||||
la t0, __bss_start
|
||||
la t1, __bss_end
|
||||
beq t0, t1, spl_call_board_init_r
|
||||
beq t0, t1, spl_stack_gd_setup
|
||||
|
||||
spl_clear_bss_loop:
|
||||
SREG zero, 0(t0)
|
||||
addi t0, t0, REGBYTES
|
||||
bne t0, t1, spl_clear_bss_loop
|
||||
|
||||
spl_stack_gd_setup:
|
||||
jal spl_relocate_stack_gd
|
||||
|
||||
/* skip setup if we did not relocate */
|
||||
beqz a0, spl_call_board_init_r
|
||||
mv s0, a0
|
||||
|
||||
/* setup stack on main hart */
|
||||
#ifdef CONFIG_SMP
|
||||
/* tp: hart id */
|
||||
slli t0, tp, CONFIG_STACK_SIZE_SHIFT
|
||||
sub sp, s0, t0
|
||||
#else
|
||||
mv sp, s0
|
||||
#endif
|
||||
|
||||
/* set new stack and global data pointer on secondary harts */
|
||||
spl_secondary_hart_stack_gd_setup:
|
||||
la a0, secondary_hart_relocate
|
||||
mv a1, s0
|
||||
mv a2, s0
|
||||
jal smp_call_function
|
||||
|
||||
/* hang if relocation of secondary harts has failed */
|
||||
beqz a0, 1f
|
||||
mv a1, a0
|
||||
la a0, secondary_harts_relocation_error
|
||||
jal printf
|
||||
jal hang
|
||||
|
||||
/* set new global data pointer on main hart */
|
||||
1: mv gp, s0
|
||||
|
||||
spl_call_board_init_r:
|
||||
mv a0, zero
|
||||
mv a1, zero
|
||||
|
|
|
@ -781,7 +781,7 @@ ulong spl_relocate_stack_gd(void)
|
|||
#if CONFIG_IS_ENABLED(DM)
|
||||
dm_fixup_for_gd_move(new_gd);
|
||||
#endif
|
||||
#if !defined(CONFIG_ARM)
|
||||
#if !defined(CONFIG_ARM) && !defined(CONFIG_RISCV)
|
||||
gd = new_gd;
|
||||
#endif
|
||||
return ptr;
|
||||
|
|
Loading…
Reference in New Issue
Block a user