diff options
Diffstat (limited to 'src/user_bootstrap/main.c')
-rw-r--r-- | src/user_bootstrap/main.c | 63 |
1 files changed, 19 insertions, 44 deletions
diff --git a/src/user_bootstrap/main.c b/src/user_bootstrap/main.c index 8fed3ce..5f36aa1 100644 --- a/src/user_bootstrap/main.c +++ b/src/user_bootstrap/main.c @@ -2,60 +2,35 @@ #include <shared/mem.h> #include <shared/syscalls.h> #include <user/lib/elfload.h> +#include <user/lib/fs/misc.h> + +#include "tar.h" extern char _bss_start; extern char _bss_end; extern char _initrd; -static void *tar_find(void *tar, const char *path); -static int oct_parse(char *str, size_t len); - -static void *tar_find(void *tar, const char *path) { - size_t path_len = strlen(path); - int size; - if (path_len > 100) return NULL; - - for (size_t off = 0;;) { - if (0 != memcmp(tar + off + 257, "ustar", 5)) - return NULL; // not a metadata sector, end of archive - - _klogf("%s", tar + off); - size = oct_parse(tar + off + 124, 11); - if (0 == memcmp(tar + off, path, path_len) && - *(char*)(tar + off + path_len) == '\0') - { - return tar + off + 512; - } - off += 512; - off += (size + 511) & ~511; - } -} - -static int oct_parse(char *str, size_t len) { - int res = 0; - for (size_t i = 0; i < len; i++) { - res *= 8; - res += str[i] - '0'; // no format checking - } - return res; -} - - __attribute__((section(".text.startup"))) int main(void) { _syscall_memflag(&_bss_start, &_bss_end - &_bss_start, MEMFLAG_PRESENT); - void *init = tar_find(&_initrd, "init.elf"); - if (!init) { - _klogf("couldn't find init.elf\n"); - _syscall_exit(0); + /* move everything provided by the kernel to /kdev */ + MOUNT("/kdev/", fs_passthru(NULL)); + if (!fork2_n_mount("/")) { + const char *l[] = {"/kdev/", NULL}; + fs_whitelist(l); } - void (*entry)(void*) = elf_partialexec(init); - if (entry) { - // TODO dynamically link initrd - entry(&_initrd); + if (!fork2_n_mount("/")) fs_dir_inject("/kdev/"); // TODO should be part of fs_whitelist + + MOUNT("/init/", tar_driver(&_initrd)); + + void *init = tar_find("init.elf", 8, &_initrd, ~0) + 512; + if (init) { + _klogf("execing init.elf"); + elf_exec(init); + _klogf("elf_exec failed"); } else { - _klogf("couldn't execute init.elf\n"); + _klogf("couldn't find init.elf"); } - _syscall_exit(0); + _syscall_exit(1); } |