[PATCH v5 3/9] board_f: Correct stack reservation

Simon Glass sjg at chromium.org
Tue Dec 3 14:53:55 CET 2024


Hi Tom,

On Mon, 2 Dec 2024 at 14:59, Tom Rini <trini at konsulko.com> wrote:
>
> On Sun, Dec 01, 2024 at 08:28:05AM -0700, Simon Glass wrote:
>
> > The reserve_stack_aligned() function already ensures that the resulting
> > address is aligned to a 16-byte boundary. The comment seems to suggest
> > that 16 is passed reserve_stack_aligned() to make it aligned.
> >
> > Change the value to 0, since the stack can start at the current address,
> > if it is suitably aligned already.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
>
> Er:
> /*
>  * reserve after start_addr_sp the requested size and make the stack pointer
>  * 16-byte aligned, this alignment is needed for cast on the reserved memory
>  * ref = x86_64 ABI: https://reviews.llvm.org/D30049: 16 bytes
>  *     = ARMv8 Instruction Set Overview: quad word, 16 bytes
>  */
> static unsigned long reserve_stack_aligned(size_t size)
> {
>         return ALIGN_DOWN(gd->start_addr_sp - size, 16);
> }
>
> is what the code is today.
>
> > ---
> >
> > (no changes since v1)
> >
> >  common/board_f.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/common/board_f.c b/common/board_f.c
> > index 98dc2591e1d..677e37d93c0 100644
> > --- a/common/board_f.c
> > +++ b/common/board_f.c
> > @@ -601,7 +601,7 @@ __weak int arch_reserve_stacks(void)
> >  static int reserve_stacks(void)
> >  {
> >       /* make stack pointer 16-byte aligned */
> > -     gd->start_addr_sp = reserve_stack_aligned(16);
> > +     gd->start_addr_sp = reserve_stack_aligned(0);
> >
> >       /*
> >        * let the architecture-specific code tailor gd->start_addr_sp and
>
> And this is the last call to reserve_stack_aligned(). So, this is going
> to save us between 16 and 0 bytes of memory. If we're going to make a
> change here we need to comment in the code more what we're up to at this
> point, and the commit message should be more authoritatively worded too.

So, other than that, what do you think? Should I respin it? Note that
this is part of a series which I doubt will be applied to your tree.

It would be nice if other archs could weigh in, but I see that I have
not copied them. Still, the current code is confusing (in that the
comment doesn't match the code), so we can likely figure this out in
-next

Heinrich expressed some concerns with RISC-V, but there doesn't seem
to be any breakage in CI. meminfo reports that the devicetree is above
the stack and it semes intact:

$ qemu-system-riscv32 -nographic -machine virt -bios
/tmp/b/qemu-riscv32/u-boot.bin


U-Boot 2025.01-rc3-00068-g6f392929ea11-dirty (Dec 03 2024 - 06:51:44 -0700)

CPU:   riscv
Model: riscv-virtio,qemu
DRAM:  128 MiB
Core:  26 devices, 13 uclasses, devicetree: board
Flash: 32 MiB
Loading Environment from nowhere... OK
In:    serial,usbkbd
Out:   serial,vidconsole
Err:   serial,vidconsole
No USB controllers found
Net:   No ethernet found.

Hit any key to stop autoboot:  0
=> meminfo
DRAM:  128 MiB

Region           Base     Size      End      Gap
------------------------------------------------
video        87800000   800000 88000000
code         87740000    bf2d8 877ff2d8      d28
malloc       86f20000   820000 87740000        0
board_info   86f1ffc0       40 86f20000        0
global_data  86f1fe50      170 86f1ffc0        0
devicetree   86f1ef30      f02 86f1fe32       1e
stack        85ede000  1000000 86ede000    40f30
lmb          85ede000        0 85ede000        0
lmb          85edb000     3000 85ede000        0
free         80000000 85edb000  5edb000 80000000
=> md 86f1ef30
86f1ef30: edfe0dd0 020f0000 38000000 980d0000  ...........8....
86f1ef40: 28000000 11000000 10000000 00000000  ...(............
86f1ef50: 6a010000 600d0000 00000000 00000000  ...j...`........

Regards,
Simon


More information about the U-Boot mailing list