summaryrefslogtreecommitdiff
path: root/src/bootstrap/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/main.c')
-rw-r--r--src/bootstrap/main.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
new file mode 100644
index 0000000..d27da39
--- /dev/null
+++ b/src/bootstrap/main.c
@@ -0,0 +1,43 @@
+#include <_proc.h>
+#include <camellia/flags.h>
+#include <camellia/syscalls.h>
+#include <stdio.h>
+#include <string.h>
+#include <elfload.h>
+#include <camellia/fs/misc.h>
+
+#include "tar.h"
+
+extern char _bss_start;
+extern char _bss_end;
+extern char _initrd;
+
+__attribute__((section(".text")))
+int main(void) {
+ _sys_memflag(_psdata_loc, 1, MEMFLAG_PRESENT);
+ setprogname("bootstrap");
+
+ _sys_mount(HANDLE_PROCFS, "/proc/", strlen("/proc/"));
+ MOUNT_AT("/") {
+ fs_dirinject2((const char*[]) {
+ "/proc/",
+ "/init/",
+ NULL
+ });
+ }
+ MOUNT_AT("/init/") {
+ tar_driver(&_initrd);
+ }
+
+ const char *initpath = "bin/amd64/init";
+ char *initargv[] = {"init", NULL};
+ void *init = tar_find(initpath, strlen(initpath), &_initrd, ~0) + 512;
+ if (init) {
+ _klogf("execing init");
+ elf_exec(init, initargv, NULL);
+ _klogf("elf_exec failed");
+ } else {
+ _klogf("couldn't find init.elf");
+ }
+ _sys_exit(1);
+}