efivar/0021-Fix-up-efi_guid_cmp-s-alignment-problem-a-different-.patch
Petr Šabata 974b936917 RHEL 9.0.0 Alpha bootstrap
The content of this branch was automatically imported from Fedora ELN
with the following as its source:
https://src.fedoraproject.org/rpms/efivar#9f54d8029387895b7b1389d9a9f9e0bf476a027f
2020-10-14 23:58:29 +02:00

71 lines
2.4 KiB
Diff

From 8a003f0c495da3719338881286bc2976b2d086aa Mon Sep 17 00:00:00 2001
From: Peter Jones <pjones@redhat.com>
Date: Wed, 29 May 2019 10:11:24 -0400
Subject: [PATCH 21/86] Fix up efi_guid_cmp()'s alignment problem a different
way
With the prior fix for efi_guid_cmp()'s alignment issue, abicheck shows:
1 function with some indirect sub-type change:
[C]'function int efi_guid_cmp(void* const, void* const)' at <built-in>:34:1 has some indirect sub-type changes:
parameter 1 of type 'void* const' changed:
entity changed from 'void* const' to 'const efi_guid_t*'
type size hasn't changed
parameter 2 of type 'void* const' changed:
entity changed from 'void* const' to 'const efi_guid_t*'
type size hasn't changed
While this isn't a meaningful ABI difference in terms of linking, it is
definitely worse than having the type actually specified.
This patch changes the type back to the previous type, but also changes
the typedef to require a 1-byte alignment. This will guarantee that all
new builds of efi_guid_cmp() and related code have code generated in a
way that's compatible with any alignment, thus alleviating the issue.
Signed-off-by: Peter Jones <pjones@redhat.com>
---
src/guid.c | 2 +-
src/include/efivar/efivar.h | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/guid.c b/src/guid.c
index 3156b3b7c60..306c9ff8287 100644
--- a/src/guid.c
+++ b/src/guid.c
@@ -31,7 +31,7 @@
extern const efi_guid_t efi_guid_zero;
int NONNULL(1, 2) PUBLIC
-efi_guid_cmp(const void * const a, const void * const b)
+efi_guid_cmp(const efi_guid_t *a, const efi_guid_t *b)
{
return memcmp(a, b, sizeof (efi_guid_t));
}
diff --git a/src/include/efivar/efivar.h b/src/include/efivar/efivar.h
index ff95cb10791..11d9a9d7b78 100644
--- a/src/include/efivar/efivar.h
+++ b/src/include/efivar/efivar.h
@@ -37,7 +37,7 @@ typedef struct {
uint16_t c;
uint16_t d;
uint8_t e[6];
-} efi_guid_t;
+} efi_guid_t __attribute__((__aligned__(1)));
typedef struct {
uint8_t addr[4];
@@ -128,7 +128,7 @@ extern int efi_symbol_to_guid(const char *symbol, efi_guid_t *guid)
extern int efi_guid_is_zero(const efi_guid_t *guid);
extern int efi_guid_is_empty(const efi_guid_t *guid);
-extern int efi_guid_cmp(const void * const a, const void * const b);
+extern int efi_guid_cmp(const efi_guid_t *a, const efi_guid_t *b);
/* import / export functions */
typedef struct efi_variable efi_variable_t;
--
2.24.1