[efi] Allow compiler to perform type checks on EFI_EVENT

As with EFI_HANDLE, the EFI headers define EFI_EVENT as a void
pointer, rendering EFI_EVENT compatible with a pointer to itself and
hence guaranteeing that pointer type bugs will be introduced.

Redefine EFI_EVENT as a pointer to an anonymous structure (as we
already do for EFI_HANDLE) to allow the compiler to perform type
checking as expected.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-07-15 16:51:05 +01:00
parent 1e3fb1b37e
commit 8701863a17
3 changed files with 9 additions and 6 deletions

View File

@@ -39,10 +39,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define EFIAPI __attribute__((cdecl,regparm(0)))
#endif
/* EFI headers define EFI_HANDLE as a void pointer, which renders type
* checking somewhat useless. Work around this bizarre sabotage
* attempt by redefining EFI_HANDLE as a pointer to an anonymous
* structure.
/* EFI headers define EFI_HANDLE and EFI_EVENT as void pointers, which
* renders type checking somewhat useless. Work around this bizarre
* sabotage attempt by redefining both as pointers to anonymous
* structures.
*
* EFI headers perform some ABI validation checks via _Static_assert()
* that may fail when EFI headers are included on a non-EFI platform.
@@ -50,13 +50,16 @@ FILE_LICENCE ( GPL2_OR_LATER );
* included.
*/
#define EFI_HANDLE STUPID_EFI_HANDLE
#define EFI_EVENT STUPID_EFI_EVENT
#ifndef PLATFORM_efi
#define _Static_assert(expr, msg)
#endif
#include <ipxe/efi/Uefi/UefiBaseType.h>
#undef EFI_HANDLE
#undef EFI_EVENT
#undef _Static_assert
typedef struct {} *EFI_HANDLE;
typedef struct {} *EFI_EVENT;
/* Include the top-level EFI header files */
#include <ipxe/efi/Uefi.h>