summaryrefslogtreecommitdiff
path: root/kernel/entry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/entry.cpp')
-rw-r--r--kernel/entry.cpp230
1 files changed, 0 insertions, 230 deletions
diff --git a/kernel/entry.cpp b/kernel/entry.cpp
deleted file mode 100644
index cc74e69..0000000
--- a/kernel/entry.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-#include <hilbert/kernel/storage/bd/memory.hpp>
-#include <hilbert/kernel/storage/fs/tarfs.hpp>
-#include <hilbert/kernel/application.hpp>
-#include <hilbert/kernel/framebuffer.hpp>
-#include <hilbert/kernel/terminal.hpp>
-#include <hilbert/kernel/paging.hpp>
-#include <hilbert/kernel/input.hpp>
-#include <hilbert/kernel/panic.hpp>
-#include <hilbert/kernel/vfile.hpp>
-#include "../limine/limine.h"
-
-using namespace hilbert::kernel;
-
-LIMINE_BASE_REVISION(1)
-
-static volatile limine_memmap_request memmap_request {
- .id = LIMINE_MEMMAP_REQUEST,
- .revision = 0,
- .response = 0
-};
-
-static volatile limine_kernel_address_request kernel_address_request {
- .id = LIMINE_KERNEL_ADDRESS_REQUEST,
- .revision = 0,
- .response = 0
-};
-
-static volatile limine_framebuffer_request framebuffer_request {
- .id = LIMINE_FRAMEBUFFER_REQUEST,
- .revision = 0,
- .response = 0
-};
-
-static volatile limine_hhdm_request hhdm_request {
- .id = LIMINE_HHDM_REQUEST,
- .revision = 0,
- .response = 0
-};
-
-static limine_internal_module initfs_module = {
- .path = "initfs.tgz",
- .cmdline = "initfs",
- .flags = LIMINE_INTERNAL_MODULE_REQUIRED | LIMINE_INTERNAL_MODULE_COMPRESSED
-};
-
-static limine_internal_module termfont_module = {
- .path = "termfont.psf",
- .cmdline = "termfont",
- .flags = LIMINE_INTERNAL_MODULE_REQUIRED
-};
-
-static limine_internal_module *internal_modules[] = {
- &initfs_module, &termfont_module
-};
-
-static volatile limine_module_request module_request = {
- .id = LIMINE_MODULE_REQUEST,
- .revision = 2,
- .response = 0,
- .internal_module_count = 2,
- .internal_modules = internal_modules
-};
-
-bool try_map_module_by_cmdline(
- const char *cmdline, void *&vaddr_out, uint64_t &len_out
-) {
- auto response = module_request.response;
- for (uint64_t i = 0; i < response->module_count; ++i) {
- limine_file *file = response->modules[i];
- for (uint64_t j = 0; cmdline[j] == file->cmdline[j]; ++j)
- if (!cmdline[j]) {
-
- //module start is guaranteed to be page-aligned, end is not.
- uint64_t start_paddr =
- (uint64_t)file->address - hhdm_request.response->offset;
- uint64_t end_paddr =
- ((start_paddr + file->size - 1) / 4096 + 1) * 4096;
-
- uint64_t start_vaddr =
- paging::find_unmapped_vram_region((end_paddr - start_paddr) / 4096);
- for (uint64_t i = 0; i < end_paddr - start_paddr; i += 4096)
- paging::map_kernel_page(
- start_paddr + i, start_vaddr + i, true, false);
-
- vaddr_out = (void *)start_vaddr;
- len_out = file->size;
-
- return true;
- }
- }
- return false;
-}
-
-//defined in linker script, page-aligned:
-extern uint8_t __kernel_start;
-extern uint8_t __kernel_end;
-extern uint8_t __kernel_rx_start;
-extern uint8_t __kernel_rx_end;
-extern uint8_t __kernel_ro_start;
-extern uint8_t __kernel_ro_end;
-extern uint8_t __kernel_rw_start;
-extern uint8_t __kernel_rw_end;
-
-uint8_t *initfs;
-uint64_t initfs_len;
-
-[[noreturn]] static void with_kernel_p4();
-
-extern "C" void load_gdt_and_idt();
-
-extern "C" [[noreturn]] void entry() {
-
- //TODO?: maybe we should check if the limine requests were
- // fulfilled and display some error message if not
-
- //set up the physical memory usage bitmap:
-
- paging::mark_all_pram_used();
- auto memmap = memmap_request.response;
- for (uint64_t i = 0; i < memmap->entry_count; ++i) {
- //we don't allocate any physical pages until after we are done using limine
- //structures (specifically at the call to paging::map_kernel_stacks), so
- //we consider bootloader reclaimable to be free. usable and bootloader
- //reclaimable are guaranteed by limine spec to be page-aligned.
- auto entry = memmap->entries[i];
- if (entry->type == LIMINE_MEMMAP_USABLE ||
- entry->type == LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE)
- paging::mark_pram_region_free(entry->base, entry->base + entry->length);
- }
-
- //set up page mappings:
-
- auto kernel_address = kernel_address_request.response;
- uint64_t kernel_offset = kernel_address->virtual_base
- - kernel_address->physical_base;
-
- uint64_t hhdm = hhdm_request.response->offset;
-
- //framebuffer might not be page-aligned
- auto framebuffer = framebuffer_request.response->framebuffers[0];
- uint64_t fb_start = ((uint64_t)framebuffer->address / 4096) * 4096 - hhdm;
- uint64_t fb_end = (uint64_t)framebuffer->address
- + framebuffer->pitch * framebuffer->height - hhdm;
- fb_end = ((fb_end - 1) / 4096 + 1) * 4096;
-
- paging::init_kernel_page_tables(kernel_offset);
-
- //kernel image rx
- for (uint64_t vaddr = (uint64_t)&__kernel_rx_start;
- vaddr < (uint64_t)&__kernel_rx_end; vaddr += 4096)
- paging::map_kernel_page(vaddr - kernel_offset, vaddr, false, true);
-
- //kernel image ro
- for (uint64_t vaddr = (uint64_t)&__kernel_ro_start;
- vaddr < (uint64_t)&__kernel_ro_end; vaddr += 4096)
- paging::map_kernel_page(vaddr - kernel_offset, vaddr, false, false);
-
- //kernel image rw
- for (uint64_t vaddr = (uint64_t)&__kernel_rw_start;
- vaddr < (uint64_t)&__kernel_rw_end; vaddr += 4096)
- paging::map_kernel_page(vaddr - kernel_offset, vaddr, true, false);
-
- //framebuffer
- uint64_t fb_vaddr =
- paging::find_unmapped_vram_region((fb_end - fb_start) / 4096);
- for (uint64_t i = 0; i < fb_end - fb_start; i += 4096)
- paging::map_kernel_page(fb_start + i, fb_vaddr + i, true, false);
-
- //initfs and termfont - these are required modules
- //so there is no worry about them not being present.
- try_map_module_by_cmdline("initfs", (void *&)initfs, initfs_len);
- try_map_module_by_cmdline(
- "termfont", (void *&)terminal::termfont, terminal::termfont_len);
-
- //set up framebuffer and terminal:
- //TODO: assumes framebuffer is 32-bpp rgb
-
- framebuffer::init_framebuffer(fb_start, fb_vaddr,
- framebuffer->width, framebuffer->height, framebuffer->pitch);
-
- //switch to kernel p4
-
- paging::map_kernel_stacks();
- load_gdt_and_idt();
- switch_to_kernel_p4(&with_kernel_p4);
-
-}
-
-extern "C" [[noreturn]] void start_user_mode(
- uint64_t rip, uint64_t rsp, uint64_t p4_paddr);
-
-[[noreturn]] static void with_kernel_p4() {
-
- terminal::init_terminal();
-
- auto *initfs_bd = new storage::bd::memory(initfs, initfs_len);
- auto *initfs_fs = new storage::fs::tarfs_instance(initfs_bd);
- initfs_bd->mounted_as = initfs_fs;
-
- vfile::vfile initfs_root;
- initfs_root.bd = initfs_bd;
- initfs_root.dir_entry.type = storage::file_type::directory;
- initfs_root.path.absolute = true;
-
- if (initfs_fs->get_root_node(initfs_root.dir_entry.node) !=
- storage::fs_result::success)
- panic("failed to get root node of initfs.");
-
- vfile::set_root(initfs_root);
-
- input::init_input();
-
- utility::string init_path_string("/bin/init.elf", 13);
- vfile::canon_path init_path;
- vfile::canonize_path(init_path_string, init_path);
-
- vfile::vfile init_file;
- if (vfile::lookup_path(init_path, init_file, true) !=
- storage::fs_result::success)
- panic("failed to look up /bin/init.elf.");
-
- application::app_instance *init;
- if (application::create_app(init_file, init, initfs_root) !=
- application::create_app_result::success)
- panic("failed to parse /bin/init.elf.");
-
- application::running_app = init;
- start_user_mode(init->saved_regs.rip, init->saved_regs.rsp, init->p4_paddr);
-
-}