diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/syscall.zig | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index 642d0c4..0e0c1f1 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -10,13 +10,32 @@ pub const Error = error{ UnknownSyscall, }; +pub const Status = enum(usize) { + success, +}; + +pub const ReadFn = *const fn (context: u16, buffer: []u8) Result(usize); +pub const WriteFn = *const fn (context: u16, bytes: []const u8) Result(usize); + +pub fn Result(comptime T: type) type { + return struct { + status: Status, + value: T, + }; +} + pub fn handle(trap_frame: *const trap.Frame) !void { switch (trap_frame.general_purpose_registers[17]) { 100000 => uprint(trap_frame), + 100001 => open(trap_frame), + 100002 => close(trap_frame), + 100003 => provide(trap_frame), + 100004 => remove(trap_frame), else => return Error.UnknownSyscall, } } +// uprint(str_addr: usize, len: usize) void fn uprint(trap_frame: *const trap.Frame) void { const procmem: *paging.Table = @ptrFromInt(instructions.satp.read().ppn << 12); @@ -28,3 +47,43 @@ fn uprint(trap_frame: *const trap.Frame) void { const w = @import("Console.zig").autoChoose().?.writer(); w.print("User message: {s}\r\n", .{str}) catch unreachable; } + +// open(path: *const [:0]u8) Result(usize) +fn open(trap_frame: *const trap.Frame) void { + const path: *const [:0]u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); + + _ = path; + unreachable; +} + +// close(rd: usize) void +fn close(trap_frame: *const trap.Frame) void { + const rd = trap_frame.general_purpose_registers[10]; + + _ = rd; + unreachable; +} + +// provide( +// path: *const [:0]u8, +// readFn: fn (context: u16, buffer: []u8) Result(usize), +// writeFn: fn (context: u16, bytes: []const u8) Result(usize) +// ) Result(usize) +fn provide(trap_frame: *const trap.Frame) void { + const path: *const [:0]u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); + const readFn: ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[11]); + const writeFn: WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[12]); + + _ = path; + _ = readFn; + _ = writeFn; + unreachable; +} + +// remove(path: *const [:0]u8) Result(usize) +fn remove(trap_frame: *const trap.Frame) void { + const path: *const [:0]u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]); + + _ = path; + unreachable; +} |