diff options
Diffstat (limited to 'src/lib/resources.zig')
-rw-r--r-- | src/lib/resources.zig | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/lib/resources.zig b/src/lib/resources.zig index f73c751..92a28b6 100644 --- a/src/lib/resources.zig +++ b/src/lib/resources.zig @@ -45,6 +45,18 @@ const iofs = struct { }; }; +const processfs = struct { + const self = struct { + fn terminate(pid: u16, thread_id: usize, _: usize) callconv(.C) sysexchange.Result(usize) { + const proc = process.findThread(pid, thread_id).?; + proc.terminate(); + process.schedule() catch |err| { + std.debug.panic("Unable to schedule because all processes are terminated: {any}", .{err}); + }; + } + }; +}; + pub const Error = error{ NoTarFileInitializer, NoConsole, @@ -53,9 +65,12 @@ pub const Error = error{ pub fn provideBuiltin() !void { try addDir("/io"); try addDir("/userinit"); + try addDir("/process"); + try addDir("/process/self"); try provideConsole(); try provideUserinit(); + try provideProcessSelf(); } fn provideConsole() !void { @@ -95,6 +110,19 @@ fn provideUserinit() !void { } } +fn provideProcessSelf() !void { + try vfs.provideResource("/process/self/terminate", .{ + .tag = .hook, + .data = .{ + .hook = .{ + .callback = processfs.self.terminate, + }, + }, + }, 0, .{ + .reclaimable = false, + }); +} + fn addFile(path: []const u8, file: File) !void { const allocator = vfs.treeRoot().allocator; |