aboutsummaryrefslogtreecommitdiff
path: root/src/lib/syscall.zig
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-27 13:01:52 +0200
committerHimbeer <himbeer@disroot.org>2024-07-27 13:01:52 +0200
commit44793ab563463de8ce8ee28f9114000e04d63ebb (patch)
treef2fd3a07e9c8d39e7e58d5205d83f64131ccb1a8 /src/lib/syscall.zig
parentdf6bad0f5b00f0c764d608792ad767998f557b86 (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.zig16
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;
+}