diff options
-rw-r--r-- | src/lib/syscall.zig | 14 | ||||
-rw-r--r-- | src/lib/vfs.zig | 22 |
2 files changed, 27 insertions, 9 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index 5cbc9f2..c124373 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -57,12 +57,20 @@ fn open(proc: *process.Info, trap_frame: *trap.Frame) void { const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); const data = trap_frame.general_purpose_registers[11]; - const rd = vfs.openZ(proc, path_c, proc.id, data) catch |err| { + const result = vfs.openZ(proc, path_c, data) catch |err| { sysexchange.frameReturn(usize, trap_frame, err); return; }; - const maybe_handle = proc.createRdHandle(rd); - sysexchange.frameReturn(null, trap_frame, maybe_handle); + + switch (result) { + .rd => |rd| { + const maybe_handle = proc.createRdHandle(rd); + sysexchange.frameReturn(usize, trap_frame, maybe_handle); + }, + .data => |result_data| { + sysexchange.frameReturn(null, trap_frame, result_data); + }, + } } // close(handle: usize) void diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig index 10c961c..f601ddb 100644 --- a/src/lib/vfs.zig +++ b/src/lib/vfs.zig @@ -168,6 +168,11 @@ pub const Tree = struct { } }; +pub const OpenResult = union(enum) { + rd: ResourceDescriptor, + data: usize, +}; + pub const ResourceDescriptor = struct { inode: *Inode, @@ -363,26 +368,31 @@ pub fn provideResourceZ(path_c: [*:0]const u8, resource: Resource, pid: u16, opt return provideResource(mem.sliceTo(path_c, 0), resource, pid, options); } -pub fn open(proc: *process.Info, path: []const u8, pid: u16, data: usize) !ResourceDescriptor { +pub fn open(proc: *process.Info, path: []const u8, data: usize) !OpenResult { const inode = find(path) orelse return Error.NotFound; return switch (inode.resource.tag) { - .hook => { + .hook => blk: { const hook = inode.resource.data.hook; + if (inode.pid == 0) { + const result = hook.callback(proc.id, proc.thread_id, data); + break :blk .{ .data = try result.toErrorUnion() }; + } + const driver = process.latestThread(inode.pid).?; proc.state = .suspended; - try call(driver, hook.callback, .{ pid, data }, null, .{ + try call(driver, hook.callback, .{ proc.id, proc.thread_id, data }, null, .{ .hookFn = crossProcessReturn, .context = proc, }); }, - else => ResourceDescriptor.init(inode), + else => .{ .rd = try ResourceDescriptor.init(inode) }, }; } -pub fn openZ(proc: *process.Info, path_c: [*:0]const u8, pid: u16, data: usize) !ResourceDescriptor { - return open(proc, mem.sliceTo(path_c, 0), pid, data); +pub fn openZ(proc: *process.Info, path_c: [*:0]const u8, data: usize) !OpenResult { + return open(proc, mem.sliceTo(path_c, 0), data); } pub fn openNonHook(path: []const u8) !ResourceDescriptor { |