#include "initrd.h" #include "init.h" #include "jove.h" #include "lib/printf.h" #include "lib/tar.h" #include "hal/obj.h" #include "hal/memory.h" extern uintptr_t _initrd_module; PAGEALIGN jove_objdir_t s_initrd_objdir = { 0 }; #define CHECK_IF_INITRD(obj) \ if(obj_gettype(obj) != JOVE_OBJ_INITRD_FILE) { \ reterr(EBADOBJ); \ } int initrd_file_name(jove_owned_obj_t *obj, const char **nameptr) { CHECK_IF_INITRD(obj); struct tar_header *file = obj_deref(obj); *nameptr = tar_filename(file); return 0; } int initrd_file_size(jove_owned_obj_t *obj, size_t *sizeptr) { CHECK_IF_INITRD(obj); struct tar_header *file = obj_deref(obj); *sizeptr = tar_filesize(file); return 0; } int initrd_file_data(jove_owned_obj_t *obj, uintptr_t *dataptr) { CHECK_IF_INITRD(obj); union tar_block *file = obj_deref(obj); *dataptr = (uintptr_t)&file[1]; return 0; } void initrd_setup(void) { kprintf("Loading initrd from bootloader:\n"); { jove_owned_obj_t *initrd_objdir_obj = obj_take(objdir_getlocal(_rootdir_obj, ROOTDIR_INITRD_I)); obj_settype(initrd_objdir_obj, JOVE_OBJ_OBJDIR); obj_setvalue(initrd_objdir_obj, (uintmax_t)&s_initrd_objdir); size_t initrd_files = 0; union tar_block *block = phys_tovirt(_initrd_module); for(;;) { struct tar_header *header = &block->header; if(*header->filename == 0) break; size_t file_size = tar_filesize(header); kprintf("File: %s, Size: %i\n", tar_filename(header), file_size); { jove_owned_obj_t *initrd_file_obj = obj_take(objdir_getlocal(initrd_objdir_obj, initrd_files++)); obj_settype(initrd_file_obj, JOVE_OBJ_INITRD_FILE); obj_setvalue(initrd_file_obj, (uintmax_t)block); obj_release(initrd_file_obj); } block = &block[((file_size + 511) / 512) + 1]; } obj_release(initrd_objdir_obj); } }