On Mon, 13 Apr 2020 at 17:55, Ard Biesheuvel <ardb@xxxxxxxxxx> wrote: > > The arm64 kernel's segment alignment is fixed at 64 KB for any page > size, and relocatable kernels are able to fix up any misalignment of > the kernel image with respect to the 2 MB section alignment that is > mandated by the arm64 boot protocol. > > Let's increase the PE/COFF section alignment to the same value, so that > kernels loaded by the UEFI PE/COFF loader are guaranteed to end up at > an address that doesn't require any reallocation to be done if the > kernel is relocatable. > > Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx> > --- > arch/arm64/kernel/efi-header.S | 2 +- > arch/arm64/kernel/vmlinux.lds.S | 3 ++- > 2 files changed, 3 insertions(+), 2 deletions(-) > Catalin, Will: any thoughts whether this should go via the arm64 tree or the EFI tree? It is part of a change on the EFI side to stop needlessly copying the kernel around before boot, but this particular change could go through either tree, as it is not build time dependency for the EFI changes, nor does it have a boot time impact beyond making it more likely that the copy can be elided (but the code still needs to deal with the possibility that it cannot be elided in any case) > diff --git a/arch/arm64/kernel/efi-header.S b/arch/arm64/kernel/efi-header.S > index 914999ccaf8a..6f58998ef647 100644 > --- a/arch/arm64/kernel/efi-header.S > +++ b/arch/arm64/kernel/efi-header.S > @@ -32,7 +32,7 @@ optional_header: > > extra_header_fields: > .quad 0 // ImageBase > - .long SZ_4K // SectionAlignment > + .long SEGMENT_ALIGN // SectionAlignment > .long PECOFF_FILE_ALIGNMENT // FileAlignment > .short 0 // MajorOperatingSystemVersion > .short 0 // MinorOperatingSystemVersion > diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S > index 497f9675071d..1d399db0644f 100644 > --- a/arch/arm64/kernel/vmlinux.lds.S > +++ b/arch/arm64/kernel/vmlinux.lds.S > @@ -175,7 +175,7 @@ SECTIONS > *(.altinstr_replacement) > } > > - . = ALIGN(PAGE_SIZE); > + . = ALIGN(SEGMENT_ALIGN); > __inittext_end = .; > __initdata_begin = .; > > @@ -246,6 +246,7 @@ SECTIONS > . += INIT_DIR_SIZE; > init_pg_end = .; > > + . = ALIGN(SEGMENT_ALIGN); > __pecoff_data_size = ABSOLUTE(. - __initdata_begin); > _end = .; > > -- > 2.17.1 >