Re: [PATCH v4 01/26] x86/boot: Align vmlinuz sections on page size

From: Ard Biesheuvel
Date: Sat Mar 11 2023 - 09:42:51 EST


On Sat, 11 Mar 2023 at 15:30, Evgeniy Baskov <baskov@xxxxxxxxx> wrote:
>
> On 2023-03-10 17:43, Ard Biesheuvel wrote:
> > On Thu, 15 Dec 2022 at 13:38, Evgeniy Baskov <baskov@xxxxxxxxx> wrote:
> >>
> >> To protect sections on page table level each section
> >> needs to be aligned on page size (4KB).
> >>
> >> Set sections alignment in linker script.
> >>
> >> Tested-by: Mario Limonciello <mario.limonciello@xxxxxxx>
> >> Tested-by: Peter Jones <pjones@xxxxxxxxxx>
> >> Signed-off-by: Evgeniy Baskov <baskov@xxxxxxxxx>
> >> ---
> >> arch/x86/boot/compressed/vmlinux.lds.S | 6 ++++++
> >> 1 file changed, 6 insertions(+)
> >>
> >> diff --git a/arch/x86/boot/compressed/vmlinux.lds.S
> >> b/arch/x86/boot/compressed/vmlinux.lds.S
> >> index 112b2375d021..6be90f1a1198 100644
> >> --- a/arch/x86/boot/compressed/vmlinux.lds.S
> >> +++ b/arch/x86/boot/compressed/vmlinux.lds.S
> >> @@ -27,21 +27,27 @@ SECTIONS
> >> HEAD_TEXT
> >> _ehead = . ;
> >> }
> >> + . = ALIGN(PAGE_SIZE);
> >> .rodata..compressed : {
> >> + _compressed = .;
> >> *(.rodata..compressed)
> >
> > Can you just move this bit into the rodata section below?
>
> I don't think that easily possible, as the layout need
> to stay compatible with in-place extraction for non-UEFI boot.
> For that execution path the code in .head.text moves everything
> behind it to the end of the extraction buffer and extraction
> code overwrites compressed kernel blob progressively during
> extraction. And that is why we have effectively have two code
> sections...
>

A right - thanks for explaining that to me.

So in the end, I think it doesn't matter in any case if we just stick
to a single .text section with R-X attributes and a single .data
section with RW- attributes.


> >
> >> + _ecompressed = .;
> >> }
> >> + . = ALIGN(PAGE_SIZE);
> >> .text : {
> >
> > Please use
> >
> > .text : ALIGN(PAGE_SIZE) {
> >
> > which marks the section as being page aligned, rather than just being
> > placed on a 4k boundary.
>
> Will fix in v5.
>
> >
> >> _text = .; /* Text */
> >> *(.text)
> >> *(.text.*)
> >> _etext = . ;
> >> }
> >> + . = ALIGN(PAGE_SIZE);
> >> .rodata : {
> >> _rodata = . ;
> >> *(.rodata) /* read-only data */
> >> *(.rodata.*)
> >> _erodata = . ;
> >> }
> >> + . = ALIGN(PAGE_SIZE);
> >> .data : {
> >> _data = . ;
> >> *(.data)
> >> --
> >> 2.37.4
> >>