Message ID | 20190728155723.3412-8-lukas.auer@aisec.fraunhofer.de |
---|---|
State | Superseded |
Delegated to: | Andes |
Headers | show |
Series | SPL support for RISC-V | expand |
On Sun, Jul 28, 2019 at 9:27 PM Lukas Auer <lukas.auer@aisec.fraunhofer.de> wrote: > > 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> > --- > > Changes in v2: None > > arch/riscv/cpu/start.S | 35 ++++++++++++++++++++++++++++++++++- > common/spl/spl.c | 2 +- > 2 files changed, 35 insertions(+), 2 deletions(-) > > diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S > index e053197645..e8c65c887a 100644 > --- a/arch/riscv/cpu/start.S > +++ b/arch/riscv/cpu/start.S > @@ -170,13 +170,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 > diff --git a/common/spl/spl.c b/common/spl/spl.c > index 1ed4741bdc..834f39908b 100644 > --- a/common/spl/spl.c > +++ b/common/spl/spl.c > @@ -756,7 +756,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; > -- > 2.21.0 > Reviewed-by: Anup Patel <anup.patel@wdc.com> Regards, Anup
diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S index e053197645..e8c65c887a 100644 --- a/arch/riscv/cpu/start.S +++ b/arch/riscv/cpu/start.S @@ -170,13 +170,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 diff --git a/common/spl/spl.c b/common/spl/spl.c index 1ed4741bdc..834f39908b 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -756,7 +756,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;