[PATCH v3 2/3] riscv: Add SPL_ZERO_MEM_BEFORE_USE implementation

Shengyu Qu wiagn233 at outlook.com
Wed Aug 9 14:56:13 CEST 2023


Hi Leo,

Seems you are right. I'll send v4 to fix this. Thank you.

Best regards,

Shengyu

> Hi Shengyu,
>
> On Tue, Aug 08, 2023 at 08:39:56PM +0800, Shengyu Qu wrote:
>> Add the actual support code for SPL_ZERO_MEM_BEFORE_USE and remove
>> existing Starfive JH7110's L2 LIM clean code, since existing code has
>> following issues:
>>   1. Each hart (in the middle of a function call) overwriting its own
>>      stack and other harts' stacks.
>>      (data-race and data-corruption)
>>   2. Lottery winner hart can be doing "board_init_f_init_reserve",
>>      while other harts are in the middle of zeroing L2 LIM.
>>      (data-race)
>>
>> Signed-off-by: Bo Gan <ganboing at gmail.com>
>> Signed-off-by: Shengyu Qu <wiagn233 at outlook.com>
>> ---
>> Changes since v2:
>>   - Fix typo (ZERO_MEM_BEFORE_USE to SPL_ZERO_MEM_BEFORE_USE)
>> ---
>>   arch/riscv/cpu/jh7110/spl.c | 25 -------------------------
>>   arch/riscv/cpu/start.S      | 12 ++++++++++++
>>   common/init/board_init.c    |  3 +++
>>   3 files changed, 15 insertions(+), 25 deletions(-)
>>
>> diff --git a/arch/riscv/cpu/jh7110/spl.c b/arch/riscv/cpu/jh7110/spl.c
>> index 72adcefa0e..4047b10efe 100644
>> --- a/arch/riscv/cpu/jh7110/spl.c
>> +++ b/arch/riscv/cpu/jh7110/spl.c
>> @@ -13,7 +13,6 @@
>>   #include <init.h>
>>   
>>   #define CSR_U74_FEATURE_DISABLE	0x7c1
>> -#define L2_LIM_MEM_END	0x81FFFFFUL
>>   
>>   DECLARE_GLOBAL_DATA_PTR;
>>   
>> @@ -59,9 +58,6 @@ int spl_soc_init(void)
>>   
>>   void harts_early_init(void)
>>   {
>> -	ulong *ptr;
>> -	u8 *tmp;
>> -	ulong len, remain;
>>   	/*
>>   	 * Feature Disable CSR
>>   	 *
>> @@ -70,25 +66,4 @@ void harts_early_init(void)
>>   	 */
>>   	if (CONFIG_IS_ENABLED(RISCV_MMODE))
>>   		csr_write(CSR_U74_FEATURE_DISABLE, 0);
>> -
>> -	/* clear L2 LIM  memory
>> -	 * set __bss_end to 0x81FFFFF 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;
>> -	remain = len % sizeof(ulong);
>> -	len /= sizeof(ulong);
>> -
>> -	while (len--)
>> -		*ptr++ = 0;
>> -
>> -	/* clear the remain bytes */
>> -	if (remain) {
>> -		tmp = (u8 *)ptr;
>> -		while (remain--)
>> -			*tmp++ = 0;
>> -	}
>>   }
>> diff --git a/arch/riscv/cpu/start.S b/arch/riscv/cpu/start.S
>> index 59d58a5a57..930309d8d2 100644
>> --- a/arch/riscv/cpu/start.S
>> +++ b/arch/riscv/cpu/start.S
>> @@ -111,6 +111,18 @@ call_board_init_f:
>>    * It's essential before any function call, otherwise, we get data-race.
>>    */
>>   
>> +/* clear stack if necessary */
>> +#if CONFIG_IS_ENABLED(SPL_ZERO_MEM_BEFORE_USE)
> I think what you have in v2 patch was the correct one.
>
> Could you refer to include/linux/kconfig.h to check if
> this usage fits your expectation ?
>
>> +clear_stack:
>> +	li	t1, 1
>> +	slli	t1, t1, CONFIG_STACK_SIZE_SHIFT
>> +	sub	t1, sp, t1
>> +clear_stack_loop:
>> +	SREG	zero, 0(t1)		/* t1 is always 16 byte aligned */
>> +	addi	t1, t1, REGBYTES
>> +	blt	t1, sp, clear_stack_loop
>> +#endif
>> +
>>   call_board_init_f_0:
>>   	/* find top of reserve space */
>>   #if CONFIG_IS_ENABLED(SMP)
>> diff --git a/common/init/board_init.c b/common/init/board_init.c
>> index 96ffb79a98..51d9ec9a13 100644
>> --- a/common/init/board_init.c
>> +++ b/common/init/board_init.c
>> @@ -162,6 +162,9 @@ 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;
>> +#if CONFIG_IS_ENABLED(SPL_ZERO_MEM_BEFORE_USE)
> Ditto.
>
> Best regards,
> Leo
>> +	memset((void *)base, '\0', CONFIG_VAL(SYS_MALLOC_F_LEN));
>> +#endif
>>   #endif
>>   
>>   	if (CONFIG_IS_ENABLED(SYS_REPORT_STACK_F_USAGE))
>> -- 
>> 2.41.0
>>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0xE3520CC91929C8E7.asc
Type: application/pgp-keys
Size: 6868 bytes
Desc: OpenPGP public key
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20230809/1e0eafe5/attachment.key>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20230809/1e0eafe5/attachment.sig>


More information about the U-Boot mailing list