aboutsummaryrefslogtreecommitdiff
path: root/src/lib/resources.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/resources.zig')
-rw-r--r--src/lib/resources.zig28
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;