diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-27 13:01:52 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-27 13:01:52 +0200 |
commit | 44793ab563463de8ce8ee28f9114000e04d63ebb (patch) | |
tree | f2fd3a07e9c8d39e7e58d5205d83f64131ccb1a8 /src/lib/syscall.zig | |
parent | df6bad0f5b00f0c764d608792ad767998f557b86 (diff) |
syscall: Convert VFS hook /process/create => launch(bytes: [*]align(@alignOf(std.elf.Elf64_Ehdr)) const u8, len: usize) !usize (#60)
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index 0767fbd..9841675 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -5,6 +5,7 @@ const std = @import("std"); const instructions = @import("instructions.zig"); +const mem = @import("mem.zig"); const paging = @import("paging.zig"); const process = @import("process.zig"); const sysexchange = @import("sysexchange.zig"); @@ -37,6 +38,7 @@ pub fn handler(proc: *process.Info, trap_frame: *trap.Frame) !void { 100012 => ret(null, trap_frame, terminate(proc)), 100013 => ret(null, trap_frame, processId(proc)), 100014 => ret(null, trap_frame, threadId(proc)), + 100015 => ret(null, trap_frame, launch(trap_frame)), else => return HandleError.UnknownSyscall, } } @@ -321,3 +323,17 @@ fn processId(proc: *const process.Info) usize { fn threadId(proc: *const process.Info) usize { return proc.thread_id; } + +// launch(bytes: [*]align(@alignOf(std.elf.Elf64_Ehdr)) const u8, len: usize) !usize +fn launch(trap_frame: *const trap.Frame) !usize { + const alignment = @alignOf(std.elf.Elf64_Ehdr); + const bytes_addr = trap_frame.general_purpose_registers[10]; + // fixme: Kernel panic if null pointer + const bytes_ptr: [*]align(alignment) const u8 = @ptrFromInt(bytes_addr); + const len = trap_frame.general_purpose_registers[11]; + + const bytes = bytes_ptr[0..len]; + + const new_proc = try process.create(mem.page_allocator, bytes); + return new_proc.id; +} |