[focal:linux-azure-cvm][PATCH 1/1] efi/x86: Only copy the compressed kernel image in efi_relocate_kernel()

Marcelo Henrique Cerri marcelo.cerri at canonical.com
Mon Jun 27 23:38:37 UTC 2022


From: Arvind Sankar <nivedita at alum.mit.edu>

BugLink: https://bugs.launchpad.net/bugs/1980023

The image_size argument to efi_relocate_kernel() is currently specified
as init_size, but this is unnecessarily large. The compressed kernel is
much smaller, in fact, its image only extends up to the start of _bss,
since at this point, the .bss section is still uninitialized.

Depending on compression level, this can reduce the amount of data
copied by 4-5x.

Signed-off-by: Arvind Sankar <nivedita at alum.mit.edu>
Link: https://lore.kernel.org/r/20201011142012.96493-1-nivedita@alum.mit.edu
Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
(back ported from commit 688eb28211abdf82a3f51e8997f1c8137947227d)
[marcelo.cerri: replicate the same change in eboot.c instead because
 it was merged into libstub in 5.7 by c2d0b470154c]
Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
---
 arch/x86/boot/compressed/eboot.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index 82bc60c8acb2..59a5ea4f64f9 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -810,9 +810,11 @@ efi_main(struct efi_config *c, struct boot_params *boot_params)
 	 * address, relocate it.
 	 */
 	if (hdr->pref_address != hdr->code32_start) {
+		extern char _bss[];
 		unsigned long bzimage_addr = hdr->code32_start;
 		status = efi_relocate_kernel(sys_table, &bzimage_addr,
-					     hdr->init_size, hdr->init_size,
+					     (unsigned long)_bss - bzimage_addr,
+					     hdr->init_size,
 					     hdr->pref_address,
 					     hdr->kernel_alignment,
 					     LOAD_PHYSICAL_ADDR);
-- 
2.25.1




More information about the kernel-team mailing list