All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ardb+git@google.com>
To: stable@vger.kernel.org
Subject: [PATCH for-stable-6.1 17/23] x86/efistub: Use 1:1 file:memory mapping for PE/COFF .compat section
Date: Fri, 19 Apr 2024 10:11:23 +0200	[thread overview]
Message-ID: <20240419081105.3817596-42-ardb+git@google.com> (raw)
In-Reply-To: <20240419081105.3817596-25-ardb+git@google.com>

From: Ard Biesheuvel <ardb@kernel.org>

[ Commit 1ad55cecf22f05f1c884adf63cc09d3c3e609ebf upstream ]

The .compat section is a dummy PE section that contains the address of
the 32-bit entrypoint of the 64-bit kernel image if it is bootable from
32-bit firmware (i.e., CONFIG_EFI_MIXED=y)

This section is only 8 bytes in size and is only referenced from the
loader, and so it is placed at the end of the memory view of the image,
to avoid the need for padding it to 4k, which is required for sections
appearing in the middle of the image.

Unfortunately, this violates the PE/COFF spec, and even if most EFI
loaders will work correctly (including the Tianocore reference
implementation), PE loaders do exist that reject such images, on the
basis that both the file and memory views of the file contents should be
described by the section headers in a monotonically increasing manner
without leaving any gaps.

So reorganize the sections to avoid this issue. This results in a slight
padding overhead (< 4k) which can be avoided if desired by disabling
CONFIG_EFI_MIXED (which is only needed in rare cases these days)

Fixes: 3e3eabe26dc8 ("x86/boot: Increase section and file alignment to 4k/512")
Reported-by: Mike Beaton <mjsbeaton@gmail.com>
Link: https://lkml.kernel.org/r/CAHzAAWQ6srV6LVNdmfbJhOwhBw5ZzxxZZ07aHt9oKkfYAdvuQQ%40mail.gmail.com
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 arch/x86/boot/header.S | 14 ++++++--------
 arch/x86/boot/setup.ld |  6 +++---
 2 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
index 6264bbf54fbc..7593339b529a 100644
--- a/arch/x86/boot/header.S
+++ b/arch/x86/boot/header.S
@@ -105,8 +105,7 @@ extra_header_fields:
 	.word	0				# MinorSubsystemVersion
 	.long	0				# Win32VersionValue
 
-	.long	setup_size + ZO__end + pecompat_vsize
-						# SizeOfImage
+	.long	setup_size + ZO__end		# SizeOfImage
 
 	.long	salign				# SizeOfHeaders
 	.long	0				# CheckSum
@@ -142,7 +141,7 @@ section_table:
 	.ascii	".setup"
 	.byte	0
 	.byte	0
-	.long	setup_size - salign 		# VirtualSize
+	.long	pecompat_fstart - salign 	# VirtualSize
 	.long	salign				# VirtualAddress
 	.long	pecompat_fstart - salign	# SizeOfRawData
 	.long	salign				# PointerToRawData
@@ -155,8 +154,8 @@ section_table:
 #ifdef CONFIG_EFI_MIXED
 	.asciz	".compat"
 
-	.long	8				# VirtualSize
-	.long	setup_size + ZO__end		# VirtualAddress
+	.long	pecompat_fsize			# VirtualSize
+	.long	pecompat_fstart			# VirtualAddress
 	.long	pecompat_fsize			# SizeOfRawData
 	.long	pecompat_fstart			# PointerToRawData
 
@@ -171,17 +170,16 @@ section_table:
 	 * modes this image supports.
 	 */
 	.pushsection ".pecompat", "a", @progbits
-	.balign	falign
-	.set	pecompat_vsize, salign
+	.balign	salign
 	.globl	pecompat_fstart
 pecompat_fstart:
 	.byte	0x1				# Version
 	.byte	8				# Size
 	.word	IMAGE_FILE_MACHINE_I386		# PE machine type
 	.long	setup_size + ZO_efi32_pe_entry	# Entrypoint
+	.byte	0x0				# Sentinel
 	.popsection
 #else
-	.set	pecompat_vsize, 0
 	.set	pecompat_fstart, setup_size
 #endif
 	.ascii	".text"
diff --git a/arch/x86/boot/setup.ld b/arch/x86/boot/setup.ld
index 83bb7efad8ae..3a2d1360abb0 100644
--- a/arch/x86/boot/setup.ld
+++ b/arch/x86/boot/setup.ld
@@ -24,6 +24,9 @@ SECTIONS
 	.text		: { *(.text .text.*) }
 	.text32		: { *(.text32) }
 
+	.pecompat	: { *(.pecompat) }
+	PROVIDE(pecompat_fsize = setup_size - pecompat_fstart);
+
 	. = ALIGN(16);
 	.rodata		: { *(.rodata*) }
 
@@ -36,9 +39,6 @@ SECTIONS
 	. = ALIGN(16);
 	.data		: { *(.data*) }
 
-	.pecompat	: { *(.pecompat) }
-	PROVIDE(pecompat_fsize = setup_size - pecompat_fstart);
-
 	.signature	: {
 		setup_sig = .;
 		LONG(0x5a5aaa55)
-- 
2.44.0.769.g3c40516874-goog


  parent reply	other threads:[~2024-04-19  8:12 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-19  8:11 [PATCH for-stable-6.1 00/23] x86/efistub backports Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 01/23] x86/efi: Drop EFI stub .bss from .data section Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 02/23] x86/efi: Disregard setup header of loaded image Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 03/23] x86/efistub: Reinstate soft limit for initrd loading Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 04/23] x86/efi: Drop alignment flags from PE section headers Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 05/23] x86/boot: Remove the 'bugger off' message Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 06/23] x86/boot: Omit compression buffer from PE/COFF image memory footprint Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 07/23] x86/boot: Drop redundant code setting the root device Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 08/23] x86/boot: Drop references to startup_64 Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 09/23] x86/boot: Grab kernel_info offset from zoffset header directly Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 10/23] x86/boot: Set EFI handover offset directly in header asm Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 11/23] x86/boot: Define setup size in linker script Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 12/23] x86/boot: Derive file size from _edata symbol Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 13/23] x86/boot: Construct PE/COFF .text section from assembler Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 14/23] x86/boot: Drop PE/COFF .reloc section Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 15/23] x86/boot: Split off PE/COFF .data section Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 16/23] x86/boot: Increase section and file alignment to 4k/512 Ard Biesheuvel
2024-04-19  8:11 ` Ard Biesheuvel [this message]
2024-04-19  8:11 ` [PATCH for-stable-6.1 18/23] x86/mm: Remove P*D_PAGE_MASK and P*D_PAGE_SIZE macros Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 19/23] x86/head/64: Add missing __head annotation to startup_64_load_idt() Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 20/23] x86/head/64: Move the __head definition to <asm/init.h> Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 21/23] x86/sme: Move early SME kernel encryption handling into .head.text Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 22/23] x86/sev: Move early startup code into .head.text section Ard Biesheuvel
2024-04-19  8:11 ` [PATCH for-stable-6.1 23/23] x86/efistub: Remap kernel text read-only before dropping NX attribute Ard Biesheuvel
2024-04-19 10:47 ` [PATCH for-stable-6.1 00/23] x86/efistub backports Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240419081105.3817596-42-ardb+git@google.com \
    --to=ardb+git@google.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.