[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