summaryrefslogtreecommitdiff
path: root/sys/kern/init_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/init_main.c')
-rw-r--r--sys/kern/init_main.c61
1 files changed, 49 insertions, 12 deletions
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index f1d0bf1..6b3e09b 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team.
+ * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,27 +35,47 @@
#include <sys/exec.h>
#include <sys/driver.h>
#include <sys/panic.h>
+#include <sys/systm.h>
+#include <dev/acpi/uacpi.h>
#include <dev/cons/cons.h>
#include <dev/acpi/acpi.h>
#include <machine/cpu.h>
+#include <machine/cdefs.h>
#include <vm/vm.h>
#include <string.h>
-static struct proc proc0;
+#define _START_PATH "/usr/sbin/init"
+#if defined(_INSTALL_MEDIA)
+#define _START_ARG "/usr/sbin/install"
+#else
+#define _START_ARG NULL
+#endif /* _INSTALL_MEDIA */
+
+struct proc g_proc0;
+
+static void
+copyright(void)
+{
+ kprintf(OMIT_TIMESTAMP
+ "Copyright (c) 2023-2025 Ian Marco Moffett and the OSMORA team\n");
+}
static void
start_init(void)
{
struct proc *td = this_td();
struct execve_args execve_args;
- char *argv[] = { "/usr/sbin/init", NULL };
+ char *argv[] = { _START_PATH, _START_ARG, NULL };
char *envp[] = { NULL };
+ kprintf("starting init...\n");
execve_args.pathname = argv[0];
execve_args.argv = argv;
execve_args.envp = envp;
if (execve(td, &execve_args) != 0)
- panic("Failed to load init\n");
+ panic("failed to load init\n");
+
+ __builtin_unreachable();
}
int
@@ -64,14 +84,15 @@ main(void)
/* Setup serial driver */
serial_init();
+ /* Init the virtual memory subsystem */
+ vm_init();
+
/* Startup the console */
cons_init();
+ copyright();
kprintf("Starting Hyra/%s v%s: %s\n", HYRA_ARCH, HYRA_VERSION,
HYRA_BUILDDATE);
- /* Init the virtual memory subsystem */
- vm_init();
-
/* Start the ACPI subsystem */
acpi_init();
@@ -81,16 +102,32 @@ main(void)
/* Init the virtual file system */
vfs_init();
- DRIVERS_INIT();
+ /* Expose the console to devfs */
+ cons_expose();
+
+ uacpi_init();
/* Start scheduler and bootstrap APs */
+ md_intoff();
sched_init();
- mp_bootstrap_aps(&g_bsp_ci);
- /* Startup init */
- memset(&proc0, 0, sizeof(proc0.tf));
- fork1(&proc0, 0, start_init, NULL);
+ memset(&g_proc0, 0, sizeof(g_proc0));
+ /* Startup pid 1 */
+ spawn(&g_proc0, start_init, NULL, 0, NULL);
+ md_inton();
+
+ /* Load all early drivers */
+ DRIVERS_INIT();
+
+ /* Only log to kmsg from here */
+ syslog_silence(true);
+
+ /*
+ * Bootstrap APs, schedule all other drivers
+ * and here we go!
+ */
+ mp_bootstrap_aps(&g_bsp_ci);
sched_enter();
__builtin_unreachable();
}