From 6d659b7b91af7607e984a03d63e48f558a160d24 Mon Sep 17 00:00:00 2001 From: pf4 <74263128+elydre@users.noreply.github.com> Date: Thu, 5 Mar 2026 12:16:17 +0100 Subject: [PATCH] 1.3.3 - patch process_create --- include/kernel/kernel/process.h | 1 + include/kernel/system.h | 2 +- include/zlibs/profan/syscall.h | 4 +-- kernel/kpart/syscall.c | 2 +- kernel/system/process.c | 51 +++++++++++++++++++-------------- 5 files changed, 34 insertions(+), 26 deletions(-) diff --git a/include/kernel/kernel/process.h b/include/kernel/kernel/process.h index 19324181..d06fd531 100644 --- a/include/kernel/kernel/process.h +++ b/include/kernel/kernel/process.h @@ -64,6 +64,7 @@ void schedule(uint32_t ticks); // process gestion int process_create(void *func, int copy_page, int nargs, uint32_t *args); +int process_create_user(void *func, int nargs, uint32_t *args); int process_fork(registers_t *regs); int process_wakeup(uint32_t pid, int handover); int process_sleep(uint32_t pid, uint32_t ms); diff --git a/include/kernel/system.h b/include/kernel/system.h index e7e4ddf7..9554db4a 100644 --- a/include/kernel/system.h +++ b/include/kernel/system.h @@ -14,7 +14,7 @@ // build settings -#define KERNEL_VERSION "1.3.2" +#define KERNEL_VERSION "1.3.3" #define KERNEL_EDITING "generic" #define PROCESS_MAX 200 // max process count diff --git a/include/zlibs/profan/syscall.h b/include/zlibs/profan/syscall.h index 215a0e13..219e2295 100644 --- a/include/zlibs/profan/syscall.h +++ b/include/zlibs/profan/syscall.h @@ -84,7 +84,7 @@ int syscall_sc_get(void); int syscall_sys_power(int); int syscall_elf_exec(uint32_t, char **, char **); -int syscall_process_create(void *, int, int, uint32_t *); +int syscall_process_create(void *, int, uint32_t *); int syscall_process_fork(void); int syscall_process_sleep(uint32_t, uint32_t); int syscall_process_wakeup(uint32_t, int); @@ -141,7 +141,7 @@ extern int profan_syscall(uint32_t id, ...); #define syscall_sys_power(a) ((int) profan_syscall(22, a)) #define syscall_elf_exec(a, b, c) ((int) profan_syscall(23, a, b, c)) -#define syscall_process_create(a, b, c, d) ((int) profan_syscall(24, a, b, c, d)) +#define syscall_process_create(a, c, d) ((int) profan_syscall(24, a, c, d)) #define syscall_process_fork() ((int) profan_syscall(25)) #define syscall_process_sleep(a, b) ((int) profan_syscall(26, a, b)) #define syscall_process_wakeup(a, b) ((int) profan_syscall(27, a, b)) diff --git a/kernel/kpart/syscall.c b/kernel/kpart/syscall.c index 0219ade4..20ddaabd 100644 --- a/kernel/kpart/syscall.c +++ b/kernel/kpart/syscall.c @@ -64,7 +64,7 @@ void *SYSCALL_ARRAY[] = { elf_exec, // 23 // process.h + runtime.h - process_create, // 24 + process_create_user, // 24 process_fork, // 25 process_sleep, // 26 process_wakeup, // 27 diff --git a/kernel/system/process.c b/kernel/system/process.c index 8bd94ccd..f32a4ce9 100644 --- a/kernel/system/process.c +++ b/kernel/system/process.c @@ -276,12 +276,12 @@ int process_init(void) { } -int process_create(void *func, int copy_page, int nargs, uint32_t *args) { +process_t *process_create_func(void *func, int copy_page, int nargs, uint32_t *args, int in_kernel) { int place = i_get_free_place(g_pid_incrament + 1); if (place == ERROR_CODE) { sys_warning("[create] Too many processes"); - return ERROR_CODE; + return NULL; } g_pid_incrament++; @@ -295,7 +295,7 @@ int process_create(void *func, int copy_page, int nargs, uint32_t *args) { new_proc->pid = g_pid_incrament; new_proc->ppid = g_proc_current->pid; - new_proc->in_kernel = (uint32_t) func < 0x200000; + new_proc->in_kernel = in_kernel; new_proc->state = PROC_STATE_SLP; void *phys_stack; @@ -311,7 +311,7 @@ int process_create(void *func, int copy_page, int nargs, uint32_t *args) { i_new_process(new_proc, func, g_proc_current->regs.eflags, (uint32_t *) new_proc->scuba_dir); if (func == NULL) { - return g_pid_incrament; + return new_proc; } // push arguments to the new process @@ -327,33 +327,40 @@ int process_create(void *func, int copy_page, int nargs, uint32_t *args) { new_proc->regs.esp = PROC_ESP_ADDR + PROC_ESP_SIZE - (nargs + 1) * sizeof(uint32_t); - return g_pid_incrament; + return new_proc; +} + +int process_create(void *func, int copy_page, int nargs, uint32_t *args) { + // the function is used by the kernel only + process_t *proc = process_create_func(func, copy_page, nargs, args, 1); + return proc ? (int) proc->pid : ERROR_CODE; } +int process_create_user(void *func, int nargs, uint32_t *args) { + // the function is used by the user processes only + process_t *proc = process_create_func(func, 1, nargs, args, 0); + return proc ? (int) proc->pid : ERROR_CODE; +} int process_fork(registers_t *regs) { - int new_pid = process_create(NULL, 1, 0, NULL); + process_t *proc = process_create_func(NULL, 1, 0, NULL, 0); // fork can be call only trough a syscall - if (new_pid == ERROR_CODE) { + if (proc == NULL) { return ERROR_CODE; } - process_t *new_proc = &g_plist[i_pid_to_place(new_pid)]; - - new_proc->in_kernel = 0; // cannot call this without a syscall - - new_proc->regs.eax = regs->eax; - new_proc->regs.ebx = regs->ebx; - new_proc->regs.ecx = regs->ecx; - new_proc->regs.edx = regs->edx; - new_proc->regs.esi = regs->esi; - new_proc->regs.edi = regs->edi; - new_proc->regs.eip = regs->eip; - new_proc->regs.esp = regs->esp + 20; // popa (interrupt.asm: isr_common_stub) - new_proc->regs.ebp = regs->ebp; - new_proc->regs.eflags = regs->eflags; + proc->regs.eax = regs->eax; + proc->regs.ebx = regs->ebx; + proc->regs.ecx = regs->ecx; + proc->regs.edx = regs->edx; + proc->regs.esi = regs->esi; + proc->regs.edi = regs->edi; + proc->regs.eip = regs->eip; + proc->regs.esp = regs->esp + 20; // popa (interrupt.asm: isr_common_stub) + proc->regs.ebp = regs->ebp; + proc->regs.eflags = regs->eflags; - return new_pid; + return proc->pid; }