hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/kernel/proc.rv
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-10-04 02:02:15 +0200
committerhachem <im@hachem.wtf>2026-10-04 02:02:15 +0200
commit7c1bd03a71cccfcf48e79d241787021b0de98e73 (patch)
treeb7131a1f4eee60d24781d3f549d191e17793c282 /kernel/proc.rv
parent627f05098785327744e666c9149375125499d2ff (diff)
feat: add more user programs
Diffstat (limited to 'kernel/proc.rv')
-rw-r--r--kernel/proc.rv22
1 files changed, 18 insertions, 4 deletions
diff --git a/kernel/proc.rv b/kernel/proc.rv
index e2f451b..3303bc1 100644
--- a/kernel/proc.rv
+++ b/kernel/proc.rv
@@ -1,12 +1,11 @@
-# parse the embedded elf (physical address from elf_phys()) and run it in ring 3
+# load an embedded elf into a fresh address space and run it in ring 3
const PT_LOAD = 1
const PAGE_FLAGS = 6 # write | user
-fn cmd_run() do
- const base = elf_phys()
+fn load_elf(base) do
if mem_read(base, 4) != 0x464c457f do
- puts("run: not an ELF\n")
+ puts("not an ELF\n")
return :nil
end
const entry = mem_read(base + 24, 8)
@@ -38,3 +37,18 @@ fn cmd_run() do
as_map(space, stack_top - 4096, frame_alloc(), PAGE_FLAGS)
proc_run(space, entry, stack_top)
end
+
+# launch a program by name, :true if one matched
+fn run_prog(name) do
+ for i in 0..prog_count() do
+ if prog_name(i) == name do load_elf(prog_phys(i)) return :true end
+ end
+ puts("no such program: " ~ name ~ "\n")
+ return :false
+end
+
+fn list_progs() do
+ puts("programs:")
+ for i in 0..prog_count() do puts(" " ~ prog_name(i)) end
+ puts("\n")
+end