diff options
Diffstat (limited to 'src/user/bootstrap/main.c')
-rw-r--r-- | src/user/bootstrap/main.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/user/bootstrap/main.c b/src/user/bootstrap/main.c new file mode 100644 index 0000000..5f36aa1 --- /dev/null +++ b/src/user/bootstrap/main.c @@ -0,0 +1,36 @@ +#include <shared/flags.h> +#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; + +__attribute__((section(".text.startup"))) +int main(void) { + _syscall_memflag(&_bss_start, &_bss_end - &_bss_start, MEMFLAG_PRESENT); + + /* 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); + } + 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 find init.elf"); + } + _syscall_exit(1); +} |