aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-06-30 18:57:43 +0200
committerHimbeer <himbeer@disroot.org>2024-06-30 18:57:43 +0200
commit8f9e790c9d4d336a8c6ec405f395f6f8f3de1012 (patch)
treef9cf7002d0cd0d103dc141b86eae0e7bf0d65d32 /src/lib
parent741349424774d6128f4da0f9bff85203200415c3 (diff)
syscall: Add stubs for VFS interaction
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/syscall.zig59
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;
+}