diff options
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index eece736..c2457c6 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -4,6 +4,7 @@ const instructions = @import("instructions.zig"); const paging = @import("paging.zig"); +const process = @import("process.zig"); const sysexchange = @import("sysexchange.zig"); const trap = @import("trap.zig"); const vfs = @import("vfs.zig"); @@ -12,10 +13,10 @@ pub const Error = error{ UnknownSyscall, }; -pub fn handle(trap_frame: *trap.Frame) !void { +pub fn handle(proc: *process.Info, trap_frame: *trap.Frame) !void { switch (trap_frame.general_purpose_registers[17]) { 100000 => uprint(trap_frame), - 100001 => open(trap_frame), + 100001 => open(proc, trap_frame), 100002 => close(trap_frame), 100003 => provideStream(trap_frame), 100004 => provideFile(trap_frame), @@ -40,12 +41,22 @@ fn uprint(trap_frame: *const trap.Frame) void { w.print("User message: {s}\r\n", .{str}) catch unreachable; } -// open(path: [*:0]const u8) Result(usize) // fixme: Kernel panic if null pointer -fn open(trap_frame: *const trap.Frame) void { +// open(path: [*:0]const u8, data: usize) Result(usize) // fixme: Kernel panic if null pointer +fn open(proc: *process.Info, trap_frame: *trap.Frame) void { const path: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - - _ = path; - unreachable; + const data = trap_frame.general_purpose_registers[11]; + + const user_info = vfs.openZ(path, proc.id, data) catch |err| { + sysexchange.frameReturn(usize, trap_frame, err); + return; + }; + switch (user_info) { + .rd => |resource_descriptor| { + const maybe_handle = proc.makeRdHandle(resource_descriptor); + sysexchange.frameReturn(null, trap_frame, maybe_handle); + }, + .value => |value| sysexchange.frameReturnResult(usize, trap_frame, value), + } } // close(rd: usize) void @@ -66,7 +77,7 @@ fn provideStream(trap_frame: *trap.Frame) void { 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, .{ + sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{ .stream = .{ .readFn = readFn, .writeFn = writeFn, @@ -88,7 +99,7 @@ fn provideFile(trap_frame: *trap.Frame) void { const writeFn: ?vfs.File.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[13]); const closeFn: ?vfs.File.CloseFn = @ptrFromInt(trap_frame.general_purpose_registers[14]); - sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{ + sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{ .file = .{ .openFn = openFn, .readFn = readFn, @@ -106,7 +117,7 @@ fn provideHook(trap_frame: *trap.Frame) void { const path: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); const callback: vfs.Hook.Callback = @ptrFromInt(trap_frame.general_purpose_registers[11]); - sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{ + sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{ .hook = .{ .callback = callback, }, @@ -138,7 +149,7 @@ fn provideDirHook(trap_frame: *trap.Frame) void { const findFn: vfs.DirHook.FindFn = @ptrFromInt(trap_frame.general_purpose_registers[12]); const removeFn: vfs.DirHook.RemoveFn = @ptrFromInt(trap_frame.general_purpose_registers[13]); - sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{ + sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{ .dir_hook = .{ .provideFn = provideFn, .findFn = findFn, |