[PATCH] ARM: decompressor: fix BSS size calculation for LLVM ld.lld
ardb at kernel.org
Fri Feb 5 13:11:30 EST 2021
On Fri, 5 Feb 2021 at 19:00, Nick Desaulniers <ndesaulniers at google.com> wrote:
> On Fri, Feb 5, 2021 at 12:52 AM Ard Biesheuvel <ardb at kernel.org> wrote:
> > The LLVM ld.lld linker uses a different symbol type for __bss_start,
> > resulting in the calculation of KBSS_SZ to be thrown off. Up until now,
> > this has gone unnoticed as it only affects the appended DTB case, but
> > pending changes for ARM in the way the decompressed kernel is cleaned
> > from the caches has uncovered this problem.
> > On a ld.lld build:
> > $ nm vmlinux |grep bss_
> > c1c22034 D __bss_start
> > c1c86e98 B __bss_stop
> > resulting in
> $ readelf -s arch/arm/boot/compressed/vmlinux | grep bss_size
> > 433: c1c86e98 0 NOTYPE GLOBAL DEFAULT ABS _kernel_bss_size
> > which is obviously incorrect, and may cause the cache clean to access
> > unmapped memory, or cause the size calculation to wrap, resulting in no
> > cache clean to be performed at all.
> > Fix this by updating the sed regex to take D type symbols into account.
> > Cc: Nick Desaulniers <ndesaulniers at google.com>
> > Cc: Nathan Chancellor <nathan at kernel.org>
> > Cc: Guillaume Tucker <guillaume.tucker at collabora.com>
> > Link: https://firstname.lastname@example.org/
> > Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
> Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
> Tested-by: Nick Desaulniers <ndesaulniers at google.com>
> Thanks for debugging+fixing this, and Guillaume for the report. It's
> nice to see a fix so early; thinking back to last year before KernelCI
> integration, we probably would have only noticed when CrOS went to
> upgrade their rk3288 platform devices.
> Some other tags that might be nice to apply:
> Cc: stable at kernel.org
> Fixes: 429f7a062e3b ("ARM: decompressor: fix BSS size calculation")
> Reported-by: Guillaume Tucker <guillaume.tucker at collabora.com>
> Reported-by: "kernelci.org bot" <bot at kernelci.org>
Thanks. I'll add these tags and drop this patch into the patch system
> Tests run:
> + Fangrui,
> Fangrui, __bss_start looks like it's linker script defined by the
> BSS_SECTION macro from include/asm-generic/vmlinux.lds.h:1160 being
> used in arch/arm/kernel/vmlinux.lds.S:149. Should these symbols be
> placed in .bss? Might save a few bytes in the image, unless there's an
> initial value that's encoded with them?
Not sure what you are asking here. These symbols just delineate .bss,
they don't take up any space themselves.
What seems to be happening is that the placement of __bss_start
outside of the .sbss/.bss section declarations causes it to be
annotated as residing in .data.
> > ---
> > arch/arm/boot/compressed/Makefile | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> > diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
> > index fb521efcc6c2..54307db7854d 100644
> > --- a/arch/arm/boot/compressed/Makefile
> > +++ b/arch/arm/boot/compressed/Makefile
> > @@ -115,8 +115,8 @@ asflags-y := -DZIMAGE
> > # Supply kernel BSS size to the decompressor via a linker symbol.
> > KBSS_SZ = $(shell echo $$(($$($(NM) $(obj)/../../../../vmlinux | \
> > - sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \
> > - -e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) )
> > + sed -n -e 's/^\([^ ]*\) [ABD] __bss_start$$/-0x\1/p' \
> > + -e 's/^\([^ ]*\) [ABD] __bss_stop$$/+0x\1/p') )) )
> I wasn't sure whether we still needed `A`, but
> commit 6cea14f55474 ("ARM: replace unnecessary perl with sed and the
> shell $(( )) operator")
> references that depending on the version of binutils you might observe
> that. There's no more info on which version or under what conditions.
> Lest we reintroduce this same problem for that version, it's fine to
> leave it.
> > LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
> > # Supply ZRELADDR to the decompressor via a linker symbol.
> > ifneq ($(CONFIG_AUTO_ZRELADDR),y)
> > --
> > 2.30.0
> ~Nick Desaulniers
More information about the linux-arm-kernel