From dd0f6ebafd1686393c5a0d7f5c2394e8082c3ad1 Mon Sep 17 00:00:00 2001 From: Ben Siraphob Date: Mon, 27 Apr 2026 12:45:04 -0700 Subject: [PATCH 1/2] Create ptmx for command line runs --- app/AppDelegate.m | 22 +--------------------- kernel/init.c | 26 ++++++++++++++++++++++++++ kernel/init.h | 1 + main.c | 2 ++ 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/app/AppDelegate.m b/app/AppDelegate.m index 19d76b2ff9..b5542c4215 100644 --- a/app/AppDelegate.m +++ b/app/AppDelegate.m @@ -89,27 +89,7 @@ - (int)boot { FsInitialize(); - // create some device nodes - // this will do nothing if they already exist - generic_mknodat(AT_PWD, "/dev/tty1", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 1)); - generic_mknodat(AT_PWD, "/dev/tty2", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 2)); - generic_mknodat(AT_PWD, "/dev/tty3", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 3)); - generic_mknodat(AT_PWD, "/dev/tty4", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 4)); - generic_mknodat(AT_PWD, "/dev/tty5", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 5)); - generic_mknodat(AT_PWD, "/dev/tty6", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 6)); - generic_mknodat(AT_PWD, "/dev/tty7", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 7)); - - generic_mknodat(AT_PWD, "/dev/tty", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_TTY_MINOR)); - generic_mknodat(AT_PWD, "/dev/console", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_CONSOLE_MINOR)); - generic_mknodat(AT_PWD, "/dev/ptmx", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_PTMX_MINOR)); - - generic_mknodat(AT_PWD, "/dev/null", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_NULL_MINOR)); - generic_mknodat(AT_PWD, "/dev/zero", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_ZERO_MINOR)); - generic_mknodat(AT_PWD, "/dev/full", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_FULL_MINOR)); - generic_mknodat(AT_PWD, "/dev/random", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_RANDOM_MINOR)); - generic_mknodat(AT_PWD, "/dev/urandom", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_URANDOM_MINOR)); - - generic_mkdirat(AT_PWD, "/dev/pts", 0755); + create_standard_devices(); // Permissions on / have been broken for a while, let's fix them generic_setattrat(AT_PWD, "/", (struct attr) {.type = attr_mode, .mode = 0755}, false); diff --git a/kernel/init.c b/kernel/init.c index 52cda4a8c5..37d47a55ee 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -3,9 +3,11 @@ #include #include "fs/devices.h" #include "fs/fd.h" +#include "fs/path.h" #include "fs/real.h" #include "fs/tty.h" #include "kernel/calls.h" +#include "kernel/fs.h" #include "kernel/init.h" #include "kernel/personality.h" @@ -125,6 +127,30 @@ void set_console_device(int major, int minor) { console_minor = minor; } +static void create_device_node(const char *path, int major, int minor) { + generic_mknodat(AT_PWD, path, S_IFCHR|0666, dev_make(major, minor)); +} + +void create_standard_devices(void) { + for (int tty = 1; tty <= 7; tty++) { + char path[] = "/dev/tty0"; + path[8] = '0' + tty; + create_device_node(path, TTY_CONSOLE_MAJOR, tty); + } + + create_device_node("/dev/tty", TTY_ALTERNATE_MAJOR, DEV_TTY_MINOR); + create_device_node("/dev/console", TTY_ALTERNATE_MAJOR, DEV_CONSOLE_MINOR); + create_device_node("/dev/ptmx", TTY_ALTERNATE_MAJOR, DEV_PTMX_MINOR); + + create_device_node("/dev/null", MEM_MAJOR, DEV_NULL_MINOR); + create_device_node("/dev/zero", MEM_MAJOR, DEV_ZERO_MINOR); + create_device_node("/dev/full", MEM_MAJOR, DEV_FULL_MINOR); + create_device_node("/dev/random", MEM_MAJOR, DEV_RANDOM_MINOR); + create_device_node("/dev/urandom", MEM_MAJOR, DEV_URANDOM_MINOR); + + generic_mkdirat(AT_PWD, "/dev/pts", 0755); +} + int create_stdio(const char *file, int major, int minor) { struct fd *fd = generic_open(file, O_RDWR_, 0); if (IS_ERR(fd)) { diff --git a/kernel/init.h b/kernel/init.h index b52bc6cc68..3ce26f46ad 100644 --- a/kernel/init.h +++ b/kernel/init.h @@ -8,6 +8,7 @@ int mount_root(const struct fs_ops *fs, const char *source); void set_console_device(int major, int minor); int become_first_process(void); int become_new_init_child(void); +void create_standard_devices(void); int create_stdio(const char *file, int major, int minor); int create_piped_stdio(void); diff --git a/main.c b/main.c index e4040e192a..b3c01a62bb 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,7 @@ #include #include #include "kernel/calls.h" +#include "kernel/init.h" #include "kernel/task.h" #include "xX_main_Xx.h" @@ -13,6 +14,7 @@ int main(int argc, char *const argv[]) { fprintf(stderr, "xX_main_Xx: %s\n", strerror(-err)); return err; } + create_standard_devices(); do_mount(&procfs, "proc", "/proc", "", 0); do_mount(&devptsfs, "devpts", "/dev/pts", "", 0); task_run_current(); From 1b79c93050f67e7cd88d0b22edb6de230ed48d84 Mon Sep 17 00:00:00 2001 From: Ben Siraphob Date: Fri, 1 May 2026 09:54:08 -0700 Subject: [PATCH 2/2] Address device node review feedback --- app/AppDelegate.m | 2 +- kernel/init.c | 40 ++++++++++++++++++++-------------------- kernel/init.h | 2 +- main.c | 2 +- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/AppDelegate.m b/app/AppDelegate.m index b5542c4215..2508b18c99 100644 --- a/app/AppDelegate.m +++ b/app/AppDelegate.m @@ -89,7 +89,7 @@ - (int)boot { FsInitialize(); - create_standard_devices(); + create_some_device_nodes(); // Permissions on / have been broken for a while, let's fix them generic_setattrat(AT_PWD, "/", (struct attr) {.type = attr_mode, .mode = 0755}, false); diff --git a/kernel/init.c b/kernel/init.c index 37d47a55ee..c1117b5366 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -127,26 +127,26 @@ void set_console_device(int major, int minor) { console_minor = minor; } -static void create_device_node(const char *path, int major, int minor) { - generic_mknodat(AT_PWD, path, S_IFCHR|0666, dev_make(major, minor)); -} - -void create_standard_devices(void) { - for (int tty = 1; tty <= 7; tty++) { - char path[] = "/dev/tty0"; - path[8] = '0' + tty; - create_device_node(path, TTY_CONSOLE_MAJOR, tty); - } - - create_device_node("/dev/tty", TTY_ALTERNATE_MAJOR, DEV_TTY_MINOR); - create_device_node("/dev/console", TTY_ALTERNATE_MAJOR, DEV_CONSOLE_MINOR); - create_device_node("/dev/ptmx", TTY_ALTERNATE_MAJOR, DEV_PTMX_MINOR); - - create_device_node("/dev/null", MEM_MAJOR, DEV_NULL_MINOR); - create_device_node("/dev/zero", MEM_MAJOR, DEV_ZERO_MINOR); - create_device_node("/dev/full", MEM_MAJOR, DEV_FULL_MINOR); - create_device_node("/dev/random", MEM_MAJOR, DEV_RANDOM_MINOR); - create_device_node("/dev/urandom", MEM_MAJOR, DEV_URANDOM_MINOR); +void create_some_device_nodes(void) { + // create some device nodes + // this will do nothing if they already exist + generic_mknodat(AT_PWD, "/dev/tty1", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 1)); + generic_mknodat(AT_PWD, "/dev/tty2", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 2)); + generic_mknodat(AT_PWD, "/dev/tty3", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 3)); + generic_mknodat(AT_PWD, "/dev/tty4", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 4)); + generic_mknodat(AT_PWD, "/dev/tty5", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 5)); + generic_mknodat(AT_PWD, "/dev/tty6", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 6)); + generic_mknodat(AT_PWD, "/dev/tty7", S_IFCHR|0666, dev_make(TTY_CONSOLE_MAJOR, 7)); + + generic_mknodat(AT_PWD, "/dev/tty", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_TTY_MINOR)); + generic_mknodat(AT_PWD, "/dev/console", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_CONSOLE_MINOR)); + generic_mknodat(AT_PWD, "/dev/ptmx", S_IFCHR|0666, dev_make(TTY_ALTERNATE_MAJOR, DEV_PTMX_MINOR)); + + generic_mknodat(AT_PWD, "/dev/null", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_NULL_MINOR)); + generic_mknodat(AT_PWD, "/dev/zero", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_ZERO_MINOR)); + generic_mknodat(AT_PWD, "/dev/full", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_FULL_MINOR)); + generic_mknodat(AT_PWD, "/dev/random", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_RANDOM_MINOR)); + generic_mknodat(AT_PWD, "/dev/urandom", S_IFCHR|0666, dev_make(MEM_MAJOR, DEV_URANDOM_MINOR)); generic_mkdirat(AT_PWD, "/dev/pts", 0755); } diff --git a/kernel/init.h b/kernel/init.h index 3ce26f46ad..45f10546a6 100644 --- a/kernel/init.h +++ b/kernel/init.h @@ -8,7 +8,7 @@ int mount_root(const struct fs_ops *fs, const char *source); void set_console_device(int major, int minor); int become_first_process(void); int become_new_init_child(void); -void create_standard_devices(void); +void create_some_device_nodes(void); int create_stdio(const char *file, int major, int minor); int create_piped_stdio(void); diff --git a/main.c b/main.c index b3c01a62bb..61c9a28958 100644 --- a/main.c +++ b/main.c @@ -14,7 +14,7 @@ int main(int argc, char *const argv[]) { fprintf(stderr, "xX_main_Xx: %s\n", strerror(-err)); return err; } - create_standard_devices(); + create_some_device_nodes(); do_mount(&procfs, "proc", "/proc", "", 0); do_mount(&devptsfs, "devpts", "/dev/pts", "", 0); task_run_current();