Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102550377
D36368.id109886.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D36368.id109886.diff
View Options
diff --git a/stand/kboot/Makefile b/stand/kboot/Makefile
--- a/stand/kboot/Makefile
+++ b/stand/kboot/Makefile
@@ -19,6 +19,7 @@
# Architecture-specific loader code
SRCS= crt1.c conf.c vers.c main.c host_syscalls.c hostcons.c hostdisk.c kbootfdt.c gfx_fb_stub.c
+SRCS+= init.c
SRCS+= termios.c
CFLAGS.gfx_fb_stub.c += -I${SRCTOP}/contrib/pnglite -I${SRCTOP}/sys/teken
diff --git a/stand/kboot/init.c b/stand/kboot/init.c
new file mode 100644
--- /dev/null
+++ b/stand/kboot/init.c
@@ -0,0 +1,125 @@
+/*
+ * Mini-init(8) so we can run as init in a LinuxBoot environment.
+ */
+
+#include "stand.h"
+#include "host_syscall.h"
+#include "kboot.h"
+
+/*
+ * Create a 'standard' early boot environment. Cribbed from the things that
+ * sysvinit, u-root, and initramfs-tools do. This is a minimal environment
+ * for modern Linux systems, though the /tmp, /run and /var stuff can likely
+ * be done inside the initrd image itself (as can creating the mount points
+ * for /proc, /dev and /sys).
+ *
+ * Note: We ignore errors here. There's no stderr to report them to yet. These
+ * operations generally can't fail, but if they do, we may not have the ability
+ * to report them later.
+ */
+static void
+init_fs_env(void)
+{
+ /*
+ * Create directories for mandatory filesystems and mount them.
+ */
+ host_mkdir("/proc", 0555);
+ host_mount("proc", "/proc", "proc", MS_RELATIME, "");
+ host_mkdir("/sys", 0555);
+ host_mount("sysfs", "/sys", "sysfs", MS_RELATIME, "");
+ host_mkdir("/dev", 0755);
+ host_mount("devtmpfs", "/dev", "devtmpfs", MS_RELATIME,
+ "mode=0755,nr_inodes=0");
+
+ /*
+ * Create compat links: /dev/fd lives in /proc, and needs some help to
+ * get setup.
+ */
+ host_symlink("/proc/self/fd", "/dev/fd");
+ host_symlink("fd/0", "/dev/stdin");
+ host_symlink("fd/1", "/dev/stdout");
+ host_symlink("fd/2", "/dev/stderr");
+
+
+ /*
+ * Unsure if we need this, but create a sane /tmp just in case that's useful.
+ * and point /run over to it.
+ */
+ host_mkdir("/tmp", 01777);
+ host_mount("tmpfs", "/tmp", "tmpfs", MS_RELATIME, "size=10%,mode=1777");
+ host_symlink("/tmp", "/run");
+
+ /*
+ * Unsure the loader needs /var and /var/log, but they are easy to
+ * create.
+ */
+ host_mkdir("/var", 0555);
+ host_mkdir("/var/lock", 0555);
+ host_symlink("/tmp", "/var/tmp");
+}
+
+static void
+init_tty(void)
+{
+ int fd;
+
+ /*
+ * sysvinit asks the linux kernel to convert the CTRL-ALT-DEL to a SIGINT,
+ * but we skip that.
+ */
+
+ /*
+ * Setup /dev/console as stdin/out/err
+ */
+ host_close(0);
+ host_close(1);
+ host_close(2);
+ fd = host_open("/dev/console", HOST_O_RDWR | HOST_O_NOCTTY, 0);
+ host_dup(fd);
+ host_dup(fd);
+#if 0
+ /*
+ * I think we may need to put it in 'raw' mode, but maybe not. Linux
+ * sysvinit sets it into 'sane' mode with alot of tweaks. We rely on the
+ * kindness of defaults. We can use the musl versions of these linux
+ * functions if need be. glibc is too ugly with too many layers to
+ * easily import (plus has license issues).
+ */
+ struct host_termios tty;
+
+ host_cfmakeraw(&tty);
+ host_tcsetattr(fd, HOST_TCANOW, &tty);
+ host_tcflush(fd, HOST_TCIOFLUSH)
+#endif
+}
+
+static void
+init_sig(void)
+{
+ /*
+ * since we're running as init, we need to catch some signals
+ */
+
+ /*
+ * setup signals here
+ *
+ * sysvinit catches a lot of signals, but the boot loader needn't catch
+ * so many since we don't do as much as it does. If we need to, put the
+ * signal catching / ignoring code here. If we implement a 'shell'
+ * function to spawn a sub-shell, we'll likely need to do a lot more.
+ */
+}
+
+void
+do_init(void)
+{
+ /*
+ * Only pid 1 is init
+ */
+ if (host_getpid() != 1)
+ return;
+
+ init_fs_env();
+ init_tty();
+ init_sig();
+}
diff --git a/stand/kboot/main.c b/stand/kboot/main.c
--- a/stand/kboot/main.c
+++ b/stand/kboot/main.c
@@ -261,8 +261,11 @@
const size_t heapsize = 15*1024*1024;
const char *bootdev;
+ /* Give us a sane world if we're running as init */
+ do_init();
+
/*
- * Set the heap to one page after the end of the loader.
+ * Setup the heap 15MB should be plenty
*/
heapbase = host_getmem(heapsize);
setheap(heapbase, heapbase + heapsize);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Nov 14, 10:41 PM (8 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14634691
Default Alt Text
D36368.id109886.diff (4 KB)
Attached To
Mode
D36368: kboot: add minmalist init functionality
Attached
Detach File
Event Timeline
Log In to Comment