[PATCH 06/16] mips: start.S: avoid overwriting outside gd when clearing global data in stack
Daniel Schwierzeck
daniel.schwierzeck at gmail.com
Wed Jan 8 15:39:42 CET 2020
Am 08.01.20 um 04:01 schrieb Weijie Gao:
> 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(-)
>
Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
--
- Daniel
More information about the U-Boot
mailing list