diff mbox series

[U-Boot,v2,07/11] riscv: support SPL stack and global data relocation

Message ID 20190728155723.3412-8-lukas.auer@aisec.fraunhofer.de
State Superseded
Delegated to: Andes
Headers show
Series SPL support for RISC-V | expand

Commit Message

Lukas Auer July 28, 2019, 3:57 p.m. UTC
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(-)

Comments

Anup Patel July 29, 2019, 8:36 a.m. UTC | #1
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 mbox series

Patch

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;