On Sun, Jul 28, 2019 at 9:27 PM Lukas Auer <lukas.a...@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.a...@aisec.fraunhofer.de> > Reviewed-by: Bin Meng <bmeng...@gmail.com> > Tested-by: Bin Meng <bmeng...@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.pa...@wdc.com> Regards, Anup _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot