x86/boot/compressed, efi: Merge multiple definitions of image_offset into one

commit 4b52016247 upstream.

There is no need for head_32.S and head_64.S both declaring a copy of
the global 'image_offset' variable, so drop those and make the extern C
declaration the definition.

When image_offset is moved to the .c file, it needs to be placed
particularly in the .data section because it lands by default in the
.bss section which is cleared too late, in .Lrelocated, before the first
access to it and thus garbage gets read, leading to SEV guests exploding
in early boot.

This happens only when the SEV guest kernel is loaded through grub. If
supplied with qemu's -kernel command line option, that memory is always
cleared upfront by qemu and all is fine there.

  [ bp: Expand commit message with SEV aspect. ]

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221122161017.2426828-8-ardb@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Ard Biesheuvel
2022-11-22 17:10:07 +01:00
committed by Greg Kroah-Hartman
parent beeeb4655d
commit ef12d049fa
3 changed files with 1 additions and 9 deletions

View File

@@ -208,10 +208,6 @@ SYM_DATA_START_LOCAL(gdt)
.quad 0x00cf92000000ffff /* __KERNEL_DS */ .quad 0x00cf92000000ffff /* __KERNEL_DS */
SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end) SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)
#ifdef CONFIG_EFI_STUB
SYM_DATA(image_offset, .long 0)
#endif
/* /*
* Stack and heap for uncompression * Stack and heap for uncompression
*/ */

View File

@@ -734,10 +734,6 @@ SYM_DATA_START(boot32_idt)
SYM_DATA_END_LABEL(boot32_idt, SYM_L_GLOBAL, boot32_idt_end) SYM_DATA_END_LABEL(boot32_idt, SYM_L_GLOBAL, boot32_idt_end)
#endif #endif
#ifdef CONFIG_EFI_STUB
SYM_DATA(image_offset, .long 0)
#endif
#ifdef CONFIG_AMD_MEM_ENCRYPT #ifdef CONFIG_AMD_MEM_ENCRYPT
__HEAD __HEAD
.code32 .code32

View File

@@ -23,7 +23,7 @@
const efi_system_table_t *efi_system_table; const efi_system_table_t *efi_system_table;
const efi_dxe_services_table_t *efi_dxe_table; const efi_dxe_services_table_t *efi_dxe_table;
extern u32 image_offset; u32 image_offset __section(".data");
static efi_loaded_image_t *image = NULL; static efi_loaded_image_t *image = NULL;
static efi_status_t static efi_status_t