On Tue, May 23, 2023 at 10:23:50AM +0200, Ard Biesheuvel wrote: > Switch the i386-efi and x86_64-efi builds to the generic EFI loader, > which enters the Linux kernel via the EFI stub and provides the initrd > via the LoadFile2 protocol. This unifies x86 with other EFI > architectures, and removes the dependency on the setup header and struct > bootparams. > > Do some preparatory cleanup first, so we no longer need to rely on the > MS to SysV calling convention translation code. > > Changes since v2: > - rebase onto latest master, which has the Loongarch changes > - retain Itanium support for now > - simplify the fallback logic - attempt to load the image as usual, and > fallback on failure or if the image does not implement LoadFile2 > > Changes since v1: > - drop Itanium support, which is a maintenance burden as it shares the > EFI code with other architectures, but does not have a EFI stub in > Linux, and there is no way to test whether our changes break the boot > for it or not; > - enable generic EFI for i386 as well > - wire up the existing x86 code as a fallback for kernels that lack EFI > stub or LoadFile2 support. This removes the need for additional > changes to support v5.8 or older kernels. > > Cc: Daniel Kiper <daniel.ki...@oracle.com> > Cc: Glenn Washburn <developm...@efficientek.com> > > Ard Biesheuvel (5): > efi: Make EFI PXE protocol methods non-callable > efi: Add calling convention annotation to all prototypes > efi: Drop all uses of efi_call_XX wrappers > efi: Remove x86_64 call wrappers > efi: Use generic EFI loader for x86_64 and i386
I run test and Coverity builds and they reported some problems. You can find in attachments a fix for the build problems and a Coverity report. Please take a look... Otherwise patches LGTM... Thanks, Daniel
diff --git a/grub-core/efiemu/runtime/efiemu.c b/grub-core/efiemu/runtime/efiemu.c index 5db1f347b..53b3cce7b 100644 --- a/grub-core/efiemu/runtime/efiemu.c +++ b/grub-core/efiemu/runtime/efiemu.c @@ -32,17 +32,17 @@ #include <grub/efi/api.h> #include <grub/efiemu/runtime.h> -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_get_time (grub_efi_time_t *time, grub_efi_time_capabilities_t *capabilities); -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_set_time (grub_efi_time_t *time); -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_get_wakeup_time (grub_efi_boolean_t *enabled, grub_efi_boolean_t *pending, grub_efi_time_t *time); -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_set_wakeup_time (grub_efi_boolean_t enabled, grub_efi_time_t *time); @@ -52,51 +52,51 @@ efiemu_set_wakeup_time (grub_efi_boolean_t enabled, #define PHYSICAL_ATTRIBUTE __attribute__ ((section(".text-physical"))); #endif -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_set_virtual_address_map (grub_efi_uintn_t memory_map_size, grub_efi_uintn_t descriptor_size, grub_efi_uint32_t descriptor_version, grub_efi_memory_descriptor_t *virtual_map) PHYSICAL_ATTRIBUTE; -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_convert_pointer (grub_efi_uintn_t debug_disposition, void **address) PHYSICAL_ATTRIBUTE; -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_get_variable (grub_efi_char16_t *variable_name, const grub_efi_guid_t *vendor_guid, grub_efi_uint32_t *attributes, grub_efi_uintn_t *data_size, void *data); -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_get_next_variable_name (grub_efi_uintn_t *variable_name_size, grub_efi_char16_t *variable_name, grub_efi_guid_t *vendor_guid); -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_set_variable (grub_efi_char16_t *variable_name, const grub_efi_guid_t *vendor_guid, grub_efi_uint32_t attributes, grub_efi_uintn_t data_size, void *data); -grub_efi_status_t +grub_efi_status_t __grub_efi_api efiemu_get_next_high_monotonic_count (grub_efi_uint32_t *high_count); -void +void __grub_efi_api efiemu_reset_system (grub_efi_reset_type_t reset_type, grub_efi_status_t reset_status, grub_efi_uintn_t data_size, grub_efi_char16_t *reset_data); -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_set_virtual_address_map) (grub_efi_uintn_t, grub_efi_uintn_t, grub_efi_uint32_t, grub_efi_memory_descriptor_t *) PHYSICAL_ATTRIBUTE; -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_convert_pointer) (grub_efi_uintn_t debug_disposition, void **address) PHYSICAL_ATTRIBUTE; @@ -202,7 +202,7 @@ bcd_to_hex (grub_uint8_t in) return 10 * ((in & 0xf0) >> 4) + (in & 0x0f); } -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_get_time) (grub_efi_time_t *time, grub_efi_time_capabilities_t *capabilities) { @@ -246,7 +246,7 @@ EFI_FUNC (efiemu_get_time) (grub_efi_time_t *time, return GRUB_EFI_SUCCESS; } -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_set_time) (grub_efi_time_t *time) { LOG ('b'); @@ -265,7 +265,7 @@ EFI_FUNC (efiemu_set_time) (grub_efi_time_t *time) } /* Following 2 functions are vendor specific. So announce it as unsupported */ -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_get_wakeup_time) (grub_efi_boolean_t *enabled, grub_efi_boolean_t *pending, grub_efi_time_t *time) @@ -274,7 +274,7 @@ EFI_FUNC (efiemu_get_wakeup_time) (grub_efi_boolean_t *enabled, return GRUB_EFI_UNSUPPORTED; } -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_set_wakeup_time) (grub_efi_boolean_t enabled, grub_efi_time_t *time) { @@ -337,7 +337,7 @@ efiemu_getcrc32 (grub_uint32_t crc, void *buf, int size) } -grub_efi_status_t EFI_FUNC +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_set_virtual_address_map) (grub_efi_uintn_t memory_map_size, grub_efi_uintn_t descriptor_size, grub_efi_uint32_t descriptor_version, @@ -403,7 +403,7 @@ grub_efi_status_t EFI_FUNC /* since efiemu_set_virtual_address_map corrects all the pointers we don't need efiemu_convert_pointer */ -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_convert_pointer) (grub_efi_uintn_t debug_disposition, void **address) { @@ -436,7 +436,7 @@ find_variable (const grub_efi_guid_t *vendor_guid, return 0; } -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_get_variable) (grub_efi_char16_t *variable_name, const grub_efi_guid_t *vendor_guid, grub_efi_uint32_t *attributes, @@ -461,7 +461,7 @@ EFI_FUNC (efiemu_get_variable) (grub_efi_char16_t *variable_name, return GRUB_EFI_SUCCESS; } -grub_efi_status_t EFI_FUNC +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_get_next_variable_name) (grub_efi_uintn_t *variable_name_size, grub_efi_char16_t *variable_name, grub_efi_guid_t *vendor_guid) @@ -501,7 +501,7 @@ grub_efi_status_t EFI_FUNC return GRUB_EFI_SUCCESS; } -grub_efi_status_t +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_set_variable) (grub_efi_char16_t *variable_name, const grub_efi_guid_t *vendor_guid, grub_efi_uint32_t attributes, @@ -556,7 +556,7 @@ EFI_FUNC (efiemu_set_variable) (grub_efi_char16_t *variable_name, return GRUB_EFI_SUCCESS; } -grub_efi_status_t EFI_FUNC +grub_efi_status_t __grub_efi_api EFI_FUNC (efiemu_get_next_high_monotonic_count) (grub_efi_uint32_t *high_count) { LOG ('j'); @@ -570,7 +570,7 @@ grub_efi_status_t EFI_FUNC Besides EFI specification says that this function shouldn't be used on systems supporting ACPI */ -void +void __grub_efi_api EFI_FUNC (efiemu_reset_system) (grub_efi_reset_type_t reset_type, grub_efi_status_t reset_status, grub_efi_uintn_t data_size,
Hi, Please find the latest report on new defect(s) introduced to GRUB found with Coverity Scan. 2 new defect(s) introduced to GRUB found with Coverity Scan. New defect(s) Reported-by: Coverity Scan Showing 2 of 2 defect(s) ** CID 407976: Null pointer dereferences (NULL_RETURNS) /grub-core/loader/efi/linux.c: 217 in grub_arch_efi_linux_boot_image() ________________________________________________________________________________________________________ *** CID 407976: Null pointer dereferences (NULL_RETURNS) /grub-core/loader/efi/linux.c: 217 in grub_arch_efi_linux_boot_image() 211 return grub_error (GRUB_ERR_BAD_OS, "cannot load image"); 212 213 grub_dprintf ("linux", "linux command line: '%s'\n", args); 214 215 /* Convert command line to UCS-2 */ 216 loaded_image = grub_efi_get_loaded_image (image_handle); >>> CID 407976: Null pointer dereferences (NULL_RETURNS) >>> Dereferencing "loaded_image", which is known to be "NULL". 217 loaded_image->load_options_size = len = 218 (grub_strlen (args) + 1) * sizeof (grub_efi_char16_t); 219 loaded_image->load_options = 220 grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); 221 if (!loaded_image->load_options) 222 return grub_errno; ** CID 407975: Possible Control flow issues (DEADCODE) /grub-core/loader/efi/linux.c: 437 in grub_cmd_initrd() ________________________________________________________________________________________________________ *** CID 407975: Possible Control flow issues (DEADCODE) /grub-core/loader/efi/linux.c: 437 in grub_cmd_initrd() 431 grub_dprintf ("linux", "[addr=%p, size=0x%x]\n", 432 (void *) initrd_start, initrd_size); 433 #endif 434 435 fail: 436 grub_initrd_close (&initrd_ctx); >>> CID 407975: Possible Control flow issues (DEADCODE) >>> Execution cannot reach the expression "initrd_start" inside this >>> statement: "if (initrd_mem && !initrd_s...". 437 if (initrd_mem && !initrd_start) 438 grub_efi_free_pages ((grub_addr_t) initrd_mem, initrd_pages); 439 440 return grub_errno; 441 } 442 ________________________________________________________________________________________________________
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel