From 25bac8d254d55b8f752f8e605cb707475281b6a1 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 5 Oct 2025 19:17:40 -0400 Subject: kern: proc: Add initial spawn function Signed-off-by: Ian Moffett --- src/sys/include/sys/proc.h | 11 +++++++++++ src/sys/os/os_proc.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/sys/include/sys/proc.h b/src/sys/include/sys/proc.h index d93f490..fe45506 100644 --- a/src/sys/include/sys/proc.h +++ b/src/sys/include/sys/proc.h @@ -135,6 +135,17 @@ int proc_add_range(struct proc *procp, vaddr_t va, paddr_t pa, size_t len); */ int proc_kill(struct proc *procp, int status); +/* + * Spawn a process from a binary + * + * @path: Path to binary + * @envp: Environment block pointer + * + * Returns the PID of the new process on success, + * otherwise a less than zero value on error + */ +int proc_spawn(const char *path, struct penv_blk *envbp); + /* * Initialize machine dependent state of a process * diff --git a/src/sys/os/os_proc.c b/src/sys/os/os_proc.c index ad591e6..e32e59c 100644 --- a/src/sys/os/os_proc.c +++ b/src/sys/os/os_proc.c @@ -32,9 +32,13 @@ #include #include #include +#include #include +#include +#include #include #include +#include #include #include #include @@ -169,3 +173,42 @@ proc_check_addr(struct proc *proc, uintptr_t addr, size_t len) return -EFAULT; } + +int +proc_spawn(const char *path, struct penv_blk *envbp) +{ + struct pcore *core; + struct loaded_elf elf; + struct proc *proc; + int error; + + if (path == NULL) { + return -EINVAL; + } + + /* Allocate a new process */ + proc = kalloc(sizeof(*proc)); + if (proc == NULL) { + return -ENOMEM; + } + + proc_init(proc, 0); + error = elf_load(path, proc, &elf); + if (error < 0) { + kfree(proc); + return error; + } + + core = cpu_sched(); + if (__unlikely(core == NULL)) { + panic("spawn: failed to arbitrate core\n"); + } + + if (envbp != NULL) { + memcpy(&proc->envblk, envbp, sizeof(proc->envblk)); + } + + md_set_ip(proc, elf.entrypoint); + sched_enq(&core->scq, proc); + return proc->pid; +} -- cgit v1.2.3