74b7b5e92c
Signed-off-by: Callum Farmer <gmbr3@opensuse.org>
68 lines
1.6 KiB
C
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
|