]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Allow compiler to perform type checks on EFI_EVENT
authorMichael Brown <mcb30@ipxe.org>
Tue, 15 Jul 2025 15:51:05 +0000 (16:51 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 15 Jul 2025 15:57:25 +0000 (16:57 +0100)
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>
src/include/ipxe/efi/efi.h
src/interface/efi/efi_console.c
src/interface/efi/efi_snp.c

index 33278abed979e00c39988cdbfc1c2ece5ad0edc7..9dd26bff00736908f2b14c4c7a50f2852e566044 100644 (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>
index 4557671a0cb0b40f5e0b73f39ba3b6b85ee8ddad..c5a3f24cafb4efc8a898957039aab58c94ba4e63 100644 (file)
@@ -387,7 +387,7 @@ static int efi_iskey ( void ) {
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        EFI_SIMPLE_TEXT_INPUT_PROTOCOL *conin = efi_systab->ConIn;
        EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *conin_ex = efi_conin_ex;
-       EFI_EVENT *event;
+       EFI_EVENT event;
        EFI_STATUS efirc;
 
        /* If we are mid-sequence, we are always ready */
index b9706d5ab4c453c2522f0d423187dc730e9df554..88334c8d0445a9a38d73fed4b633513f5dd9224a 100644 (file)
@@ -175,7 +175,7 @@ static void efi_snp_poll ( struct efi_snp_device *snpdev ) {
        while ( ( iobuf = netdev_rx_dequeue ( snpdev->netdev ) ) ) {
                list_add_tail ( &iobuf->list, &snpdev->rx );
                snpdev->interrupts |= EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT;
-               bs->SignalEvent ( &snpdev->snp.WaitForPacket );
+               bs->SignalEvent ( snpdev->snp.WaitForPacket );
        }
 }