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.zig25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index b618979..03a7979 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -5,6 +5,7 @@
const std = @import("std");
const Console = @import("Console.zig");
const TrapFrame = @import("TrapFrame.zig");
+const channel = @import("channel.zig");
const hwinfo = @import("hwinfo.zig");
const mem = @import("mem.zig");
const paging = @import("paging.zig");
@@ -31,6 +32,8 @@ pub fn handler(proc: *process.Info, trap_frame: *TrapFrame) !void {
100006 => trap_frame.setReturnValue(threadId(proc)),
100007 => trap_frame.setReturnValue(rawUserinit(trap_frame)),
100008 => trap_frame.setReturnValue(devicesByKind(trap_frame)),
+ 100011 => trap_frame.setReturnValue(pass(trap_frame)),
+ 100012 => trap_frame.setReturnValue(receive(trap_frame)),
else => return HandleError.UnknownSyscall,
}
}
@@ -167,3 +170,25 @@ fn devicesByKind(trap_frame: *const TrapFrame) !usize {
return i;
}
+
+// pass(channel_id: usize, bytes: [*]const u8, len: usize) !void
+fn pass(trap_frame: *const TrapFrame) !void {
+ const id = trap_frame.general_purpose_registers[10];
+ const bytes_ptr: [*]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
+ const len = trap_frame.general_purpose_registers[12];
+
+ const bytes = bytes_ptr[0..len];
+ const copy = try channel.messageAllocator().alloc(u8, bytes.len);
+ @memcpy(copy, bytes);
+ try channel.pass(id, copy);
+}
+
+// receive(channel_id: usize, buffer: [*]u8, len: usize) !usize
+fn receive(trap_frame: *const TrapFrame) !usize {
+ const id = trap_frame.general_purpose_registers[10];
+ const buffer_ptr: [*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]);
+ const len = trap_frame.general_purpose_registers[12];
+
+ const buffer = buffer_ptr[0..len];
+ return channel.receive(id, buffer);
+}