[PATCH v1 1/2] arch: riscv: jh7110: Split the zeroing of L2 LIM on JH7110
Bo Gan
ganboing at gmail.com
Sun May 21 08:43:14 CEST 2023
On 5/17/23 11:41 PM, Yanhong Wang wrote:
> The per-hart stack,malloc space and global variable 'gd' sits between
> __bss_end and L2_LIM_MEM_END.Zeroing this region could overwrite the
> hart's stack, and other harts' stacks.If it were to save and restore
> `ra` register, then we would crash in function epilogue. Also, we are
> having data-races here, because harts are writing over each other's
> stack.
>
> So we should split the zeroing of L2 LIM into different places just
> before the region is to be used. For stacks,let each hart clearing its
> own stack, and for the malloc space, we can do so during malloc
> initialization. The global variable 'gd' is initialized in the
> board_init_f_init_reserve function.
>
> Signed-off-by: Yanhong Wang <yanhong.wang at starfivetech.com>
> ---
Hi Yanhong, Thanks for taking care of this. Would you mind refer my
name if you want to directly copy-paste my previous response?
> arch/riscv/cpu/jh7110/spl.c | 6 +++---
> arch/riscv/cpu/start.S | 14 ++++++++++++++
> common/init/board_init.c | 1 +
> 3 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/arch/riscv/cpu/jh7110/spl.c b/arch/riscv/cpu/jh7110/spl.c
> index 104f0fe949..6a48fba63d 100644
> --- a/arch/riscv/cpu/jh7110/spl.c
> +++ b/arch/riscv/cpu/jh7110/spl.c
> @@ -10,7 +10,6 @@
> #include <log.h>
>
> #define CSR_U74_FEATURE_DISABLE 0x7c1
> -#define L2_LIM_MEM_END 0x81FFFFFUL
>
> int spl_soc_init(void)
> {
> @@ -42,13 +41,14 @@ void harts_early_init(void)
> csr_write(CSR_U74_FEATURE_DISABLE, 0);
>
> /* clear L2 LIM memory
> - * set __bss_end to 0x81FFFFF region to zero
> + * set __bss_end to stack end region to zero
> * The L2 Cache Controller supports ECC. ECC is applied to SRAM.
> * If it is not cleared, the ECC part is invalid, and an ECC error
> * will be reported when reading data.
> */
> ptr = (ulong *)&__bss_end;
> - len = L2_LIM_MEM_END - (ulong)&__bss_end;
> + len = CONFIG_SPL_STACK - CONFIG_VAL(SYS_MALLOC_F_LEN) - sizeof(*gd) -
> + CONFIG_NR_CPUS * BIT(CONFIG_STACK_SIZE_SHIFT) - (ulong)&__bss_end;
I don't understand what we are zeroing here. It seems that we are zeroing
the hole between __bss_end and gd? Any reason in doing so?
> remain = len % sizeof(ulong);
> len /= sizeof(ulong);
>
> diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S
> index dad22bfea8..46da9ec503 100644
> --- a/arch/riscv/cpu/start.S
> +++ b/arch/riscv/cpu/start.S
> @@ -118,6 +118,20 @@ call_board_init_f_0:
> mv sp, a0
> #endif
>
> +#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK) && \
> + defined(CONFIG_STARFIVE_JH7110)
> +
> + /* Set the stack region to zero */
> + li t0, 1
> + slli t1, t0, CONFIG_STACK_SIZE_SHIFT
> + mv t0, sp
> + sub t1, t0, t1
> +clear_stack:
> + SREG zero, 0(t1)
> + addi t1, t1, REGBYTES
> + blt t1, t0, clear_stack
> +#endif
> +
I think we should introduce another Kconfig option to indicate that stack should
be zeroed before use, so we don't need board specific check, such as
defined(CONFIG_STARFIVE_JH7110)
> /* Configure proprietary settings and customized CSRs of harts */
> call_harts_early_init:
> jal harts_early_init
> diff --git a/common/init/board_init.c b/common/init/board_init.c
> index 96ffb79a98..46e4e4abc7 100644
> --- a/common/init/board_init.c
> +++ b/common/init/board_init.c
> @@ -162,6 +162,7 @@ void board_init_f_init_reserve(ulong base)
> #if CONFIG_VAL(SYS_MALLOC_F_LEN)
> /* go down one 'early malloc arena' */
> gd->malloc_base = base;
> + memset((void *)base, 0, CONFIG_VAL(SYS_MALLOC_F_LEN));
> #endif
>
> if (CONFIG_IS_ENABLED(SYS_REPORT_STACK_F_USAGE))
>
Same as above.
More information about the U-Boot
mailing list