aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-08 13:19:52 +0200
committerHimbeer <himbeer@disroot.org>2024-07-08 13:19:52 +0200
commit862678c2323a57005a2ed55417a0d2b00bcf1d7c (patch)
tree4465a62a71c0f4e645feba1654030dd30ea25a40 /src/lib
parent4094f81d71ff2fd5379a3b91a366abb46dffc6a3 (diff)
vfs: Make call function accept process info instead of PID
This makes it possible to interact with the newly created driver thread beforehand (to copy memory etc.)
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/vfs.zig16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/vfs.zig b/src/lib/vfs.zig
index 12c40a2..d9a7b90 100644
--- a/src/lib/vfs.zig
+++ b/src/lib/vfs.zig
@@ -132,9 +132,11 @@ pub const ResourceDescriptor = struct {
pub fn read(self: ResourceDescriptor, proc: *process.Info, buffer: []u8) !noreturn {
return switch (self.inode.resource) {
.stream => |stream| {
+ const driver = process.latestThread(self.inode.pid).?;
+
const readFn = stream.readFn orelse return Error.ReadNotSupported;
proc.state = .suspended;
- try call(self.inode.pid, readFn, .{ buffer.ptr, buffer.len }, .{
+ try call(driver, readFn, .{ buffer.ptr, buffer.len }, .{
.hookFn = crossProcessReturn,
.context = proc,
});
@@ -147,9 +149,11 @@ pub const ResourceDescriptor = struct {
pub fn write(self: ResourceDescriptor, proc: *process.Info, bytes: []const u8) !noreturn {
return switch (self.inode.resource) {
.stream => |stream| {
+ const driver = process.latestThread(self.inode.pid).?;
+
const writeFn = stream.writeFn orelse return Error.WriteNotSupported;
proc.state = .suspended;
- try call(self.inode.pid, writeFn, .{ bytes.ptr, bytes.len }, .{
+ try call(driver, writeFn, .{ bytes.ptr, bytes.len }, .{
.hookFn = crossProcessReturn,
.context = proc,
});
@@ -215,8 +219,10 @@ pub fn open(proc: *process.Info, path: []const u8, pid: u16, data: usize) !Resou
const node = find(path) orelse return Error.NotFound;
return switch (node.data.resource) {
.hook => |hook| {
+ const driver = process.latestThread(node.data.pid).?;
+
proc.state = .suspended;
- try call(node.data.pid, hook.callback, .{ pid, data }, .{
+ try call(driver, hook.callback, .{ pid, data }, .{
.hookFn = crossProcessReturn,
.context = proc,
});
@@ -229,10 +235,8 @@ pub fn openZ(proc: *process.Info, path_c: [*:0]const u8, pid: u16, data: usize)
return open(proc, mem.sliceTo(path_c, 0), pid, data);
}
-fn call(pid: u16, function: *const anyopaque, args: anytype, termHook: ?process.Info.TermHook) !noreturn {
- const proc = process.latestThread(pid).?;
+fn call(proc: *process.Info, function: *const anyopaque, args: anytype, termHook: ?process.Info.TermHook) !noreturn {
const callback_thread = try proc.createThread(null);
-
callback_thread.call(@intFromPtr(function), args, termHook);
}