diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-01 23:47:08 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-01 23:47:08 +0200 |
commit | 3a0d5757265feff947519f0798a642cde5f08fc6 (patch) | |
tree | 31a915ddcde75f5cdd1cb67d9e186fef1f81d39c /src/lib | |
parent | 64aab3ba1e8f6120f59e2923a8bbae02e16693d9 (diff) |
syscall: Add close (destroy a resource descriptor using its handle number)
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/interrupts.zig | 2 | ||||
-rw-r--r-- | src/lib/process.zig | 8 | ||||
-rw-r--r-- | src/lib/syscall.zig | 16 |
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( |