diff options
| author | hachem <im@hachem.wtf> | 2026-10-04 16:03:42 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-10-04 16:03:42 +0200 |
| commit | 52dab7fc85d877e80e3032f0afabae906adebad8 (patch) | |
| tree | b6d56299b839413bb77b1b8c8fa9f7a682124a05 /kernel/proc.rv | |
| parent | a8a35a00a3c3c57cfbef2311d0348376c2e83208 (diff) | |
feat: fs tree and free list alloc
Diffstat (limited to 'kernel/proc.rv')
| -rw-r--r-- | kernel/proc.rv | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/kernel/proc.rv b/kernel/proc.rv index f76c511..2f8bb2f 100644 --- a/kernel/proc.rv +++ b/kernel/proc.rv @@ -2,8 +2,9 @@ const PT_LOAD = 1 const PAGE_FLAGS = 6 # write | user +const ARG_VADDR = 0x50000000 # where we map the argument string in the new space -fn load_elf(base) do +fn load_elf(base, arg) do if mem_read(base, 4) != 0x464c457f do puts("not an ELF\n") return :nil @@ -34,14 +35,24 @@ fn load_elf(base) do end end const stack_top = 0x7fff0000 - as_map(space, stack_top - 4096, frame_alloc(), PAGE_FLAGS) - proc_run(space, entry, stack_top) + for p in 0..4 do as_map(space, stack_top - (p + 1) * 4096, frame_alloc(), PAGE_FLAGS) end + let arg_ptr = 0 + const arg_len = arg:len() + if arg_len > 0 do + const argframe = frame_alloc() + mem_zero(argframe, 4096) + for k in 0..arg_len do mem_write(argframe + k, arg[k]:ascii(), 1) end + as_map(space, ARG_VADDR, argframe, PAGE_FLAGS) + arg_ptr = ARG_VADDR + end + proc_run(space, entry, stack_top, arg_ptr, arg_len) end -# launch a program by name, :true if one matched -fn run_prog(name) do +fn run_prog(name, arg) do + let n = name + if n:starts_with?("/bin/") n = n[5..] for i in 0..prog_count() do - if prog_name(i) == name do load_elf(prog_phys(i)) return :true end + if prog_name(i) == n do load_elf(prog_phys(i), arg) return :true end end puts("no such program: #{name}\n") return :false |
