aboutsummaryrefslogtreecommitdiff
path: root/src/lib/syscall.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r--src/lib/syscall.zig33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig
index eece736..c2457c6 100644
--- a/src/lib/syscall.zig
+++ b/src/lib/syscall.zig
@@ -4,6 +4,7 @@
const instructions = @import("instructions.zig");
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");
@@ -12,10 +13,10 @@ pub const Error = error{
UnknownSyscall,
};
-pub fn handle(trap_frame: *trap.Frame) !void {
+pub fn handle(proc: *process.Info, trap_frame: *trap.Frame) !void {
switch (trap_frame.general_purpose_registers[17]) {
100000 => uprint(trap_frame),
- 100001 => open(trap_frame),
+ 100001 => open(proc, trap_frame),
100002 => close(trap_frame),
100003 => provideStream(trap_frame),
100004 => provideFile(trap_frame),
@@ -40,12 +41,22 @@ fn uprint(trap_frame: *const trap.Frame) void {
w.print("User message: {s}\r\n", .{str}) catch unreachable;
}
-// open(path: [*:0]const u8) Result(usize) // fixme: Kernel panic if null pointer
-fn open(trap_frame: *const trap.Frame) void {
+// open(path: [*:0]const u8, data: usize) Result(usize) // fixme: Kernel panic if null pointer
+fn open(proc: *process.Info, trap_frame: *trap.Frame) void {
const path: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
-
- _ = path;
- unreachable;
+ const data = trap_frame.general_purpose_registers[11];
+
+ const user_info = vfs.openZ(path, proc.id, data) catch |err| {
+ sysexchange.frameReturn(usize, trap_frame, err);
+ return;
+ };
+ switch (user_info) {
+ .rd => |resource_descriptor| {
+ const maybe_handle = proc.makeRdHandle(resource_descriptor);
+ sysexchange.frameReturn(null, trap_frame, maybe_handle);
+ },
+ .value => |value| sysexchange.frameReturnResult(usize, trap_frame, value),
+ }
}
// close(rd: usize) void
@@ -66,7 +77,7 @@ fn provideStream(trap_frame: *trap.Frame) void {
const readFn: ?vfs.Stream.ReadFn = @ptrFromInt(trap_frame.general_purpose_registers[11]);
const writeFn: ?vfs.Stream.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[12]);
- sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{
+ sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{
.stream = .{
.readFn = readFn,
.writeFn = writeFn,
@@ -88,7 +99,7 @@ fn provideFile(trap_frame: *trap.Frame) void {
const writeFn: ?vfs.File.WriteFn = @ptrFromInt(trap_frame.general_purpose_registers[13]);
const closeFn: ?vfs.File.CloseFn = @ptrFromInt(trap_frame.general_purpose_registers[14]);
- sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{
+ sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{
.file = .{
.openFn = openFn,
.readFn = readFn,
@@ -106,7 +117,7 @@ fn provideHook(trap_frame: *trap.Frame) void {
const path: [*:0]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[10]);
const callback: vfs.Hook.Callback = @ptrFromInt(trap_frame.general_purpose_registers[11]);
- sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{
+ sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{
.hook = .{
.callback = callback,
},
@@ -138,7 +149,7 @@ fn provideDirHook(trap_frame: *trap.Frame) void {
const findFn: vfs.DirHook.FindFn = @ptrFromInt(trap_frame.general_purpose_registers[12]);
const removeFn: vfs.DirHook.RemoveFn = @ptrFromInt(trap_frame.general_purpose_registers[13]);
- sysexchange.frameReturn(trap_frame, vfs.provideResourceZ(path, .{
+ sysexchange.frameReturn(null, trap_frame, vfs.provideResourceZ(path, .{
.dir_hook = .{
.provideFn = provideFn,
.findFn = findFn,