summaryrefslogtreecommitdiff
path: root/kernel/src/generic/bootloader
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/generic/bootloader')
-rw-r--r--kernel/src/generic/bootloader/bootloader.cpp10
-rw-r--r--kernel/src/generic/bootloader/bootloader.hpp20
-rw-r--r--kernel/src/generic/bootloader/limine.cpp87
-rw-r--r--kernel/src/generic/bootloader/limine.hpp15
4 files changed, 132 insertions, 0 deletions
diff --git a/kernel/src/generic/bootloader/bootloader.cpp b/kernel/src/generic/bootloader/bootloader.cpp
new file mode 100644
index 0000000..a51035d
--- /dev/null
+++ b/kernel/src/generic/bootloader/bootloader.cpp
@@ -0,0 +1,10 @@
+
+#include <cstdint>
+#include <generic/bootloader/limine.hpp>
+#include <generic/bootloader/bootloader.hpp>
+
+bootloader::limine limine_bootloader;
+
+void bootloader::init() {
+ bootloader::bootloader = &limine_bootloader;
+} \ No newline at end of file
diff --git a/kernel/src/generic/bootloader/bootloader.hpp b/kernel/src/generic/bootloader/bootloader.hpp
new file mode 100644
index 0000000..21aa650
--- /dev/null
+++ b/kernel/src/generic/bootloader/bootloader.hpp
@@ -0,0 +1,20 @@
+#pragma once
+#include <cstdint>
+#include <limine.h>
+
+namespace bootloader {
+
+ class bootloader_generic {
+ public:
+ virtual limine_framebuffer* get_framebuffer() = 0;
+ virtual std::uintptr_t get_hhdm() = 0;
+ virtual void* get_rsdp() = 0;
+ virtual std::uint64_t get_kernel_phys() = 0;
+ virtual std::uintptr_t get_kernel_virt() = 0;
+ virtual limine_memmap_response* get_memory_map() = 0;
+ virtual bool is_5_level_paging() = 0;
+ };
+
+ void init();
+ inline bootloader_generic* bootloader = nullptr;
+} \ No newline at end of file
diff --git a/kernel/src/generic/bootloader/limine.cpp b/kernel/src/generic/bootloader/limine.cpp
new file mode 100644
index 0000000..e7175a4
--- /dev/null
+++ b/kernel/src/generic/bootloader/limine.cpp
@@ -0,0 +1,87 @@
+
+#include <generic/bootloader/bootloader.hpp>
+#include <generic/bootloader/limine.hpp>
+#include <limine.h>
+
+namespace {
+
+__attribute__((used, section(".limine_requests")))
+volatile std::uint64_t limine_base_revision[] = LIMINE_BASE_REVISION(5);
+
+}
+
+namespace {
+
+__attribute__((used, section(".limine_requests")))
+volatile limine_framebuffer_request framebuffer_request = {
+ .id = LIMINE_FRAMEBUFFER_REQUEST_ID,
+ .revision = 0,
+ .response = nullptr
+};
+
+__attribute__((used, section(".limine_requests"))) volatile limine_memmap_request memmap_request = { .id = LIMINE_MEMMAP_REQUEST_ID, .revision = 0, .response = nullptr };
+
+
+__attribute__((used, section(".limine_requests"))) volatile limine_hhdm_request hhdm_request = { .id = LIMINE_HHDM_REQUEST_ID, .revision = 0, .response = nullptr };
+
+
+__attribute__((used, section(".limine_requests"))) volatile limine_executable_address_request kaddr_request = { .id = LIMINE_EXECUTABLE_ADDRESS_REQUEST_ID, .revision = 0, .response = nullptr };
+
+
+__attribute__((used, section(".limine_requests"))) volatile limine_rsdp_request rsdp_request = { .id = LIMINE_RSDP_REQUEST_ID, .revision = 0, .response = nullptr };
+
+#if defined(__x86_64__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+ [[gnu::used]] [[gnu::section(".limine_requests")]] volatile limine_paging_mode_request _5lvl_paging = { .id = LIMINE_PAGING_MODE_REQUEST_ID,.revision = 0,.response = nullptr,.mode = LIMINE_PAGING_MODE_X86_64_5LVL,.max_mode = LIMINE_PAGING_MODE_AARCH64_5LVL,.min_mode = LIMINE_PAGING_MODE_AARCH64_4LVL };
+#pragma GCC diagnostic pop
+#endif
+}
+
+namespace {
+
+__attribute__((used, section(".limine_requests_start")))
+volatile std::uint64_t limine_requests_start_marker[] = LIMINE_REQUESTS_START_MARKER;
+
+__attribute__((used, section(".limine_requests_end")))
+volatile std::uint64_t limine_requests_end_marker[] = LIMINE_REQUESTS_END_MARKER;
+
+}
+
+namespace bootloader {
+
+ std::uintptr_t limine::get_hhdm() {
+ return hhdm_request.response->offset;
+ }
+
+ limine_framebuffer* limine::get_framebuffer() {
+ return framebuffer_request.response->framebuffers[0];
+ }
+
+ void* limine::get_rsdp() {
+ return rsdp_request.response->address;
+ }
+
+ std::uint64_t limine::get_kernel_phys() {
+ return kaddr_request.response->physical_base;
+ }
+
+ std::uint64_t limine::get_kernel_virt() {
+ return kaddr_request.response->virtual_base;
+ }
+
+ limine_memmap_response* limine::get_memory_map() {
+ return memmap_request.response;
+ }
+
+#if defined(__x86_64__)
+ bool limine::is_5_level_paging() {
+ return _5lvl_paging.response->mode == LIMINE_PAGING_MODE_X86_64_5LVL ? true : false;
+ }
+#else
+ bool limine::is_5_level_paging() {
+ return false;
+ }
+#endif
+
+}; \ No newline at end of file
diff --git a/kernel/src/generic/bootloader/limine.hpp b/kernel/src/generic/bootloader/limine.hpp
new file mode 100644
index 0000000..c0fd78b
--- /dev/null
+++ b/kernel/src/generic/bootloader/limine.hpp
@@ -0,0 +1,15 @@
+
+#include <generic/bootloader/bootloader.hpp>
+
+namespace bootloader {
+ class limine final : public bootloader_generic {
+public:
+ limine_framebuffer* get_framebuffer() override;
+ std::uintptr_t get_hhdm() override;
+ void* get_rsdp() override;
+ std::uint64_t get_kernel_phys() override;
+ std::uint64_t get_kernel_virt() override;
+ limine_memmap_response* get_memory_map() override;
+ bool is_5_level_paging() override;
+ };
+}; \ No newline at end of file