xref: /DragonStub/lib/entry.c (revision ba150f34d68e8ddea000bbe4cf64300aec5b80bf)
1 /*
2  * ctors.c
3  * Copyright 2019 Peter Jones <pjones@redhat.com>
4  *
5  */
6 
7 #include <efi.h>
8 #include <efilib.h>
9 
10 typedef void (*funcp)(void);
11 
12 /*
13  * Note that these aren't the using the GNU "CONSTRUCTOR" output section
14  * command, so they don't start with a size.  Because of p2align and the
15  * end/END definitions, and the fact that they're mergeable, they can also
16  * have NULLs which aren't guaranteed to be at the end.
17  */
18 extern funcp __init_array_start[], __init_array_end[];
19 extern funcp __CTOR_LIST__[], __CTOR_END__[];
20 extern funcp __fini_array_start[], __fini_array_end[];
21 extern funcp __DTOR_LIST__[], __DTOR_END__[];
22 
23 static void ctors(void)
24 {
25 	size_t __init_array_length = __init_array_end - __init_array_start;
26 	for (size_t i = 0; i < __init_array_length; i++) {
27 		funcp func = __init_array_start[i];
28 		if (func != NULL)
29 			func();
30 	}
31 
32 	size_t __CTOR_length = __CTOR_END__ - __CTOR_LIST__;
33 	for (size_t i = 0; i < __CTOR_length; i++) {
34 		size_t current = __CTOR_length - i - 1;
35 		funcp func = __CTOR_LIST__[current];
36 		if (func != NULL)
37 			func();
38 	}
39 }
40 
41 static void dtors(void)
42 {
43 	size_t __DTOR_length = __DTOR_END__ - __DTOR_LIST__;
44 	for (size_t i = 0; i < __DTOR_length; i++) {
45 		funcp func = __DTOR_LIST__[i];
46 		if (func != NULL)
47 			func();
48 	}
49 
50 	size_t __fini_array_length = __fini_array_end - __fini_array_start;
51 	for (size_t i = 0; i < __fini_array_length; i++) {
52 		size_t current = __fini_array_length - i - 1;
53 		funcp func = __fini_array_start[current];
54 		if (func != NULL)
55 			func();
56 	}
57 }
58 
59 extern EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab);
60 
61 EFI_STATUS _entry(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
62 {
63 	EFI_STATUS status;
64 	InitializeLib(image, systab);
65 
66 	ctors();
67 	status = efi_main(image, systab);
68 	dtors();
69 
70 	return status;
71 }
72 
73 // vim:fenc=utf-8:tw=75:noet
74