From 0d43ce5266228182189771901413cf59a57ad585 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 21 Sep 2021 22:00:06 +0200 Subject: [PATCH] stub: various modernizations to linux.c Let's make some stuff const. Most importanly call AllocatePages() with a pointer to an EFI_PHYSICAL_ADDRESS instead of a pointer to a pointer. On 64bit this makes no difference, but on i386 this is simply not correct, since EFI_PHYSICAL_ADDRESS is 64bit there, even though pointers are 32bit. --- src/boot/efi/linux.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/boot/efi/linux.c b/src/boot/efi/linux.c index 3af69e4d57..5232a3ba40 100644 --- a/src/boot/efi/linux.c +++ b/src/boot/efi/linux.c @@ -13,6 +13,7 @@ #endif typedef VOID(*handover_f)(VOID *image, EFI_SYSTEM_TABLE *table, struct boot_params *params) __regparm0__; + static VOID linux_efi_handover(EFI_HANDLE image, struct boot_params *params) { handover_f handover; UINTN start = (UINTN)params->hdr.code32_start; @@ -31,16 +32,17 @@ EFI_STATUS linux_exec(EFI_HANDLE image, CHAR8 *cmdline, UINTN cmdline_len, UINTN linux_addr, UINTN initrd_addr, UINTN initrd_size) { - struct boot_params *image_params; + + const struct boot_params *image_params; struct boot_params *boot_params; - UINT8 setup_sectors; EFI_PHYSICAL_ADDRESS addr; + UINT8 setup_sectors; EFI_STATUS err; assert(image); assert(cmdline); - image_params = (struct boot_params *) linux_addr; + image_params = (const struct boot_params *) linux_addr; if (image_params->hdr.boot_flag != 0xAA55 || image_params->hdr.header != SETUP_MAGIC || @@ -48,22 +50,32 @@ EFI_STATUS linux_exec(EFI_HANDLE image, !image_params->hdr.relocatable_kernel) return EFI_LOAD_ERROR; - boot_params = (struct boot_params *) 0xFFFFFFFF; - err = uefi_call_wrapper(BS->AllocatePages, 4, AllocateMaxAddress, EfiLoaderData, - EFI_SIZE_TO_PAGES(0x4000), (EFI_PHYSICAL_ADDRESS*) &boot_params); + addr = UINT32_MAX; /* Below the 32bit boundary */ + err = uefi_call_wrapper( + BS->AllocatePages, 4, + AllocateMaxAddress, + EfiLoaderData, + EFI_SIZE_TO_PAGES(0x4000), + &addr); if (EFI_ERROR(err)) return err; + boot_params = (struct boot_params *) PHYSICAL_ADDRESS_TO_POINTER(addr); ZeroMem(boot_params, 0x4000); - CopyMem(&boot_params->hdr, &image_params->hdr, sizeof(struct setup_header)); + boot_params->hdr = image_params->hdr; boot_params->hdr.type_of_loader = 0xff; setup_sectors = image_params->hdr.setup_sects > 0 ? image_params->hdr.setup_sects : 4; boot_params->hdr.code32_start = (UINT32)linux_addr + (setup_sectors + 1) * 512; if (cmdline) { addr = 0xA0000; - err = uefi_call_wrapper(BS->AllocatePages, 4, AllocateMaxAddress, EfiLoaderData, - EFI_SIZE_TO_PAGES(cmdline_len + 1), &addr); + + err = uefi_call_wrapper( + BS->AllocatePages, 4, + AllocateMaxAddress, + EfiLoaderData, + EFI_SIZE_TO_PAGES(cmdline_len + 1), + &addr); if (EFI_ERROR(err)) return err; @@ -72,8 +84,8 @@ EFI_STATUS linux_exec(EFI_HANDLE image, boot_params->hdr.cmd_line_ptr = (UINT32) addr; } - boot_params->hdr.ramdisk_image = (UINT32)initrd_addr; - boot_params->hdr.ramdisk_size = (UINT32)initrd_size; + boot_params->hdr.ramdisk_image = (UINT32) initrd_addr; + boot_params->hdr.ramdisk_size = (UINT32) initrd_size; linux_efi_handover(image, boot_params); return EFI_LOAD_ERROR; -- 2.25.1