summaryrefslogtreecommitdiff
path: root/src/boot.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot.c')
-rw-r--r--src/boot.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/boot.c b/src/boot.c
new file mode 100644
index 0000000..4bbe771
--- /dev/null
+++ b/src/boot.c
@@ -0,0 +1,89 @@
+#include "aplos.h"
+
+#define LIMINE_API_REVISION 3
+#include "../external/limine/limine.h"
+
+#define LIMINE(sec) \
+ __attribute__((used, section(sec))) \
+ static volatile
+#define REQUEST LIMINE(".limine_requests")
+
+static void bootmain(void);
+
+REQUEST LIMINE_BASE_REVISION(3)
+
+REQUEST struct limine_framebuffer_request framebuffer_request = {
+ .id = LIMINE_FRAMEBUFFER_REQUEST,
+ .revision = 0
+};
+
+REQUEST struct limine_memmap_request memmap_request = {
+ .id = LIMINE_MEMMAP_REQUEST,
+ .revision = 0
+};
+
+REQUEST struct limine_paging_mode_request paging_request = {
+ .id = LIMINE_PAGING_MODE_REQUEST,
+ .revision = 1,
+ .mode = LIMINE_PAGING_MODE_X86_64_4LVL,
+ .min_mode = LIMINE_PAGING_MODE_X86_64_4LVL,
+ .max_mode = LIMINE_PAGING_MODE_X86_64_4LVL
+};
+
+REQUEST struct limine_mp_request mp_request = {
+ .id = LIMINE_MP_REQUEST,
+ .revision = 0
+};
+
+REQUEST struct limine_entry_point_request entry_point_request = {
+ .id = LIMINE_ENTRY_POINT_REQUEST,
+ .revision = 0,
+ .entry = bootmain
+};
+
+LIMINE(".limine_requests_start") LIMINE_REQUESTS_START_MARKER
+LIMINE(".limine_requests_end") LIMINE_REQUESTS_END_MARKER
+
+uint64_t
+cpu_count(void)
+{
+ return mp_request.response->cpu_count;
+}
+
+static void
+bootmain(void)
+{
+ struct boot_info info;
+
+ ASSERT(LIMINE_BASE_REVISION_SUPPORTED);
+ ASSERT(framebuffer_request.response);
+ ASSERT(memmap_request.response);
+ ASSERT(paging_request.response);
+ ASSERT(mp_request.response);
+
+ ASSERT(framebuffer_request.response->framebuffer_count >= 1);
+
+ struct limine_framebuffer *framebuffer = framebuffer_request.response->framebuffers[0];
+
+ info.framebuffer.addr = framebuffer->address;
+ info.framebuffer.width = framebuffer->width;
+ info.framebuffer.height = framebuffer->height;
+ info.framebuffer.pitch = framebuffer->pitch;
+
+ struct memmap memmaps[memmap_request.response->entry_count];
+ info.memmap_count = 0;
+
+ struct memmap *m = memmaps;
+ for(uint64_t i = 0; i < memmap_request.response->entry_count; i++){
+ struct limine_memmap_entry *e = memmap_request.response->entries[i];
+ if(e->type != LIMINE_MEMMAP_USABLE)
+ continue;
+ m->start = e->base;
+ m->size = e->length;
+ m++;
+ info.memmap_count++;
+ }
+ info.memmaps = memmaps;
+
+ main(&info);
+}