mirror of
https://github.com/Leonmmcoset/cleonos.git
synced 2026-04-21 18:44:01 +00:00
移除内建命令
This commit is contained in:
@@ -34,6 +34,7 @@ typedef u64 (*clks_exec_entry_fn)(void);
|
||||
#define CLKS_EXEC_O_CREAT 0x0040ULL
|
||||
#define CLKS_EXEC_O_TRUNC 0x0200ULL
|
||||
#define CLKS_EXEC_O_APPEND 0x0400ULL
|
||||
#define CLKS_EXEC_FD_INHERIT ((u64)-1)
|
||||
#define CLKS_EXEC_DYNLIB_MAX 32U
|
||||
|
||||
#define CLKS_EXEC_ELF64_MAGIC_0 0x7FU
|
||||
@@ -828,6 +829,66 @@ static void clks_exec_fd_init_defaults(struct clks_exec_proc_record *proc) {
|
||||
proc->fds[2].path[0] = '\0';
|
||||
}
|
||||
|
||||
static clks_bool clks_exec_fd_copy_from_parent(struct clks_exec_proc_record *child,
|
||||
const struct clks_exec_proc_record *parent,
|
||||
u64 parent_fd,
|
||||
u64 child_fd,
|
||||
clks_bool require_read,
|
||||
clks_bool require_write) {
|
||||
const struct clks_exec_fd_entry *src;
|
||||
|
||||
if (child == CLKS_NULL || parent == CLKS_NULL || parent_fd >= CLKS_EXEC_FD_MAX || child_fd >= CLKS_EXEC_FD_MAX) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
src = &parent->fds[(u32)parent_fd];
|
||||
|
||||
if (src->used == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (require_read == CLKS_TRUE && clks_exec_fd_can_read(src->flags) == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (require_write == CLKS_TRUE && clks_exec_fd_can_write(src->flags) == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
child->fds[(u32)child_fd] = *src;
|
||||
return CLKS_TRUE;
|
||||
}
|
||||
|
||||
static clks_bool clks_exec_fd_apply_stdio_overrides(struct clks_exec_proc_record *child,
|
||||
const struct clks_exec_proc_record *parent,
|
||||
u64 stdin_fd,
|
||||
u64 stdout_fd,
|
||||
u64 stderr_fd) {
|
||||
if (child == CLKS_NULL) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (stdin_fd != CLKS_EXEC_FD_INHERIT) {
|
||||
if (clks_exec_fd_copy_from_parent(child, parent, stdin_fd, 0ULL, CLKS_TRUE, CLKS_FALSE) == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (stdout_fd != CLKS_EXEC_FD_INHERIT) {
|
||||
if (clks_exec_fd_copy_from_parent(child, parent, stdout_fd, 1ULL, CLKS_FALSE, CLKS_TRUE) == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (stderr_fd != CLKS_EXEC_FD_INHERIT) {
|
||||
if (clks_exec_fd_copy_from_parent(child, parent, stderr_fd, 2ULL, CLKS_FALSE, CLKS_TRUE) == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return CLKS_TRUE;
|
||||
}
|
||||
|
||||
static i32 clks_exec_fd_find_free(struct clks_exec_proc_record *proc) {
|
||||
u32 i;
|
||||
|
||||
@@ -1330,10 +1391,14 @@ static clks_bool clks_exec_dispatch_pending_once(void) {
|
||||
static clks_bool clks_exec_run_path_internal(const char *path,
|
||||
const char *argv_line,
|
||||
const char *env_line,
|
||||
u64 stdin_fd,
|
||||
u64 stdout_fd,
|
||||
u64 stderr_fd,
|
||||
u64 *out_status,
|
||||
u64 *out_pid) {
|
||||
i32 slot;
|
||||
u64 pid;
|
||||
const struct clks_exec_proc_record *parent_proc = clks_exec_current_proc();
|
||||
struct clks_exec_proc_record *proc;
|
||||
u64 status = (u64)-1;
|
||||
|
||||
@@ -1366,6 +1431,12 @@ static clks_bool clks_exec_run_path_internal(const char *path,
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (clks_exec_fd_apply_stdio_overrides(proc, parent_proc, stdin_fd, stdout_fd, stderr_fd) == CLKS_FALSE) {
|
||||
clks_log(CLKS_LOG_WARN, "EXEC", "INVALID STDIO FD OVERRIDE");
|
||||
clks_memset(proc, 0, sizeof(*proc));
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (out_pid != CLKS_NULL) {
|
||||
*out_pid = pid;
|
||||
}
|
||||
@@ -1403,11 +1474,35 @@ void clks_exec_init(void) {
|
||||
}
|
||||
|
||||
clks_bool clks_exec_run_path(const char *path, u64 *out_status) {
|
||||
return clks_exec_run_path_internal(path, CLKS_NULL, CLKS_NULL, out_status, CLKS_NULL);
|
||||
return clks_exec_run_path_internal(path,
|
||||
CLKS_NULL,
|
||||
CLKS_NULL,
|
||||
CLKS_EXEC_FD_INHERIT,
|
||||
CLKS_EXEC_FD_INHERIT,
|
||||
CLKS_EXEC_FD_INHERIT,
|
||||
out_status,
|
||||
CLKS_NULL);
|
||||
}
|
||||
|
||||
clks_bool clks_exec_run_pathv(const char *path, const char *argv_line, const char *env_line, u64 *out_status) {
|
||||
return clks_exec_run_path_internal(path, argv_line, env_line, out_status, CLKS_NULL);
|
||||
return clks_exec_run_path_internal(path,
|
||||
argv_line,
|
||||
env_line,
|
||||
CLKS_EXEC_FD_INHERIT,
|
||||
CLKS_EXEC_FD_INHERIT,
|
||||
CLKS_EXEC_FD_INHERIT,
|
||||
out_status,
|
||||
CLKS_NULL);
|
||||
}
|
||||
|
||||
clks_bool clks_exec_run_pathv_io(const char *path,
|
||||
const char *argv_line,
|
||||
const char *env_line,
|
||||
u64 stdin_fd,
|
||||
u64 stdout_fd,
|
||||
u64 stderr_fd,
|
||||
u64 *out_status) {
|
||||
return clks_exec_run_path_internal(path, argv_line, env_line, stdin_fd, stdout_fd, stderr_fd, out_status, CLKS_NULL);
|
||||
}
|
||||
|
||||
clks_bool clks_exec_spawn_pathv(const char *path, const char *argv_line, const char *env_line, u64 *out_pid) {
|
||||
|
||||
@@ -74,6 +74,42 @@
|
||||
#define CLKS_CFG_USRD_TASK 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_BOOT_VIDEO_LOG
|
||||
#define CLKS_CFG_BOOT_VIDEO_LOG 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_PMM_STATS_LOG
|
||||
#define CLKS_CFG_PMM_STATS_LOG 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_HEAP_STATS_LOG
|
||||
#define CLKS_CFG_HEAP_STATS_LOG 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_FS_ROOT_LOG
|
||||
#define CLKS_CFG_FS_ROOT_LOG 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_SYSTEM_DIR_CHECK
|
||||
#define CLKS_CFG_SYSTEM_DIR_CHECK 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_ELFRUNNER_INIT
|
||||
#define CLKS_CFG_ELFRUNNER_INIT 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_SYSCALL_TICK_QUERY
|
||||
#define CLKS_CFG_SYSCALL_TICK_QUERY 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_TTY_READY_LOG
|
||||
#define CLKS_CFG_TTY_READY_LOG 1
|
||||
#endif
|
||||
|
||||
#ifndef CLKS_CFG_IDLE_DEBUG_LOG
|
||||
#define CLKS_CFG_IDLE_DEBUG_LOG 1
|
||||
#endif
|
||||
|
||||
#if CLKS_CFG_KLOGD_TASK
|
||||
static void clks_task_klogd(u64 tick) {
|
||||
static u64 last_emit = 0ULL;
|
||||
@@ -161,10 +197,14 @@ void clks_kernel_main(void) {
|
||||
if (boot_fb == CLKS_NULL) {
|
||||
clks_log(CLKS_LOG_WARN, "VIDEO", "NO FRAMEBUFFER FROM LIMINE");
|
||||
} else {
|
||||
#if CLKS_CFG_BOOT_VIDEO_LOG
|
||||
clks_log_hex(CLKS_LOG_INFO, "VIDEO", "WIDTH", boot_fb->width);
|
||||
clks_log_hex(CLKS_LOG_INFO, "VIDEO", "HEIGHT", boot_fb->height);
|
||||
clks_log_hex(CLKS_LOG_INFO, "VIDEO", "PITCH", boot_fb->pitch);
|
||||
clks_log_hex(CLKS_LOG_INFO, "VIDEO", "BPP", boot_fb->bpp);
|
||||
#else
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "BOOT VIDEO LOGS DISABLED BY MENUCONFIG");
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(CLKS_ARCH_X86_64)
|
||||
@@ -183,16 +223,26 @@ void clks_kernel_main(void) {
|
||||
clks_pmm_init(boot_memmap);
|
||||
pmm_stats = clks_pmm_get_stats();
|
||||
|
||||
#if CLKS_CFG_PMM_STATS_LOG
|
||||
clks_log_hex(CLKS_LOG_INFO, "PMM", "MANAGED_PAGES", pmm_stats.managed_pages);
|
||||
clks_log_hex(CLKS_LOG_INFO, "PMM", "FREE_PAGES", pmm_stats.free_pages);
|
||||
clks_log_hex(CLKS_LOG_INFO, "PMM", "USED_PAGES", pmm_stats.used_pages);
|
||||
clks_log_hex(CLKS_LOG_INFO, "PMM", "DROPPED_PAGES", pmm_stats.dropped_pages);
|
||||
#else
|
||||
(void)pmm_stats;
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "PMM STATS LOGS DISABLED BY MENUCONFIG");
|
||||
#endif
|
||||
|
||||
clks_heap_init();
|
||||
heap_stats = clks_heap_get_stats();
|
||||
|
||||
#if CLKS_CFG_HEAP_STATS_LOG
|
||||
clks_log_hex(CLKS_LOG_INFO, "HEAP", "TOTAL_BYTES", heap_stats.total_bytes);
|
||||
clks_log_hex(CLKS_LOG_INFO, "HEAP", "FREE_BYTES", heap_stats.free_bytes);
|
||||
#else
|
||||
(void)heap_stats;
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "HEAP STATS LOGS DISABLED BY MENUCONFIG");
|
||||
#endif
|
||||
|
||||
#if CLKS_CFG_HEAP_SELFTEST
|
||||
void *heap_probe = clks_kmalloc(128);
|
||||
@@ -215,12 +265,21 @@ void clks_kernel_main(void) {
|
||||
}
|
||||
|
||||
fs_root_children = clks_fs_count_children("/");
|
||||
#if CLKS_CFG_FS_ROOT_LOG
|
||||
clks_log_hex(CLKS_LOG_INFO, "FS", "ROOT_CHILDREN", fs_root_children);
|
||||
#else
|
||||
(void)fs_root_children;
|
||||
#endif
|
||||
|
||||
#if CLKS_CFG_SYSTEM_DIR_CHECK
|
||||
if (clks_fs_stat("/system", &fs_system_dir) == CLKS_FALSE || fs_system_dir.type != CLKS_FS_NODE_DIR) {
|
||||
clks_log(CLKS_LOG_ERROR, "FS", "/SYSTEM DIRECTORY CHECK FAILED");
|
||||
clks_cpu_halt_forever();
|
||||
}
|
||||
#else
|
||||
(void)fs_system_dir;
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "/SYSTEM DIRECTORY CHECK DISABLED BY MENUCONFIG");
|
||||
#endif
|
||||
|
||||
if (boot_fb != CLKS_NULL) {
|
||||
#if CLKS_CFG_EXTERNAL_PSF
|
||||
@@ -318,8 +377,13 @@ void clks_kernel_main(void) {
|
||||
|
||||
clks_service_init();
|
||||
|
||||
#if CLKS_CFG_ELFRUNNER_INIT
|
||||
clks_elfrunner_init();
|
||||
#else
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "ELFRUNNER INIT DISABLED BY MENUCONFIG");
|
||||
#endif
|
||||
|
||||
#if CLKS_CFG_ELFRUNNER_INIT
|
||||
#if CLKS_CFG_ELFRUNNER_PROBE
|
||||
if (clks_elfrunner_probe_kernel_executable() == CLKS_FALSE) {
|
||||
clks_log(CLKS_LOG_ERROR, "ELF", "KERNEL ELF PROBE FAILED");
|
||||
@@ -327,14 +391,22 @@ void clks_kernel_main(void) {
|
||||
#else
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "ELFRUNNER PROBE DISABLED BY MENUCONFIG");
|
||||
#endif
|
||||
#else
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "ELFRUNNER PROBE SKIPPED (INIT DISABLED)");
|
||||
#endif
|
||||
|
||||
clks_syscall_init();
|
||||
|
||||
clks_interrupts_init();
|
||||
clks_log(CLKS_LOG_INFO, "INT", "IDT + PIC INITIALIZED");
|
||||
|
||||
#if CLKS_CFG_SYSCALL_TICK_QUERY
|
||||
syscall_ticks = clks_syscall_invoke_kernel(CLKS_SYSCALL_TIMER_TICKS, 0ULL, 0ULL, 0ULL);
|
||||
clks_log_hex(CLKS_LOG_INFO, "SYSCALL", "TICKS", syscall_ticks);
|
||||
#else
|
||||
(void)syscall_ticks;
|
||||
clks_log(CLKS_LOG_WARN, "CFG", "SYSCALL TICK QUERY DISABLED BY MENUCONFIG");
|
||||
#endif
|
||||
|
||||
clks_shell_init();
|
||||
|
||||
@@ -348,11 +420,15 @@ void clks_kernel_main(void) {
|
||||
clks_log(CLKS_LOG_WARN, "SHELL", "USRD TASK DISABLED; INTERACTIVE SHELL TICK OFF");
|
||||
#endif
|
||||
|
||||
#if CLKS_CFG_TTY_READY_LOG
|
||||
clks_log_hex(CLKS_LOG_INFO, "TTY", "COUNT", (u64)clks_tty_count());
|
||||
clks_log_hex(CLKS_LOG_INFO, "TTY", "ACTIVE", (u64)clks_tty_active());
|
||||
clks_log(CLKS_LOG_INFO, "TTY", "VIRTUAL TTY0 READY");
|
||||
clks_log(CLKS_LOG_INFO, "TTY", "CURSOR ENABLED");
|
||||
#endif
|
||||
#if CLKS_CFG_IDLE_DEBUG_LOG
|
||||
clks_log(CLKS_LOG_DEBUG, "KERNEL", "IDLE LOOP ENTER");
|
||||
#endif
|
||||
|
||||
for (;;) {
|
||||
u64 tick_now = clks_interrupts_timer_ticks();
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#define CLKS_SYSCALL_KDBG_STACK_WINDOW_BYTES (128ULL * 1024ULL)
|
||||
#define CLKS_SYSCALL_KERNEL_SYMBOL_FILE "/system/kernel.sym"
|
||||
#define CLKS_SYSCALL_KERNEL_ADDR_BASE 0xFFFF800000000000ULL
|
||||
#define CLKS_SYSCALL_STATS_MAX_ID CLKS_SYSCALL_DL_SYM
|
||||
#define CLKS_SYSCALL_STATS_MAX_ID CLKS_SYSCALL_EXEC_PATHV_IO
|
||||
#define CLKS_SYSCALL_STATS_RING_SIZE 256U
|
||||
|
||||
struct clks_syscall_frame {
|
||||
@@ -67,6 +67,13 @@ struct clks_syscall_kdbg_bt_req {
|
||||
u64 out_size;
|
||||
};
|
||||
|
||||
struct clks_syscall_exec_io_req {
|
||||
u64 env_line_ptr;
|
||||
u64 stdin_fd;
|
||||
u64 stdout_fd;
|
||||
u64 stderr_fd;
|
||||
};
|
||||
|
||||
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;
|
||||
@@ -1202,6 +1209,38 @@ static u64 clks_syscall_exec_pathv(u64 arg0, u64 arg1, u64 arg2) {
|
||||
return status;
|
||||
}
|
||||
|
||||
static u64 clks_syscall_exec_pathv_io(u64 arg0, u64 arg1, u64 arg2) {
|
||||
char path[CLKS_SYSCALL_PATH_MAX];
|
||||
char argv_line[CLKS_SYSCALL_ARG_LINE_MAX];
|
||||
char env_line[CLKS_SYSCALL_ENV_LINE_MAX];
|
||||
struct clks_syscall_exec_io_req req;
|
||||
u64 status = (u64)-1;
|
||||
|
||||
if (arg2 == 0ULL) {
|
||||
return (u64)-1;
|
||||
}
|
||||
|
||||
if (clks_syscall_copy_user_string(arg0, path, sizeof(path)) == CLKS_FALSE) {
|
||||
return (u64)-1;
|
||||
}
|
||||
|
||||
if (clks_syscall_copy_user_optional_string(arg1, argv_line, sizeof(argv_line)) == CLKS_FALSE) {
|
||||
return (u64)-1;
|
||||
}
|
||||
|
||||
clks_memcpy(&req, (const void *)arg2, sizeof(req));
|
||||
|
||||
if (clks_syscall_copy_user_optional_string(req.env_line_ptr, env_line, sizeof(env_line)) == CLKS_FALSE) {
|
||||
return (u64)-1;
|
||||
}
|
||||
|
||||
if (clks_exec_run_pathv_io(path, argv_line, env_line, req.stdin_fd, req.stdout_fd, req.stderr_fd, &status) == CLKS_FALSE) {
|
||||
return (u64)-1;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static u64 clks_syscall_getpid(void) {
|
||||
return clks_exec_current_pid();
|
||||
}
|
||||
@@ -1747,6 +1786,8 @@ u64 clks_syscall_dispatch(void *frame_ptr) {
|
||||
return clks_syscall_exec_path(frame->rbx);
|
||||
case CLKS_SYSCALL_EXEC_PATHV:
|
||||
return clks_syscall_exec_pathv(frame->rbx, frame->rcx, frame->rdx);
|
||||
case CLKS_SYSCALL_EXEC_PATHV_IO:
|
||||
return clks_syscall_exec_pathv_io(frame->rbx, frame->rcx, frame->rdx);
|
||||
case CLKS_SYSCALL_EXEC_REQUESTS:
|
||||
return clks_exec_request_count();
|
||||
case CLKS_SYSCALL_EXEC_SUCCESS:
|
||||
|
||||
Reference in New Issue
Block a user