diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-27 16:07:16 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-27 16:08:03 +0200 |
commit | e285d9ee0ad1e47bbfe595431b5e8c4fbb553d50 (patch) | |
tree | 6e3ee50062e3da4dda9f1967ccaa129e117c5c8f /src/lib/syscall.zig | |
parent | fc888ca37914ffc3aecc111f8c8fd3fc07869367 (diff) |
Remove VFS entirely (#56)
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 262 |
1 files changed, 0 insertions, 262 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index e4d5254..1497cec 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -10,7 +10,6 @@ const paging = @import("paging.zig"); const process = @import("process.zig"); const sysexchange = @import("sysexchange.zig"); const trap = @import("trap.zig"); -const vfs = @import("vfs.zig"); pub const Error = error{ Unimplemented, @@ -24,17 +23,6 @@ pub fn handler(proc: *process.Info, trap_frame: *trap.Frame) !void { const ret = sysexchange.frameReturn; switch (trap_frame.general_purpose_registers[17]) { 100000 => ret(null, trap_frame, uprint(trap_frame)), - 100001 => ret(null, trap_frame, open(proc, trap_frame)), - 100002 => ret(null, trap_frame, close(proc, trap_frame)), - 100003 => ret(null, trap_frame, provideStream(proc, trap_frame)), - 100004 => ret(null, trap_frame, provideFile(proc, trap_frame)), - 100005 => ret(null, trap_frame, provideHook(proc, trap_frame)), - 100006 => ret(null, trap_frame, mkdir(proc, trap_frame)), - 100007 => ret(null, trap_frame, provideDirHook(proc, trap_frame)), - 100008 => ret(null, trap_frame, remove(trap_frame)), - 100009 => ret(null, trap_frame, read(proc, trap_frame)), - 100010 => ret(null, trap_frame, write(proc, trap_frame)), - 100011 => ret(null, trap_frame, list(proc, trap_frame)), 100012 => ret(null, trap_frame, end(proc)), 100013 => ret(null, trap_frame, processId(proc)), 100014 => ret(null, trap_frame, threadId(proc)), @@ -57,256 +45,6 @@ fn uprint(trap_frame: *const trap.Frame) void { w.print("User message: {s}\r\n", .{str}) catch unreachable; } -// open(path_c: [*:0]const u8, data: usize) Result(usize) // fixme: Kernel panic if null pointer -fn open(proc: *process.Info, trap_frame: *trap.Frame) void { - paging.setUserMemoryAccess(true); - defer paging.setUserMemoryAccess(false); - - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - const data = trap_frame.general_purpose_registers[11]; - - const result = vfs.openZ(proc, path_c, data) catch |err| { - sysexchange.frameReturn(usize, trap_frame, err); - return; - }; - - switch (result) { - .rd => |rd| { - const maybe_handle = proc.createRdHandle(rd); - sysexchange.frameReturn(usize, trap_frame, maybe_handle); - }, - .data => |result_data| { - sysexchange.frameReturn(null, trap_frame, result_data); - }, - } -} - -// 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( -// path_c: [*:0]const u8, // fixme: Kernel panic if null pointer -// options: *const vfs.Options, // fixme: Kernel panic if null pointer -// readFn: ?vfs.Stream.ReadFn, -// writeFn: ?vfs.Stream.WriteFn, -// ) Result(void) -fn provideStream(proc: *const process.Info, trap_frame: *trap.Frame) void { - paging.setUserMemoryAccess(true); - defer paging.setUserMemoryAccess(false); - - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - const options: *const vfs.Options = @ptrFromInt(trap_frame.general_purpose_registers[11]); - const readFn: ?vfs.Stream.ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[12]); - const writeFn: ?vfs.Stream.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[13]); - - sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .tag = .stream, - .data = .{ .stream = .{ - .readFn = readFn, - .writeFn = writeFn, - } }, - }, proc.id, options.*)); -} - -// provideFile( -// path_c: [*:0]const u8, // fixme: Kernel panic if null pointer -// options: *const vfs.Options, // fixme: Kernel panic if null pointer -// readFn: ?vfs.File.ReadFn, -// writeFn: ?vfs.File.WriteFn, -// closeFn: ?vfs.File.CloseFn, -// initializer: ?*anyopaque, -// ) Result(void) -fn provideFile(proc: *const process.Info, trap_frame: *trap.Frame) void { - paging.setUserMemoryAccess(true); - defer paging.setUserMemoryAccess(false); - - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - const options: *const vfs.Options = @ptrFromInt(trap_frame.general_purpose_registers[11]); - const readFn: ?vfs.File.ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[12]); - const writeFn: ?vfs.File.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[13]); - const closeFn: ?vfs.File.CloseFn = @ptrFromInt(trap_frame.general_purpose_registers[14]); - const initializer: ?*anyopaque = @ptrFromInt(trap_frame.general_purpose_registers[15]); - - sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .tag = .file, - .data = .{ .file = .{ - .readFn = readFn, - .writeFn = writeFn, - .closeFn = closeFn, - .initializer = initializer, - } }, - }, proc.id, options.*)); -} - -// provideHook( -// path_c: [*:0]const u8, // fixme: Kernel panic if null pointer -// options: *const vfs.Options, // fixme: Kernel panic if null pointer, -// callback: vfs.Hook.Callback, -// ) Result(void) -fn provideHook(proc: *const process.Info, trap_frame: *trap.Frame) void { - paging.setUserMemoryAccess(true); - defer paging.setUserMemoryAccess(false); - - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - const options: *const vfs.Options = @ptrFromInt(trap_frame.general_purpose_registers[11]); - const callback: vfs.Hook.Callback = @ptrFromInt(trap_frame.general_purpose_registers[12]); - - sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .tag = .hook, - .data = .{ .hook = .{ - .callback = callback, - } }, - }, proc.id, options.*)); -} - -// mkdir( -// path_c: [*:0]const u8, // fixme: Kernel panic if null pointer -// ) Result(void) -fn mkdir(proc: *const process.Info, trap_frame: *trap.Frame) void { - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - - const allocator = vfs.treeRoot().allocator; - const tree = allocator.create(vfs.Tree) catch |err| { - sysexchange.frameReturn(void, trap_frame, err); - return; - }; - tree.* = vfs.Tree.init(allocator); - - sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .tag = .dir, - .data = .{ .dir = tree }, - }, proc.id, .{ - .reclaimable = false, - })); -} - -// provideDirHook( -// path_c: [*:0]const u8, // fixme: Kernel panic if null pointer -// options: *const vfs.Options, // fixme: Kernel panic if null pointer -// provideFn: vfs.DirHook.ProvideFn, -// findFn: vfs.DirHook.FindFn, -// listFn:vfs.DirHook.ListFn, -// removeFn: vfs.DirHook.RemoveFn, -// ) Result(void) -fn provideDirHook(proc: *const process.Info, trap_frame: *trap.Frame) void { - paging.setUserMemoryAccess(true); - defer paging.setUserMemoryAccess(false); - - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - const options: *const vfs.Options = @ptrFromInt(trap_frame.general_purpose_registers[11]); - const provideFn: vfs.DirHook.ProvideFn = @ptrFromInt(trap_frame.general_purpose_registers[12]); - const findFn: vfs.DirHook.FindFn = @ptrFromInt(trap_frame.general_purpose_registers[13]); - const listFn: vfs.DirHook.ListFn = @ptrFromInt(trap_frame.general_purpose_registers[14]); - const removeFn: vfs.DirHook.RemoveFn = @ptrFromInt(trap_frame.general_purpose_registers[15]); - - sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path_c, .{ - .tag = .dir_hook, - .data = .{ .dir_hook = .{ - .provideFn = provideFn, - .findFn = findFn, - .listFn = listFn, - .removeFn = removeFn, - } }, - }, proc.id, options.*)); -} - -// remove(path_c: [*:0]const u8) Result(void) // fixme: Kernel panic if null pointer -fn remove(trap_frame: *trap.Frame) void { - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - const path = std.mem.sliceTo(path_c, 0); - const dirname = std.fs.path.dirnamePosix(path) orelse "/"; - - if (vfs.find(dirname)) |inode| { - const basename = std.fs.path.basenamePosix(path); - removeFrom(trap_frame, inode, basename); - } else { - sysexchange.frameReturn(void, trap_frame, vfs.Error.NotFound); - } -} - -fn removeFrom(trap_frame: *trap.Frame, inode: *vfs.Inode, basename: []const u8) void { - switch (inode.resource.tag) { - .dir => { - const dir = inode.resource.data.dir; - sysexchange.frameReturn(null, trap_frame, dir.remove(basename)); - }, - .dir_hook => { - const dir_hook = inode.resource.data.dir_hook; - - const removeFn = dir_hook.removeFn orelse { - sysexchange.frameReturn(void, trap_frame, vfs.Error.RemoveNotSupported); - return; - }; - const result = removeFn(basename.ptr, basename.len); - sysexchange.frameReturnResult(void, trap_frame, result); - }, - else => sysexchange.frameReturn(void, trap_frame, vfs.Error.NotADirectory), - } -} - -// read(handle: usize, buffer: [*]u8, len: usize) Result(usize) -fn read(proc: *process.Info, trap_frame: *trap.Frame) void { - paging.setUserMemoryAccess(true); - defer paging.setUserMemoryAccess(false); - - const handle = trap_frame.general_purpose_registers[10]; - const buffer: [*]u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]); - const len = trap_frame.general_purpose_registers[12]; - - const rd = proc.rds.get(handle) orelse { - sysexchange.frameReturn(usize, trap_frame, process.Error.BadRdHandle); - return; - }; - - const result = rd.read(proc, buffer[0..len]) catch |err| blk: { - if (err == vfs.Error.Orphaned) { - proc.destroyRdHandle(handle); - } - - break :blk err; - }; - sysexchange.frameReturn(usize, trap_frame, result); -} - -// write(handle: usize, bytes: [*]const u8, len: usize) Result(usize) -fn write(proc: *process.Info, trap_frame: *trap.Frame) void { - paging.setUserMemoryAccess(true); - defer paging.setUserMemoryAccess(false); - - const handle = trap_frame.general_purpose_registers[10]; - const bytes: [*]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[11]); - const len = trap_frame.general_purpose_registers[12]; - - const rd = proc.rds.get(handle) orelse { - sysexchange.frameReturn(usize, trap_frame, process.Error.BadRdHandle); - return; - }; - - const result = rd.write(proc, bytes[0..len]) catch |err| blk: { - if (err == vfs.Error.Orphaned) { - proc.destroyRdHandle(handle); - } - - break :blk err; - }; - sysexchange.frameReturn(usize, trap_frame, result); -} - -// list(path_c: [*:0]const u8, entries: [*]vfs.DirEntry, len: usize) Result(usize) -fn list(proc: *process.Info, trap_frame: *trap.Frame) void { - // fixme: Kernel panic if null pointer - const path_c: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); - // fixme: Kernel panic if null pointer - const entries: [*]vfs.DirEntry = @ptrFromInt(trap_frame.general_purpose_registers[11]); - const len = trap_frame.general_purpose_registers[12]; - - const result = vfs.listZ(proc, path_c, entries[0..len]); - sysexchange.frameReturn(null, trap_frame, result); -} - // end() void fn end(proc: *process.Info) void { proc.terminate(); |