x86/boot: Define setup size in linker script
The setup block contains the real mode startup code that is used when booting from a legacy BIOS, along with the boot_params/setup_data that is used by legacy x86 bootloaders to pass the command line and initial ramdisk parameters, among other things. The setup block also contains the PE/COFF header of the entire combined image, which includes the compressed kernel image, the decompressor and the EFI stub. This PE header describes the layout of the executable image in memory, and currently, the fact that the setup block precedes it makes it rather fiddly to get the right values into the right place in the final image. Let's make things a bit easier by defining the setup_size in the linker script so it can be referenced from the asm code directly, rather than having to rely on the build tool to calculate it. For the time being, add 64 bytes of fixed padding for the .reloc and .compat sections - this will be removed in a subsequent patch after the PE/COFF header has been reorganized. This change has no impact on the resulting bzImage binary when configured with CONFIG_EFI_MIXED=y. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20230915171623.655440-13-ardb@google.com
This commit is contained in:
parent
eac956345f
commit
093ab258e3
@ -231,7 +231,7 @@ sentinel: .byte 0xff, 0xff /* Used to detect broken loaders */
|
||||
|
||||
.globl hdr
|
||||
hdr:
|
||||
setup_sects: .byte 0 /* Filled in by build.c */
|
||||
.byte setup_sects - 1
|
||||
root_flags: .word ROOT_RDONLY
|
||||
syssize: .long 0 /* Filled in by build.c */
|
||||
ram_size: .word 0 /* Obsolete */
|
||||
|
@ -39,6 +39,10 @@ SECTIONS
|
||||
.signature : {
|
||||
setup_sig = .;
|
||||
LONG(0x5a5aaa55)
|
||||
|
||||
/* Reserve some extra space for the reloc and compat sections */
|
||||
setup_size = ALIGN(ABSOLUTE(.) + 64, 512);
|
||||
setup_sects = ABSOLUTE(setup_size / 512);
|
||||
}
|
||||
|
||||
|
||||
|
@ -48,12 +48,7 @@ typedef unsigned int u32;
|
||||
u8 buf[SETUP_SECT_MAX*512];
|
||||
|
||||
#define PECOFF_RELOC_RESERVE 0x20
|
||||
|
||||
#ifdef CONFIG_EFI_MIXED
|
||||
#define PECOFF_COMPAT_RESERVE 0x20
|
||||
#else
|
||||
#define PECOFF_COMPAT_RESERVE 0x0
|
||||
#endif
|
||||
|
||||
static unsigned long efi_pe_entry;
|
||||
static unsigned long efi32_pe_entry;
|
||||
@ -388,7 +383,6 @@ int main(int argc, char ** argv)
|
||||
#endif
|
||||
|
||||
/* Patch the setup code with the appropriate size parameters */
|
||||
buf[0x1f1] = setup_sectors-1;
|
||||
put_unaligned_le32(sys_size, &buf[0x1f4]);
|
||||
|
||||
update_pecoff_text(setup_sectors * 512, i + (sys_size * 16));
|
||||
|
Loading…
Reference in New Issue
Block a user