aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/syscall.zig14
-rw-r--r--src/lib/vfs.zig22
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 {