[PATCH 06/16] mips: start.S: avoid overwriting outside gd when clearing global data in stack

Stefan Roese sr at denx.de
Fri Jan 10 15:08:37 CET 2020


On 08.01.20 04:01, Weijie Gao wrote:
> When setting up initial stack, global data will also be put in the stack,
> and being cleared.
> 
> The assembler instructions for clearing gd is as follows:
> 
> 	move	t0, k0
> 1:
> 	PTR_S	zero, 0(t0)
> 	blt	t0, t1, 1b
> 	 PTR_ADDIU t0, PTRSIZE
> 
> t0 is the start address of gd, t1 is the end address of gd (t0 + GD_SIZE).
> 
> [PTR_ADDIU t0, PTRSIZE] is in the delay slot of [blt t0, t1, 1b], so it
> will be executed before the branch operation.
> 
> However the comparison for the BLT instruction is done before executing the
> delay slot. This means when the last word just before k1 is cleared, the
> loop will continue to run once. This will clear an extra word at k1, which
> is outside the global data.
> 
> Global data is placed at the top of the stack. If the initial stack is a
> SRAM or locked cache, the area outside them may be inaccessible. A write
> operation performed in this area may cause an exception.
> 
> To solve this, [PTR_ADDIU t0, PTRSIZE] should be placed before the BLT
> instruction.
> 
> Signed-off-by: Weijie Gao <weijie.gao at mediatek.com>
> ---
>   arch/mips/cpu/start.S | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/mips/cpu/start.S b/arch/mips/cpu/start.S
> index f9805fa000..dd93df9e4a 100644
> --- a/arch/mips/cpu/start.S
> +++ b/arch/mips/cpu/start.S
> @@ -71,8 +71,9 @@
>   	move	t0, k0
>   1:
>   	PTR_S	zero, 0(t0)
> +	PTR_ADDIU t0, PTRSIZE
>   	blt	t0, t1, 1b
> -	 PTR_ADDIU t0, PTRSIZE
> +	 nop


Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan


More information about the U-Boot mailing list