[U-Boot] [PATCH v2 07/11] riscv: support SPL stack and global data relocation
Anup Patel
anup at brainfault.org
Mon Jul 29 08:36:33 UTC 2019
On Sun, Jul 28, 2019 at 9:27 PM Lukas Auer
<lukas.auer at 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 at aisec.fraunhofer.de>
> Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> Tested-by: Bin Meng <bmeng.cn at 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 at wdc.com>
Regards,
Anup
More information about the U-Boot
mailing list