[U-Boot] [PATCH] riscv: increase stack size to avoid a stack overflow during distro boot

Rick Chen rickchen36 at gmail.com
Fri Oct 25 01:10:54 UTC 2019


> > From: Lukas Auer [mailto:lukas.auer at aisec.fraunhofer.de]
> > Sent: Monday, October 21, 2019 2:54 AM
> > To: u-boot at lists.denx.de
> > Cc: Alistair Francis; Anup Patel; Bin Meng; Atish Patra; Lukas Auer; Aurelien
> > Jarno; David Abdurachmanov; Rick Jian-Zhi Chen(陳建志)
> > Subject: [PATCH] riscv: increase stack size to avoid a stack overflow during
> > distro boot
> >
> > This fixes a problem, where booting Linux using distro boot will sometimes
> > lead to an invalid instruction exception on the main hart. The secondary harts
> > are not affected and boot Linux successfully. The root cause of this problem is
> > a stack overflow on the main hart.
> >
> > With distro boot, the current default stack size of 8KiB on RISC-V is not
> > sufficient and will cause a stack overflow. The stacks are allocated sequentially.
> > In the case of a stack overflow the stack of the main hart can reach into that of
> > another hart and be corrupted.
> >
> > The stack overflow previously did not cause any problems, because only stack
> > frames, which are not used anymore since the hart enters Linux, were
> > corrupted. Starting with GCC 9, the stack usage has decreased. Now, only the
> > most recent stack frame overflows into the stack of a secondary hart and is
> > corrupted. The illegal instruction exception is caused by the secondary hart
> > overwriting the return address in the stack frame of the main hart with an
> > address that does not include valid code.
> >
> > Increase the default stack size of each hart to 16KiB to avoid this problem.
> >
> > Reported-by: Aurelien Jarno <aurelien at aurel32.net>
> > Signed-off-by: Lukas Auer <lukas.auer at aisec.fraunhofer.de>
> > Tested-by: David Abdurachmanov <david.abdurachmanov at sifive.com>
> > Tested-by: Aurelien Jarno <aurelien at aurel32.net>
> > ---
> >
> >  arch/riscv/Kconfig | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index
> > 01975d7c60..85e15ebffa 100644
> > --- a/arch/riscv/Kconfig
> > +++ b/arch/riscv/Kconfig
> > @@ -224,7 +224,7 @@ config XIP
> >
> >  config STACK_SIZE_SHIFT
> >       int
> > -     default 13
> > +     default 14
> >
> >  config SPL_LDSCRIPT
> >       default "arch/riscv/cpu/u-boot-spl.lds"
> > --
> > 2.21.0
>

Reviewed-by: Rick Chen <rick at andestech.com>


More information about the U-Boot mailing list