On Tue, 2023-10-31 at 20:35 +0100, Vladimir 'phcoder' Serbinenko wrote: > On ia64 alignment requirements are strict. When we pass a pointer to > UUID it needs to be at least 4-byte aligned or EFI will crash. > On the other hand in device path there is no padding for UUID, so we > need 2 types in one formor another. Make 4-byte aligned and unaligned types > > Signed-off-by: Vladimir Serbinenko <phco...@gmail.com> > --- > grub-core/commands/efi/lsefi.c | 2 +- > grub-core/efiemu/runtime/efiemu.c | 33 +++++++++++++++++++++---------- > grub-core/kern/efi/efi.c | 2 +- > grub-core/kern/misc.c | 2 +- > grub-core/loader/i386/xnu.c | 2 +- > include/grub/efi/api.h | 12 +++++------ > include/grub/efiemu/efiemu.h | 4 ++-- > include/grub/efiemu/runtime.h | 2 +- > include/grub/types.h | 11 ++++++++++- > 9 files changed, 46 insertions(+), 24 deletions(-) > > diff --git a/grub-core/commands/efi/lsefi.c b/grub-core/commands/efi/lsefi.c > index 95cba5baf..7b8316d41 100644 > --- a/grub-core/commands/efi/lsefi.c > +++ b/grub-core/commands/efi/lsefi.c > @@ -96,7 +96,7 @@ grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)), > grub_efi_handle_t handle = handles[i]; > grub_efi_status_t status; > grub_efi_uintn_t num_protocols; > - grub_guid_t **protocols; > + grub_packed_guid_t **protocols; > grub_efi_device_path_t *dp; > > grub_printf ("Handle %p\n", handle); > diff --git a/grub-core/efiemu/runtime/efiemu.c > b/grub-core/efiemu/runtime/efiemu.c > index c84b30652..f6b6d19f7 100644 > --- a/grub-core/efiemu/runtime/efiemu.c > +++ b/grub-core/efiemu/runtime/efiemu.c > @@ -66,7 +66,7 @@ efiemu_convert_pointer (grub_efi_uintn_t debug_disposition, > > grub_efi_status_t __grub_efi_api > efiemu_get_variable (grub_efi_char16_t *variable_name, > - const grub_guid_t *vendor_guid, > + const grub_packed_guid_t *vendor_guid, > grub_efi_uint32_t *attributes, > grub_efi_uintn_t *data_size, > void *data); > @@ -74,11 +74,11 @@ efiemu_get_variable (grub_efi_char16_t *variable_name, > 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_guid_t *vendor_guid); > + grub_packed_guid_t *vendor_guid); > > grub_efi_status_t __grub_efi_api > efiemu_set_variable (grub_efi_char16_t *variable_name, > - const grub_guid_t *vendor_guid, > + const grub_packed_guid_t *vendor_guid, > grub_efi_uint32_t attributes, > grub_efi_uintn_t data_size, > void *data); > @@ -416,7 +416,7 @@ EFI_FUNC (efiemu_convert_pointer) (grub_efi_uintn_t > debug_disposition, > > /* Find variable by name and GUID. */ > static struct efi_variable * > -find_variable (const grub_guid_t *vendor_guid, > +find_variable (const grub_packed_guid_t *vendor_guid, > grub_efi_char16_t *variable_name) > { > grub_uint8_t *ptr; > @@ -438,7 +438,7 @@ find_variable (const grub_guid_t *vendor_guid, > > grub_efi_status_t __grub_efi_api > EFI_FUNC (efiemu_get_variable) (grub_efi_char16_t *variable_name, > - const grub_guid_t *vendor_guid, > + const grub_packed_guid_t *vendor_guid, > grub_efi_uint32_t *attributes, > grub_efi_uintn_t *data_size, > void *data) > @@ -464,7 +464,7 @@ EFI_FUNC (efiemu_get_variable) (grub_efi_char16_t > *variable_name, > 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_guid_t *vendor_guid) > + grub_packed_guid_t *vendor_guid) > { > struct efi_variable *efivar; > LOG ('l'); > @@ -503,7 +503,7 @@ grub_efi_status_t __grub_efi_api EFI_FUNC > > grub_efi_status_t __grub_efi_api > EFI_FUNC (efiemu_set_variable) (grub_efi_char16_t *variable_name, > - const grub_guid_t *vendor_guid, > + const grub_packed_guid_t *vendor_guid, > grub_efi_uint32_t attributes, > grub_efi_uintn_t data_size, > void *data) > @@ -597,9 +597,22 @@ struct grub_efi_runtime_services efiemu_runtime_services > = > .set_virtual_address_map = efiemu_set_virtual_address_map, > .convert_pointer = efiemu_convert_pointer, > > - .get_variable = efiemu_get_variable, > - .get_next_variable_name = efiemu_get_next_variable_name, > - .set_variable = efiemu_set_variable, > + .get_variable = (grub_efi_status_t > + (__grub_efi_api *) (grub_efi_char16_t *variable_name, > + const grub_guid_t *vendor_guid, > + grub_efi_uint32_t *attributes, > + grub_efi_uintn_t *data_size, > + void *data)) efiemu_get_variable, > + .get_next_variable_name = (grub_efi_status_t > + (__grub_efi_api *) (grub_efi_uintn_t > *variable_name_size, > + grub_efi_char16_t > *variable_name, > + grub_guid_t *vendor_guid)) > efiemu_get_next_variable_name, > + .set_variable = (grub_efi_status_t > + (__grub_efi_api *) (grub_efi_char16_t *variable_name, > + const grub_guid_t *vendor_guid, > + grub_efi_uint32_t attributes, > + grub_efi_uintn_t data_size, > + void *data)) efiemu_set_variable, > .get_next_high_monotonic_count = efiemu_get_next_high_monotonic_count, > > .reset_system = efiemu_reset_system > diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c > index e53808307..b93ae3aba 100644 > --- a/grub-core/kern/efi/efi.c > +++ b/grub-core/kern/efi/efi.c > @@ -1039,7 +1039,7 @@ grub_efi_find_configuration_table (const grub_guid_t > *target_guid) > > for (i = 0; i < grub_efi_system_table->num_table_entries; i++) > { > - grub_guid_t *guid = > + grub_packed_guid_t *guid = > &grub_efi_system_table->configuration_table[i].vendor_guid; > > if (! grub_memcmp (guid, target_guid, sizeof (grub_guid_t))) > diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c > index b57249acb..7cee5d75c 100644 > --- a/grub-core/kern/misc.c > +++ b/grub-core/kern/misc.c > @@ -1068,7 +1068,7 @@ grub_vsnprintf_real (char *str, grub_size_t max_len, > const char *fmt0, > if (*(fmt) == 'G') > { > ++fmt; > - grub_guid_t *guid = (grub_guid_t *)(grub_addr_t) curarg; > + grub_packed_guid_t *guid = (grub_packed_guid_t *)(grub_addr_t) > curarg; > write_number (str, &count, max_len, 8, 0, '0', 'x', guid->data1); > write_char (str, &count, max_len, '-'); > write_number (str, &count, max_len, 4, 0, '0', 'x', guid->data2); > diff --git a/grub-core/loader/i386/xnu.c b/grub-core/loader/i386/xnu.c > index 4e31ce99a..b91e2f840 100644 > --- a/grub-core/loader/i386/xnu.c > +++ b/grub-core/loader/i386/xnu.c > @@ -694,7 +694,7 @@ grub_cpu_xnu_fill_devicetree (grub_uint64_t *fsbfreq_out) > { > void *ptr; > struct grub_xnu_devtree_key *curkey; > - grub_guid_t guid; > + grub_packed_guid_t guid; > char guidbuf[64]; > > /* Retrieve current key. */ > diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h > index d3eaef3fb..d44d00ad7 100644 > --- a/include/grub/efi/api.h > +++ b/include/grub/efi/api.h > @@ -730,7 +730,7 @@ typedef struct grub_efi_memory_mapped_device_path > grub_efi_memory_mapped_device_ > struct grub_efi_vendor_device_path > { > grub_efi_device_path_t header; > - grub_guid_t vendor_guid; > + grub_packed_guid_t vendor_guid; > grub_efi_uint8_t vendor_defined_data[0]; > } GRUB_PACKED; > typedef struct grub_efi_vendor_device_path grub_efi_vendor_device_path_t; > @@ -974,7 +974,7 @@ typedef struct grub_efi_cdrom_device_path > grub_efi_cdrom_device_path_t; > struct grub_efi_vendor_media_device_path > { > grub_efi_device_path_t header; > - grub_guid_t vendor_guid; > + grub_packed_guid_t vendor_guid; > grub_efi_uint8_t vendor_defined_data[0]; > } GRUB_PACKED; > typedef struct grub_efi_vendor_media_device_path > grub_efi_vendor_media_device_path_t; > @@ -993,7 +993,7 @@ typedef struct grub_efi_file_path_device_path > grub_efi_file_path_device_path_t; > struct grub_efi_protocol_device_path > { > grub_efi_device_path_t header; > - grub_guid_t guid; > + grub_packed_guid_t guid; > } GRUB_PACKED; > typedef struct grub_efi_protocol_device_path grub_efi_protocol_device_path_t; > > @@ -1002,7 +1002,7 @@ typedef struct grub_efi_protocol_device_path > grub_efi_protocol_device_path_t; > struct grub_efi_piwg_device_path > { > grub_efi_device_path_t header; > - grub_guid_t guid; > + grub_packed_guid_t guid; > } GRUB_PACKED; > typedef struct grub_efi_piwg_device_path grub_efi_piwg_device_path_t; > > @@ -1287,7 +1287,7 @@ struct grub_efi_boot_services > > grub_efi_status_t > (__grub_efi_api *protocols_per_handle) (grub_efi_handle_t handle, > - grub_guid_t ***protocol_buffer, > + grub_packed_guid_t ***protocol_buffer, > grub_efi_uintn_t > *protocol_buffer_count); > > grub_efi_status_t > @@ -1386,7 +1386,7 @@ typedef struct grub_efi_runtime_services > grub_efi_runtime_services_t; > > struct grub_efi_configuration_table > { > - grub_guid_t vendor_guid; > + grub_packed_guid_t vendor_guid; > void *vendor_table; > } GRUB_PACKED; > typedef struct grub_efi_configuration_table grub_efi_configuration_table_t; > diff --git a/include/grub/efiemu/efiemu.h b/include/grub/efiemu/efiemu.h > index caf0b505f..d6a868e94 100644 > --- a/include/grub/efiemu/efiemu.h > +++ b/include/grub/efiemu/efiemu.h > @@ -183,13 +183,13 @@ struct grub_efiemu_configuration_table > }; > struct grub_efiemu_configuration_table32 > { > - grub_guid_t vendor_guid; > + grub_packed_guid_t vendor_guid; > grub_efi_uint32_t vendor_table; > } GRUB_PACKED; > typedef struct grub_efiemu_configuration_table32 > grub_efiemu_configuration_table32_t; > struct grub_efiemu_configuration_table64 > { > - grub_guid_t vendor_guid; > + grub_packed_guid_t vendor_guid; > grub_efi_uint64_t vendor_table; > } GRUB_PACKED; > typedef struct grub_efiemu_configuration_table64 > grub_efiemu_configuration_table64_t; > diff --git a/include/grub/efiemu/runtime.h b/include/grub/efiemu/runtime.h > index c9ad9fdfa..2ff429845 100644 > --- a/include/grub/efiemu/runtime.h > +++ b/include/grub/efiemu/runtime.h > @@ -29,7 +29,7 @@ struct grub_efiemu_ptv_rel > > struct efi_variable > { > - grub_guid_t guid; > + grub_packed_guid_t guid; > grub_uint32_t namelen; > grub_uint32_t size; > grub_efi_uint32_t attributes; > diff --git a/include/grub/types.h b/include/grub/types.h > index 45536a661..064066e2e 100644 > --- a/include/grub/types.h > +++ b/include/grub/types.h > @@ -376,7 +376,16 @@ struct grub_guid > grub_uint16_t data2; > grub_uint16_t data3; > grub_uint8_t data4[8]; > -} GRUB_PACKED; > +} __attribute__ ((aligned(4))); > typedef struct grub_guid grub_guid_t; > > +struct grub_packed_guid > +{ > + grub_uint32_t data1; > + grub_uint16_t data2; > + grub_uint16_t data3; > + grub_uint8_t data4[8]; > +} GRUB_PACKED; > +typedef struct grub_packed_guid grub_packed_guid_t; > + > #endif /* ! GRUB_TYPES_HEADER */ > -- > 2.39.2 >
Tested-by: John Paul Adrian Glaubitz <glaub...@physik.fu-berlin.de> -- .''`. John Paul Adrian Glaubitz : :' : Debian Developer `. `' Physicist `- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel