aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/boot
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/boot')
-rw-r--r--arch/x86_64/src/boot/crti.s13
-rw-r--r--arch/x86_64/src/boot/crtn.s9
-rw-r--r--arch/x86_64/src/boot/entry64.s4
-rw-r--r--arch/x86_64/src/boot/initialize_runtime.cpp24
4 files changed, 26 insertions, 24 deletions
diff --git a/arch/x86_64/src/boot/crti.s b/arch/x86_64/src/boot/crti.s
deleted file mode 100644
index 26878fe..0000000
--- a/arch/x86_64/src/boot/crti.s
+++ /dev/null
@@ -1,13 +0,0 @@
-.code64
-
-.section .init
-.global _init
-_init:
- push %rbp
- movq %rsp, %rbp
-
-.section .fini
-.global _fini
-_fini:
- push %rbp
- movq %rsp, %rbp
diff --git a/arch/x86_64/src/boot/crtn.s b/arch/x86_64/src/boot/crtn.s
deleted file mode 100644
index 06fb7ce..0000000
--- a/arch/x86_64/src/boot/crtn.s
+++ /dev/null
@@ -1,9 +0,0 @@
-.code64
-
-.section .init
- popq %rbp
- ret
-
-.section .fini
- popq %rbp
- ret
diff --git a/arch/x86_64/src/boot/entry64.s b/arch/x86_64/src/boot/entry64.s
index f575c50..110ced8 100644
--- a/arch/x86_64/src/boot/entry64.s
+++ b/arch/x86_64/src/boot/entry64.s
@@ -12,8 +12,8 @@ _entry64:
xor %rax, %rax
- call _init
-
+ call invoke_global_constructors
+
call main
1:
diff --git a/arch/x86_64/src/boot/initialize_runtime.cpp b/arch/x86_64/src/boot/initialize_runtime.cpp
new file mode 100644
index 0000000..9a3df0e
--- /dev/null
+++ b/arch/x86_64/src/boot/initialize_runtime.cpp
@@ -0,0 +1,24 @@
+#include <algorithm>
+#include <functional>
+#include <span>
+
+extern "C"
+{
+ using global_initializer = auto (*)() -> void;
+
+ extern global_initializer __ctors_start;
+ extern global_initializer __ctors_end;
+ extern global_initializer __init_array_start;
+ extern global_initializer __init_array_end;
+
+ auto invoke_global_constructors() -> void
+ {
+ auto constructors = std::span{&__ctors_start, &__ctors_end};
+ auto initializers = std::span{&__init_array_start, &__init_array_end};
+
+ auto apply_invoke = [](auto invokable) { return std::invoke(invokable); };
+
+ std::ranges::for_each(constructors, apply_invoke);
+ std::ranges::for_each(initializers, apply_invoke);
+ }
+}