diff options
Diffstat (limited to 'boot/limine')
| -rw-r--r-- | boot/limine/framebuffer.c | 82 | ||||
| -rw-r--r-- | boot/limine/memorymap.c | 11 | ||||
| -rw-r--r-- | boot/limine/modules.c | 64 | ||||
| -rw-r--r-- | boot/limine/start.c | 8 |
4 files changed, 74 insertions, 91 deletions
diff --git a/boot/limine/framebuffer.c b/boot/limine/framebuffer.c deleted file mode 100644 index a7ee04c..0000000 --- a/boot/limine/framebuffer.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "arch/x86_64/hal/obj.h" -#include "jove.h" -#include "lib/printf.h" -#include "limine.h" -#include "proc/init.h" -#include "sys/objdir.h" -#include "hal/framebuffer.h" - -extern struct limine_framebuffer_response *_limine_framebuffers; - -#define CHECK_IF_FB(obj) \ - if(obj_gettype(obj) != JOVE_OBJ_FRAMEBUFFER) { \ - reterr(EBADOBJ); \ - } - -size_t -fb_width(jove_owned_obj_t *obj) -{ - CHECK_IF_FB(obj); - struct limine_framebuffer *fb = obj_deref(obj); - return fb->width; -} - -size_t -fb_height(jove_owned_obj_t *obj) -{ - CHECK_IF_FB(obj); - struct limine_framebuffer *fb = obj_deref(obj); - return fb->height; -} - -int -fb_blit(jove_owned_obj_t *obj, - uint32_t *data, - size_t x, size_t y, - size_t width, size_t height) -{ - CHECK_IF_FB(obj); - struct limine_framebuffer *fb = obj_deref(obj); - - uint32_t *fb_address = fb->address; - for(size_t oline = 0; oline < height; oline++) { - size_t line = oline + y; - uint32_t *line_data = &data[oline * width]; - for(size_t ocol = 0; ocol < width; ocol++) { - size_t col = ocol + x; - fb_address[line * (fb->pitch >> 2) + col] = line_data[ocol]; - } - } - return 0; -} - -void -fb_init() -{ - if(_limine_framebuffers->framebuffer_count == 0) { - return; - } - struct limine_framebuffer *fb = _limine_framebuffers->framebuffers[0]; - size_t fb_bytes = fb->width * fb->height * (fb->bpp / 8); - void *fb_virt = fb_remap((uintptr_t)fb->address, fb_bytes); - - //void *fb_virt = fb->address; - if(fb_virt == NULL) { - kprintf("Unable to remap framebuffer.\n"); - return; - } - - kprintf("framebuffer: phys address %p\n", (uintptr_t)fb->address); - kprintf("framebuffer: virt address %p\n", fb_virt); - kprintf("framebuffer: width %ipx\n", fb->width); - kprintf("framebuffer: height %ipx\n", fb->height); - kprintf("framebuffer: %i bpp\n", fb->bpp); - - fb->address = fb_virt; - { - jove_owned_obj_t *fb_obj = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_FRAMEBUFFER_I); - obj_settype(fb_obj, JOVE_OBJ_FRAMEBUFFER); - obj_setvalue(fb_obj, (uintptr_t)fb); - obj_release(fb_obj); - } -} diff --git a/boot/limine/memorymap.c b/boot/limine/memorymap.c index c558e75..7ce1da8 100644 --- a/boot/limine/memorymap.c +++ b/boot/limine/memorymap.c @@ -66,10 +66,11 @@ mem_setup_regions(void) region_new(region_obj, entry->base, entry->length / 0x1000); obj_release(region_obj); } - } - if(entry->type == LIMINE_MEMMAP_RESERVED | - entry->type == LIMINE_MEMMAP_ACPI_NVS | - entry->type == LIMINE_MEMMAP_ACPI_TABLES) + }else + if(entry->type == LIMINE_MEMMAP_RESERVED || + entry->type == LIMINE_MEMMAP_ACPI_NVS || + entry->type == LIMINE_MEMMAP_ACPI_TABLES || + entry->type == LIMINE_MEMMAP_FRAMEBUFFER) { intmax_t hw_pages = entry->length >> 12; uintptr_t base = entry->base; @@ -90,6 +91,8 @@ mem_setup_regions(void) hw_pages -= 4096; base += (4096ULL << 12); } + }else{ + klogf("Kmem %p : %p %s\n", entry->base, entry->length, limine_mmap_entry_type_str[entry->type]); } } } diff --git a/boot/limine/modules.c b/boot/limine/modules.c new file mode 100644 index 0000000..669883e --- /dev/null +++ b/boot/limine/modules.c @@ -0,0 +1,64 @@ +#include "boot/boot.h" +#include "limine.h" +#include "hal/obj.h" +#include "hal/memory.h" +#include "lib/printf.h" +#include "lib/string.h" +#include "proc/init.h" +#include "panic/panic.h" + +static jove_objdir_t s_kmodules_objdir; +extern struct limine_module_response *_limine_module_resp; + +static struct kernel_module s_modules[BOOT_MAX_MODULES]; + +jove_owned_obj_t* +boot_getmodule(const char *key) { + for(size_t i = 0; i < BOOT_MAX_MODULES; i++) { + if(strncmp(s_modules[i].path, key, 128) == 0) + return obj_take(s_modules[i].shmem); + } + errno = ENOTFOUND; + return NULL; +} + +void +mem_setup_modules(void) +{ + jove_owned_obj_t *modules_objdir = objdir_getlocal(_rootdir_obj, INIT_ROOTDIR_MODULES_I); + obj_settype(modules_objdir, JOVE_OBJ_OBJDIR); + obj_setvalue(modules_objdir, (uintptr_t)&s_kmodules_objdir); + jove_obj_t *modules_objdir_obj = obj_release(modules_objdir); + + if(_limine_module_resp == NULL) { + kpanic("Limine failed to provide modules.\n"); + } + + kprintf("%s: Modules provided by Limine:\n", __func__); + for(size_t i = 0; i < _limine_module_resp->module_count; i++) { + struct limine_file *module = _limine_module_resp->modules[i]; + if(i >= BOOT_MAX_MODULES) { + klogf("Maximum number of modules exceeded (%i). Some modules will be inaccessable\n", BOOT_MAX_MODULES); + return; + } + + klogf("%p File %s at %p size %x\n", module, module->path, module->address, module->size); + + physaddr_t module_base = phys_fromvirt((virtaddr_t)module->address); + size_t module_pages = (module->size + 0xFFF) / 0x1000; + if(module_pages > SHMEMORY_MAX_PAGES) { + klogf("Module exceeds length maximum (%i vs %i). Some data will be non-addressable\n", + module_pages, SHMEMORY_MAX_PAGES); + module_pages = 0xFFF; + } + + jove_owned_obj_t *module_shmem = objdir_getlocal(modules_objdir_obj, i); + obj_settype(module_shmem, JOVE_OBJ_SHMEMORY); + obj_setvalue(module_shmem, module_base | module_pages); + + s_modules[i] = (struct kernel_module) { + .shmem = obj_release(module_shmem) + }; + strncpy(128, s_modules[i].path, module->path); + } +} diff --git a/boot/limine/start.c b/boot/limine/start.c index 803c1de..17016ce 100644 --- a/boot/limine/start.c +++ b/boot/limine/start.c @@ -2,7 +2,7 @@ #include <stddef.h> #include "api/init.h" -#include "boot/cmdline.h" +#include "boot/boot.h" #include "limine.h" void _start(void); @@ -65,6 +65,7 @@ void *_kernel_physptr = NULL; void *_initrd_module = NULL; struct limine_framebuffer_response *_limine_framebuffers; struct limine_memmap_response *_limine_memmap_resp = NULL; +struct limine_module_response *_limine_module_resp = NULL; __attribute__((noreturn)) void @@ -72,14 +73,11 @@ _start(void) { _kernel_physptr = (void*)executable_address_req.response->physical_base; _limine_memmap_resp = memmap_req.response; + _limine_module_resp = module_req.response; _limine_framebuffers = framebuffer_request.response; extern struct init_payload _init_payload; _init_payload.rsdp = (void*)((uintptr_t)rsdp_request.response->address & 0xFFFFFFFF); - - if(module_req.response->module_count > 0) { - _initrd_module = module_req.response->modules[0]->address; - } cmdline_init(cmdline_req.response->cmdline); |
