aboutsummaryrefslogtreecommitdiffstats
path: root/src/boot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot.cpp')
-rw-r--r--src/boot.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/boot.cpp b/src/boot.cpp
new file mode 100644
index 0000000..6b1da6a
--- /dev/null
+++ b/src/boot.cpp
@@ -0,0 +1,36 @@
+#include <array>
+#include <cstdint>
+#include <span>
+
+extern void (*__init_array_start)();
+extern void (*__init_array_end)();
+extern void kernel_main();
+
+alignas(16)
+static std::array<std::uint8_t, 16384> stack;
+
+static void init_array()
+{
+ std::span initArray (&__init_array_start, &__init_array_end);
+ for (auto& fn : initArray)
+ fn();
+}
+
+extern "C"
+__attribute__((naked))
+void _start()
+{
+ asm volatile(R"(
+ mov %%eax, multiboot_magic
+ mov %%ebx, multiboot_ptr
+ mov %0, %%esp
+ )" :: "i" (stack.data() + stack.size()));
+
+ init_array();
+ kernel_main();
+
+ asm volatile("cli");
+ for (;;)
+ asm volatile("hlt");
+}
+