diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-04 11:31:40 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-09-04 11:31:40 -0400 |
| commit | 8251da342161767fe203627223ccd4a7026701c6 (patch) | |
| tree | af2db0f11b0ea8ad35f88663a855bab39a80f679 /boot/initrd.c | |
| download | jove-kernel-8251da342161767fe203627223ccd4a7026701c6.tar.gz jove-kernel-8251da342161767fe203627223ccd4a7026701c6.tar.bz2 jove-kernel-8251da342161767fe203627223ccd4a7026701c6.zip | |
initial commit. working on tasking
Diffstat (limited to 'boot/initrd.c')
| -rw-r--r-- | boot/initrd.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/boot/initrd.c b/boot/initrd.c new file mode 100644 index 0000000..dc16d98 --- /dev/null +++ b/boot/initrd.c @@ -0,0 +1,72 @@ +#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); + } +} |
