Skip to content

Commit 093ab25

Browse files
ardbiesheuvelIngo Molnar
authored and
Ingo Molnar
committed
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 <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent eac9563 commit 093ab25

File tree

3 files changed

+5
-7
lines changed

3 files changed

+5
-7
lines changed

arch/x86/boot/header.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ sentinel: .byte 0xff, 0xff /* Used to detect broken loaders */
231231

232232
.globl hdr
233233
hdr:
234-
setup_sects: .byte 0 /* Filled in by build.c */
234+
.byte setup_sects - 1
235235
root_flags: .word ROOT_RDONLY
236236
syssize: .long 0 /* Filled in by build.c */
237237
ram_size: .word 0 /* Obsolete */

arch/x86/boot/setup.ld

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ SECTIONS
3939
.signature : {
4040
setup_sig = .;
4141
LONG(0x5a5aaa55)
42+
43+
/* Reserve some extra space for the reloc and compat sections */
44+
setup_size = ALIGN(ABSOLUTE(.) + 64, 512);
45+
setup_sects = ABSOLUTE(setup_size / 512);
4246
}
4347

4448

arch/x86/boot/tools/build.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,7 @@ typedef unsigned int u32;
4848
u8 buf[SETUP_SECT_MAX*512];
4949

5050
#define PECOFF_RELOC_RESERVE 0x20
51-
52-
#ifdef CONFIG_EFI_MIXED
5351
#define PECOFF_COMPAT_RESERVE 0x20
54-
#else
55-
#define PECOFF_COMPAT_RESERVE 0x0
56-
#endif
5752

5853
static unsigned long efi_pe_entry;
5954
static unsigned long efi32_pe_entry;
@@ -388,7 +383,6 @@ int main(int argc, char ** argv)
388383
#endif
389384

390385
/* Patch the setup code with the appropriate size parameters */
391-
buf[0x1f1] = setup_sectors-1;
392386
put_unaligned_le32(sys_size, &buf[0x1f4]);
393387

394388
update_pecoff_text(setup_sectors * 512, i + (sys_size * 16));

0 commit comments

Comments
 (0)