From f199eae0154f354c37750c8cd3037f94dbfe70db Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Sat, 26 Jul 2025 16:03:00 +0200 Subject: Initial commit --- src/boot.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/boot.c (limited to 'src/boot.c') 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); +} -- cgit v1.2.3