From ae7e1a91d0529a0cb6bd0f9ea754a6df6425c60c Mon Sep 17 00:00:00 2001 From: Karina Date: Fri, 30 Jan 2026 10:19:05 +0400 Subject: [PATCH] fix(syscall/proc): i32 in sys_exit and sys_spawn fix(userspace/string.h): gets_s now correctly work with \b chore(kmain): now ring3 is default when pressing any key (instead of ksh) feat(termosh): spawn in termosh --- kernel/inc/syscalls/proc.h | 6 +++--- kernel/src/kmain.c | 10 ++++++---- kernel/src/syscalls/proc.c | 8 ++++---- userspace/libterm/inc/process.h | 4 ++-- userspace/libterm/src/process.c | 8 ++++---- userspace/libterm/src/stdio.c | 14 ++++++++++---- userspace/termosh/inc/handlers.h | 3 ++- userspace/termosh/src/handlers/spawn.c | 16 ++++++++++++++++ userspace/termosh/src/main.c | 2 +- 9 files changed, 48 insertions(+), 23 deletions(-) create mode 100644 userspace/termosh/src/handlers/spawn.c diff --git a/kernel/inc/syscalls/proc.h b/kernel/inc/syscalls/proc.h index e248044..525fea6 100644 --- a/kernel/inc/syscalls/proc.h +++ b/kernel/inc/syscalls/proc.h @@ -5,6 +5,6 @@ #include -u64 sys_exit(i32 code); -u64 sys_spawn(const char* path); -u64 sys_wait(u64 pid); \ No newline at end of file +i32 sys_exit(i32 code); +i32 sys_spawn(const char* path); +i32 sys_wait(u64 pid); \ No newline at end of file diff --git a/kernel/src/kmain.c b/kernel/src/kmain.c index fc68422..9420878 100644 --- a/kernel/src/kmain.c +++ b/kernel/src/kmain.c @@ -96,10 +96,12 @@ void kmain(Bootinfo* info) { staying_in_ksh = true; } - kprintf("Press any key to stay in ^gksh^!. \nPress ^yenter^! to continue booting in ring 3\n"); - char c = '\n'; - c = console_getc(); - if (c != '\n') staying_in_ksh = true; + if (!staying_in_ksh) { + kprintf("Press any key to continue booting. \nPress ^yq^! to stay in ^gksh^!\n"); + char c = '\n'; + c = console_getc(); + if (c == 'q') staying_in_ksh = true; + } if (staying_in_ksh) sched_spawn(ksh, nullptr, false, 0); else sched_spawn(init_task_entry, nullptr, false, 0); diff --git a/kernel/src/syscalls/proc.c b/kernel/src/syscalls/proc.c index 8ce2895..cd01e8e 100644 --- a/kernel/src/syscalls/proc.c +++ b/kernel/src/syscalls/proc.c @@ -8,18 +8,18 @@ extern task* curr_task; -u64 sys_exit(i32 code) { - kprintf("\n[Dewar] process %s exited with code %d", curr_task->proc->name, code); +i32 sys_exit(i32 code) { + kprintf("\n[Dewar] process %s exited with code %d\n", curr_task->proc->name, code); sched_exit(); return code; } -u64 sys_spawn(const char* path) { +i32 sys_spawn(const char* path) { return process_spawn(path, path); } -u64 sys_wait(u64 pid) { +i32 sys_wait(u64 pid) { sched_block(pid); return pid; } diff --git a/userspace/libterm/inc/process.h b/userspace/libterm/inc/process.h index d12e7b9..8f4e7d8 100644 --- a/userspace/libterm/inc/process.h +++ b/userspace/libterm/inc/process.h @@ -4,5 +4,5 @@ #pragma once #include -u64 spawn(const char* path); -u64 wait(u64 pid); \ No newline at end of file +i32 spawn(const char* path); +i32 wait(u64 pid); \ No newline at end of file diff --git a/userspace/libterm/src/process.c b/userspace/libterm/src/process.c index 6ec7a66..99d06fa 100644 --- a/userspace/libterm/src/process.c +++ b/userspace/libterm/src/process.c @@ -3,13 +3,13 @@ #include -extern u64 sys_spawn(const char* path); -extern u64 sys_wait(u64 pid); +extern i32 sys_spawn(const char* path); +extern i32 sys_wait(u64 pid); -u64 spawn(const char* path) { +i32 spawn(const char* path) { return sys_spawn(path); } -u64 wait(u64 pid) { +i32 wait(u64 pid) { return sys_wait(pid); } \ No newline at end of file diff --git a/userspace/libterm/src/stdio.c b/userspace/libterm/src/stdio.c index 9611681..288318d 100644 --- a/userspace/libterm/src/stdio.c +++ b/userspace/libterm/src/stdio.c @@ -117,16 +117,22 @@ char* gets_s(char* str, u64 size) { while (i < size - 1) { c = getchar(); if (c == EOF || c == '\n' || c == '\r') break; + if (c == '\b') { + if (i > 0) { + i--; + printf("\b \b"); + } + + continue; + } str[i++] = (char)c; - char ch = (char)c; - sys_write(1, &ch, 1); + putchar(c); } str[i] = '\0'; - char nl = '\n'; - sys_write(1, &nl, 1); + putchar('\n'); return str; } \ No newline at end of file diff --git a/userspace/termosh/inc/handlers.h b/userspace/termosh/inc/handlers.h index 7389a22..44f68c4 100644 --- a/userspace/termosh/inc/handlers.h +++ b/userspace/termosh/inc/handlers.h @@ -3,4 +3,5 @@ #pragma once -void not_implemented_yet(); \ No newline at end of file +void not_implemented_yet(); +void cmd_spawn(const char* path); \ No newline at end of file diff --git a/userspace/termosh/src/handlers/spawn.c b/userspace/termosh/src/handlers/spawn.c new file mode 100644 index 0000000..d7797b7 --- /dev/null +++ b/userspace/termosh/src/handlers/spawn.c @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2026 0xKarinyash +#include +#include + +void cmd_spawn(const char* path) { + i32 pid = spawn(path); + if (pid < 0) { + switch (pid) { + case -1: printf("\"%s\" not found.\n", path); break; + default: printf("failed to spawn (%d)\n", pid); break; + } + } else { + wait(pid); + } +} \ No newline at end of file diff --git a/userspace/termosh/src/main.c b/userspace/termosh/src/main.c index 9e957a9..77d291c 100644 --- a/userspace/termosh/src/main.c +++ b/userspace/termosh/src/main.c @@ -22,7 +22,7 @@ int main() { case TOKEN_QUIT: return 0; case TOKEN_CLEAR: not_implemented_yet(); break; case TOKEN_HELP: not_implemented_yet(); break; - case TOKEN_SPAWN: not_implemented_yet(); break; + case TOKEN_SPAWN: if (tokens_count >= 2) cmd_spawn(tokens[1]); break; default: printf("Unknown command\n"); break; } }