summaryrefslogtreecommitdiff
path: root/kernel/src/generic/bootloader/limine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/generic/bootloader/limine.cpp')
-rw-r--r--kernel/src/generic/bootloader/limine.cpp87
1 files changed, 87 insertions, 0 deletions
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