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.zig56
1 files changed, 23 insertions, 33 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index 0e0c1f1..07c62fd 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -4,32 +4,20 @@
const instructions = @import("instructions.zig");
const paging = @import("paging.zig");
+const sysexchange = @import("sysexchange.zig");
const trap = @import("trap.zig");
+const vfs = @import("vfs.zig");
pub const Error = error{
UnknownSyscall,
};
-pub const Status = enum(usize) {
- success,
-};
-
-pub const ReadFn = *const fn (context: u16, buffer: []u8) Result(usize);
-pub const WriteFn = *const fn (context: u16, bytes: []const u8) Result(usize);
-
-pub fn Result(comptime T: type) type {
- return struct {
- status: Status,
- value: T,
- };
-}
-
-pub fn handle(trap_frame: *const trap.Frame) !void {
+pub fn handle(trap_frame: *trap.Frame) !void {
switch (trap_frame.general_purpose_registers[17]) {
100000 => uprint(trap_frame),
100001 => open(trap_frame),
100002 => close(trap_frame),
- 100003 => provide(trap_frame),
+ 100003 => provideStream(trap_frame),
100004 => remove(trap_frame),
else => return Error.UnknownSyscall,
}
@@ -48,9 +36,9 @@ fn uprint(trap_frame: *const trap.Frame) void {
w.print("User message: {s}\r\n", .{str}) catch unreachable;
}
-// open(path: *const [:0]u8) Result(usize)
+// open(path: [*:0]const u8) Result(usize) // fixme: Kernel panic if null pointer
fn open(trap_frame: *const trap.Frame) void {
- const path: *const [:0]u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
+ const path: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
_ = path;
unreachable;
@@ -64,25 +52,27 @@ fn close(trap_frame: *const trap.Frame) void {
unreachable;
}
-// provide(
-// path: *const [:0]u8,
-// readFn: fn (context: u16, buffer: []u8) Result(usize),
-// writeFn: fn (context: u16, bytes: []const u8) Result(usize)
+// provideStream(
+// path: [*:0]const u8, // fixme: Kernel panic if null pointer
+// readFn: ?vfs.Stream.ReadFn,
+// writeFn: ?vfs.Stream.WriteFn,
// ) Result(usize)
-fn provide(trap_frame: *const trap.Frame) void {
- const path: *const [:0]u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
- const readFn: ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[11]);
- const writeFn: WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[12]);
-
- _ = path;
- _ = readFn;
- _ = writeFn;
- unreachable;
+fn provideStream(trap_frame: *trap.Frame) void {
+ const path: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
+ const readFn: ?vfs.Stream.ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[11]);
+ const writeFn: ?vfs.Stream.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[12]);
+
+ sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{
+ .stream = .{
+ .readFn = readFn,
+ .writeFn = writeFn,
+ },
+ }));
}
-// remove(path: *const [:0]u8) Result(usize)
+// remove(path: [*:0]const u8) Result(usize) // fixme: Kernel panic if null pointer
fn remove(trap_frame: *const trap.Frame) void {
- const path: *const [:0]u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
+ const path: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
_ = path;
unreachable;