Support to multi-threading and pthread interface (POSIX.1-2008) (#23)
[lunaix-os.git] / lunaix-os / kernel / lunad.c
diff --git a/lunaix-os/kernel/lunad.c b/lunaix-os/kernel/lunad.c
new file mode 100644 (file)
index 0000000..99cd066
--- /dev/null
@@ -0,0 +1,118 @@
+#include <lunaix/boot_generic.h>
+#include <lunaix/exec.h>
+#include <lunaix/foptions.h>
+#include <lunaix/fs.h>
+#include <lunaix/fs/probe_boot.h>
+#include <lunaix/fs/twifs.h>
+#include <lunaix/spike.h>
+#include <lunaix/syslog.h>
+#include <lunaix/types.h>
+#include <lunaix/owloysius.h>
+#include <lunaix/sched.h>
+#include <lunaix/kpreempt.h>
+
+#include <klibc/string.h>
+
+LOG_MODULE("PROC0")
+
+void
+init_platform();
+
+int
+mount_bootmedium()
+{
+    struct v_dnode* dnode;
+    int errno = 0;
+    struct device* dev = probe_boot_medium();
+    if (!dev) {
+        ERROR("fail to acquire device. (%d)", errno);
+        return 0;
+    }
+
+    if ((errno = vfs_mount("/mnt/lunaix-os", "iso9660", dev, 0))) {
+        ERROR("fail to mount boot medium. (%d)", errno);
+        return 0;
+    }
+
+    return 1;
+}
+
+int
+exec_initd()
+{
+    int errno = 0;
+
+    if ((errno = exec_kexecve("/mnt/lunaix-os/usr/bin/init", NULL, NULL))) {
+        goto fail;
+    }
+
+    fail("should not reach");
+
+fail:
+    ERROR("fail to load initd. (%d)", errno);
+    return 0;
+}
+
+static void
+lunad_do_usr() {
+    // No, these are not preemptive
+    cpu_disable_interrupt();
+    
+    if (!mount_bootmedium() || !exec_initd()) {
+        fail("failed to initd");
+    }
+}
+
+/**
+ * @brief LunaixOS的内核进程,该进程永远为可执行。
+ *
+ * 这主要是为了保证调度器在没有进程可调度时依然有事可做。
+ *
+ * 同时,该进程也负责fork出我们的init进程。
+ *
+ */
+void _preemptible
+lunad_main()
+{
+    /*
+     * We must defer boot code/data cleaning to here, after we successfully
+     * escape that area
+     */
+    boot_cleanup();
+
+    spawn_kthread((ptr_t)init_platform);
+
+    /*
+        NOTE Kernel preemption after this point.
+
+        More specifically, it is not a real kernel preemption (as in preemption
+        happened at any point of kernel, except those marked explicitly).
+        In Lunaix, things are designed in an non-preemptive fashion, we implement 
+        kernel preemption the other way around: only selected kernel functions which,
+        of course, with great care of preemptive assumption, will goes into kernel 
+        thread (which is preemptive!)
+    */
+
+    cpu_enable_interrupt();
+    while (1)
+    {
+        cleanup_detached_threads();
+        sched_pass();
+    }
+}
+
+void
+init_platform()
+{
+    device_postboot_load();
+    invoke_init_function(on_postboot);
+
+    twifs_register_plugins();
+
+    // FIXME Re-design needed!!
+    // sdbg_init();
+    
+    assert(!spawn_process(NULL, (ptr_t)lunad_do_usr, true));
+
+    exit_thread(NULL);
+}
\ No newline at end of file