mirror of
https://github.com/ipxe/ipxe
synced 2025-12-07 18:00:28 +03:00
[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:
@@ -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>
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user