更新shell

This commit is contained in:
2026-04-14 19:13:55 +08:00
parent 81425929f5
commit 505417a2f3
8 changed files with 102 additions and 8 deletions

View File

@@ -49,6 +49,8 @@
#define CLKS_SYSCALL_EXIT 43ULL
#define CLKS_SYSCALL_SLEEP_TICKS 44ULL
#define CLKS_SYSCALL_YIELD 45ULL
#define CLKS_SYSCALL_SHUTDOWN 46ULL
#define CLKS_SYSCALL_RESTART 47ULL
void clks_syscall_init(void);
u64 clks_syscall_dispatch(void *frame_ptr);

View File

@@ -1,3 +1,4 @@
#include <clks/cpu.h>
#include <clks/exec.h>
#include <clks/fs.h>
#include <clks/heap.h>
@@ -51,6 +52,17 @@ static clks_bool clks_syscall_ready = CLKS_FALSE;
static clks_bool clks_syscall_user_trace_active = CLKS_FALSE;
static u64 clks_syscall_user_trace_budget = 0ULL;
#if defined(CLKS_ARCH_X86_64)
static inline void clks_syscall_outb(u16 port, u8 value) {
__asm__ volatile("outb %0, %1" : : "a"(value), "Nd"(port));
}
static inline void clks_syscall_outw(u16 port, u16 value) {
__asm__ volatile("outw %0, %1" : : "a"(value), "Nd"(port));
}
#endif
static clks_bool clks_syscall_copy_user_string(u64 src_addr, char *dst, usize dst_size) {
const char *src = (const char *)src_addr;
usize i = 0U;
@@ -247,6 +259,27 @@ static u64 clks_syscall_yield(void) {
return clks_exec_yield();
}
static u64 clks_syscall_shutdown(void) {
clks_log(CLKS_LOG_WARN, "SYSCALL", "SHUTDOWN REQUESTED BY USERLAND");
clks_serial_write("[WARN][SYSCALL] SHUTDOWN REQUESTED\n");
#if defined(CLKS_ARCH_X86_64)
clks_syscall_outw(0x604U, 0x2000U);
#endif
clks_cpu_halt_forever();
return 1ULL;
}
static u64 clks_syscall_restart(void) {
clks_log(CLKS_LOG_WARN, "SYSCALL", "RESTART REQUESTED BY USERLAND");
clks_serial_write("[WARN][SYSCALL] RESTART REQUESTED\n");
#if defined(CLKS_ARCH_X86_64)
clks_syscall_outb(0x64U, 0xFEU);
#endif
clks_cpu_halt_forever();
return 1ULL;
}
static u64 clks_syscall_fs_stat_type(u64 arg0) {
char path[CLKS_SYSCALL_PATH_MAX];
struct clks_fs_node_info info;
@@ -545,6 +578,10 @@ u64 clks_syscall_dispatch(void *frame_ptr) {
return clks_syscall_sleep_ticks(frame->rbx);
case CLKS_SYSCALL_YIELD:
return clks_syscall_yield();
case CLKS_SYSCALL_SHUTDOWN:
return clks_syscall_shutdown();
case CLKS_SYSCALL_RESTART:
return clks_syscall_restart();
default:
return (u64)-1;
}