diff options
Diffstat (limited to 'kernel/src/generic/bootloader')
| -rw-r--r-- | kernel/src/generic/bootloader/bootloader.cpp | 10 | ||||
| -rw-r--r-- | kernel/src/generic/bootloader/bootloader.hpp | 20 | ||||
| -rw-r--r-- | kernel/src/generic/bootloader/limine.cpp | 87 | ||||
| -rw-r--r-- | kernel/src/generic/bootloader/limine.hpp | 15 |
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 |
