aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-01 23:47:08 +0200
committerHimbeer <himbeer@disroot.org>2024-07-01 23:47:08 +0200
commit3a0d5757265feff947519f0798a642cde5f08fc6 (patch)
tree31a915ddcde75f5cdd1cb67d9e186fef1f81d39c /src/lib
parent64aab3ba1e8f6120f59e2923a8bbae02e16693d9 (diff)
syscall: Add close (destroy a resource descriptor using its handle number)
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/interrupts.zig2
-rw-r--r--src/lib/process.zig8
-rw-r--r--src/lib/syscall.zig16
3 files changed, 15 insertions, 11 deletions
diff --git a/src/lib/interrupts.zig b/src/lib/interrupts.zig
index 8d95294..e11c693 100644
--- a/src/lib/interrupts.zig
+++ b/src/lib/interrupts.zig
@@ -155,7 +155,7 @@ export fn handleTrap(epc: usize, tval: usize, cause_bits: usize, frame: *trap.Fr
},
.ecall => {
const proc = &process.list.last.?.data;
- syscall.handle(proc, frame) catch |err| switch (err) {
+ syscall.handler(proc, frame) catch |err| switch (err) {
syscall.Error.UnknownSyscall => {
const a7 = frame.general_purpose_registers[17];
w.print("Hart {d}: Unknown syscall, a7 = 0x{x:0>16}\r\n", .{ frame.hart_id, a7 }) catch unreachable;
diff --git a/src/lib/process.zig b/src/lib/process.zig
index 6f8ffce..fe5e3cf 100644
--- a/src/lib/process.zig
+++ b/src/lib/process.zig
@@ -67,7 +67,7 @@ pub const Info = struct {
return self.page_table.satp(self.id);
}
- pub fn makeRdHandle(self: *Info, rd: vfs.ResourceDescriptor) !usize {
+ pub fn createRdHandle(self: *Info, rd: vfs.ResourceDescriptor) !usize {
if (self.rds.count() == std.math.maxInt(usize)) {
return ProcessError.TooManyResourceDescriptors;
}
@@ -78,6 +78,12 @@ pub const Info = struct {
try self.rds.put(handle, rd);
return handle;
}
+
+ pub fn destroyRdHandle(self: *Info, handle: usize) void {
+ if (self.rds.fetchSwapRemove(handle)) |kv| {
+ kv.value.deinit();
+ }
+ }
};
pub fn next() ?*Info {
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index c2457c6..55a7da3 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -13,11 +13,11 @@ pub const Error = error{
UnknownSyscall,
};
-pub fn handle(proc: *process.Info, trap_frame: *trap.Frame) !void {
+pub fn handler(proc: *process.Info, trap_frame: *trap.Frame) !void {
switch (trap_frame.general_purpose_registers[17]) {
100000 => uprint(trap_frame),
100001 => open(proc, trap_frame),
- 100002 => close(trap_frame),
+ 100002 => close(proc, trap_frame),
100003 => provideStream(trap_frame),
100004 => provideFile(trap_frame),
100005 => provideHook(trap_frame),
@@ -52,19 +52,17 @@ fn open(proc: *process.Info, trap_frame: *trap.Frame) void {
};
switch (user_info) {
.rd => |resource_descriptor| {
- const maybe_handle = proc.makeRdHandle(resource_descriptor);
+ const maybe_handle = proc.createRdHandle(resource_descriptor);
sysexchange.frameReturn(null, trap_frame, maybe_handle);
},
.value => |value| sysexchange.frameReturnResult(usize, trap_frame, value),
}
}
-// close(rd: usize) void
-fn close(trap_frame: *const trap.Frame) void {
- const rd = trap_frame.general_purpose_registers[10];
-
- _ = rd;
- unreachable;
+// close(handle: usize) void
+fn close(proc: *process.Info, trap_frame: *const trap.Frame) void {
+ const handle = trap_frame.general_purpose_registers[10];
+ proc.destroyRdHandle(handle);
}
// provideStream(