summaryrefslogtreecommitdiff
path: root/src/sys/os
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-10-05 19:17:40 -0400
committerIan Moffett <ian@osmora.org>2025-10-05 19:17:40 -0400
commit25bac8d254d55b8f752f8e605cb707475281b6a1 (patch)
tree3bc595cce591d20649f436a9d8eaea558ba0d9c7 /src/sys/os
parentf3563f62e0523c5dc9dcdf83e4ef3b6e4454f56f (diff)
kern: proc: Add initial spawn function
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/os')
-rw-r--r--src/sys/os/os_proc.c43
1 files changed, 43 insertions, 0 deletions
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 <sys/errno.h>
#include <sys/cdefs.h>
#include <sys/queue.h>
+#include <sys/panic.h>
#include <sys/proc.h>
+#include <sys/cpuvar.h>
+#include <os/systm.h>
#include <vm/vm.h>
#include <vm/physseg.h>
+#include <os/elfload.h>
#include <os/signal.h>
#include <os/kalloc.h>
#include <os/filedesc.h>
@@ -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;
+}