aboutsummaryrefslogtreecommitdiff
path: root/src/lib/syscall.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r--src/lib/syscall.zig28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index 55a7da3..8dda736 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -24,6 +24,8 @@ pub fn handler(proc: *process.Info, trap_frame: *trap.Frame) !void {
100006 => mkdir(trap_frame),
100007 => provideDirHook(trap_frame),
100008 => remove(trap_frame),
+ 100009 => read(proc, trap_frame),
+ 100010 => write(proc, trap_frame),
else => return Error.UnknownSyscall,
}
}
@@ -163,3 +165,29 @@ fn remove(trap_frame: *const trap.Frame) void {
_ = path;
unreachable;
}
+
+// read(handle: usize, buffer: [*]u8, len: usize) Result(usize)
+fn read(proc: *const process.Info, trap_frame: *trap.Frame) void {
+ const handle = trap_frame.general_purpose_registers[10];
+ const buffer: [*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
+ const len = trap_frame.general_purpose_registers[12];
+
+ const rd = proc.rds.get(handle) orelse {
+ sysexchange.frameReturn(usize, trap_frame, process.ProcessError.BadRdHandle);
+ return;
+ };
+ sysexchange.frameReturnResult(usize, trap_frame, rd.read(buffer[0..len]));
+}
+
+// write(handle: usize, bytes: [*]u8, len: usize) Result(usize)
+fn write(proc: *const process.Info, trap_frame: *trap.Frame) void {
+ const handle = trap_frame.general_purpose_registers[10];
+ const bytes: [*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
+ const len = trap_frame.general_purpose_registers[12];
+
+ const rd = proc.rds.get(handle) orelse {
+ sysexchange.frameReturn(usize, trap_frame, process.ProcessError.BadRdHandle);
+ return;
+ };
+ sysexchange.frameReturnResult(usize, trap_frame, rd.write(bytes[0..len]));
+}