diff options
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 56 |
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; |