diff options
Diffstat (limited to 'src/boot.cpp')
-rw-r--r-- | src/boot.cpp | 36 |
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"); +} + |