Re: [PATCH v2 00/15] x86/boot: Rework PE header generation

From: Ard Biesheuvel
Date: Sat Sep 16 2023 - 15:25:40 EST


On Sat, 16 Sept 2023 at 11:11, Ingo Molnar <mingo@xxxxxxxxxx> wrote:
>
>
> * Ard Biesheuvel <ardb@xxxxxxxxxx> wrote:
>
> > > > So, the first 8 patches broke the x86-64-defconfig-ish Qemu bzImage bootup,
> > > > due to the 8th patch:
> > > >
> > > > 988b52b207a9fe74c3699bda8c2256714926b94b is the first bad commit
> > > > commit 988b52b207a9fe74c3699bda8c2256714926b94b
> > > > Author: Ard Biesheuvel <ardb@xxxxxxxxxx>
> > > > Date: Tue Sep 12 09:01:01 2023 +0000
> > > >
> > > > x86/boot: Define setup size in linker script
> > > >
> > > > I've removed it for now - but this side effect was not expected.
> > > >
> > >
> > > No, definitely not expected. I tested various combinations of i386 /
> > > x86_64 built with GCC / Clang doing EFI or BIOS boot.
> > >
> > > I'll rebase the remaining stuff onto -tip and see if I can reproduce this.
> >
> > This is actually quite bizarre. x86_64_defconfig has
> > CONFIG_EFI_MIXED=y and i tested that this change produces the exact
> > same bzImage binary in that case.
> >
> > Could you send me the .config and the QEMU command line perhaps?
>
> So the patch below is the delta between v2 and v3 - that is expected
> to fix the bzImage boot crash, right?
>

Yes.

ld.bfd does something unexpected [to me] here, and the resulting value
turns out not to be a multiple of 512 at all.

With this tweak, my claim that this patch does not affect the binary
bzImage at all actually holds for ld.bfd as well (provided that
CONFIG_EFI_MIXED=y and CONFIG_LOCAL_VERSION_AUTO is disabled)

So if this still does not work in your test, could you please disable
CONFIG_LOCAL_VERSION_AUTO and compare the md5sums of the two builds?

Thanks,


> --- tip.orig/arch/x86/boot/setup.ld
> +++ tip/arch/x86/boot/setup.ld
> @@ -41,7 +41,7 @@ SECTIONS
> LONG(0x5a5aaa55)
>
> /* Reserve some extra space for the reloc and compat sections */
> - setup_size = ABSOLUTE(ALIGN(. + 64, 512));
> + setup_size = ALIGN(ABSOLUTE(.) + 64, 512);
> setup_sects = ABSOLUTE(setup_size / 512);
> }
>
>