Skip to content

Commit

Permalink
x86/boot: Set EFI handover offset directly in header asm
Browse files Browse the repository at this point in the history
The offsets of the EFI handover entrypoints are available to the
assembler when constructing the header, so there is no need to set them
from the build tool afterwards.

This change has no impact on the resulting bzImage binary.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20230915171623.655440-12-ardb@google.com
  • Loading branch information
ardbiesheuvel authored and Ingo Molnar committed Sep 17, 2023
1 parent 2e765c0 commit eac9563
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 25 deletions.
18 changes: 17 additions & 1 deletion arch/x86/boot/header.S
Original file line number Diff line number Diff line change
Expand Up @@ -524,8 +524,24 @@ pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr
# define INIT_SIZE VO_INIT_SIZE
#endif

.macro __handover_offset
#ifndef CONFIG_EFI_HANDOVER_PROTOCOL
.long 0
#elif !defined(CONFIG_X86_64)
.long ZO_efi32_stub_entry
#else
/* Yes, this is really how we defined it :( */
.long ZO_efi64_stub_entry - 0x200
#ifdef CONFIG_EFI_MIXED
.if ZO_efi32_stub_entry != ZO_efi64_stub_entry - 0x200
.error "32-bit and 64-bit EFI entry points do not match"
.endif
#endif
#endif
.endm

init_size: .long INIT_SIZE # kernel initialization size
handover_offset: .long 0 # Filled in by build.c
handover_offset: __handover_offset
kernel_info_offset: .long ZO_kernel_info

# End of setup header #####################################################
Expand Down
24 changes: 0 additions & 24 deletions arch/x86/boot/tools/build.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ u8 buf[SETUP_SECT_MAX*512];
#define PECOFF_COMPAT_RESERVE 0x0
#endif

static unsigned long efi32_stub_entry;
static unsigned long efi64_stub_entry;
static unsigned long efi_pe_entry;
static unsigned long efi32_pe_entry;
static unsigned long _end;
Expand Down Expand Up @@ -265,31 +263,12 @@ static void efi_stub_defaults(void)
#endif
}

static void efi_stub_entry_update(void)
{
unsigned long addr = efi32_stub_entry;

#ifdef CONFIG_EFI_HANDOVER_PROTOCOL
#ifdef CONFIG_X86_64
/* Yes, this is really how we defined it :( */
addr = efi64_stub_entry - 0x200;
#endif

#ifdef CONFIG_EFI_MIXED
if (efi32_stub_entry != addr)
die("32-bit and 64-bit EFI entry points do not match\n");
#endif
#endif
put_unaligned_le32(addr, &buf[0x264]);
}

#else

static inline void update_pecoff_setup_and_reloc(unsigned int size) {}
static inline void update_pecoff_text(unsigned int text_start,
unsigned int file_sz) {}
static inline void efi_stub_defaults(void) {}
static inline void efi_stub_entry_update(void) {}

static inline int reserve_pecoff_reloc_section(int c)
{
Expand Down Expand Up @@ -332,8 +311,6 @@ static void parse_zoffset(char *fname)
p = (char *)buf;

while (p && *p) {
PARSE_ZOFS(p, efi32_stub_entry);
PARSE_ZOFS(p, efi64_stub_entry);
PARSE_ZOFS(p, efi_pe_entry);
PARSE_ZOFS(p, efi32_pe_entry);
PARSE_ZOFS(p, _end);
Expand Down Expand Up @@ -416,7 +393,6 @@ int main(int argc, char ** argv)

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

efi_stub_entry_update();

crc = partial_crc32(buf, i, crc);
if (fwrite(buf, 1, i, dest) != i)
Expand Down

0 comments on commit eac9563

Please sign in to comment.