summaryrefslogtreecommitdiff
path: root/kernel/src/generic/bootloader/limine.cpp
blob: e6a3c8acb3c9970753439a4514be06e34859142d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

#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(6);

}

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_mp_request mp_request = { .id = LIMINE_MP_REQUEST_ID, .revision = 0, .response = nullptr, .flags = 0};

__attribute__((used, section(".limine_requests"))) volatile limine_rsdp_request rsdp_request = { .id = LIMINE_RSDP_REQUEST_ID, .revision = 0, .response = nullptr };

__attribute__((used, section(".limine_requests"))) volatile limine_flanterm_fb_init_params_request flanterm = { .id = LIMINE_FLANTERM_FB_INIT_PARAMS_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;
    }

    limine_mp_response* limine::get_mp_info() {
        return mp_request.response;
    }

    limine_flanterm_fb_init_params_response* limine::get_flanterm() {
        return flanterm.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

};