summaryrefslogtreecommitdiffstats
path: root/boot/initrd.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-09-04 11:31:40 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-09-04 11:31:40 -0400
commit8251da342161767fe203627223ccd4a7026701c6 (patch)
treeaf2db0f11b0ea8ad35f88663a855bab39a80f679 /boot/initrd.c
downloadjove-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.c72
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);
+ }
+}