gnu-efi/lib/entry.c
Callum Farmer 74b7b5e92c entry.c: Fix null pointer exception
Signed-off-by: Callum Farmer <gmbr3@opensuse.org>
2023-05-07 16:43:09 +01:00

68 lines
1.6 KiB
C

/*
* ctors.c
* Copyright 2019 Peter Jones <pjones@redhat.com>
*
*/
#include <efi.h>
#include <efilib.h>
/*
* Note that these aren't the using the GNU "CONSTRUCTOR" output section
* command, so they don't start with a size. Because of p2align and the
* end/END definitions, and the fact that they're mergeable, they can also
* have NULLs which aren't guaranteed to be at the end.
*/
extern UINTN __init_array_start, __init_array_end;
extern UINTN __CTOR_LIST__, __CTOR_END__;
extern UINTN __fini_array_start, __fini_array_end;
extern UINTN __DTOR_LIST__, __DTOR_END__;
typedef void (*funcp)(void);
static void ctors(void)
{
for (funcp *location = (void *)&__init_array_start; location < (funcp *)&__init_array_end; location++) {
funcp func = *location;
if (*location != NULL)
func();
}
for (funcp *location = (void *)&__CTOR_END__; location > (funcp *)&__CTOR_LIST__; location--) {
funcp func = *location;
if (*location != NULL)
func();
}
}
static void dtors(void)
{
for (funcp *location = (void *)&__DTOR_LIST__; location < (funcp *)&__DTOR_END__; location++) {
funcp func = *location;
if (*location != NULL)
func();
}
for (funcp *location = (void *)&__fini_array_start; location < (funcp *)&__fini_array_end; location++) {
funcp func = *location;
if (*location != NULL)
func();
}
}
extern EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab);
EFI_STATUS _entry(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
{
EFI_STATUS status;
InitializeLib(image, systab);
ctors();
status = efi_main(image, systab);
dtors();
return status;
}
// vim:fenc=utf-8:tw=75:noet