diff options
Diffstat (limited to 'src/lib/syscall.zig')
-rw-r--r-- | src/lib/syscall.zig | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/lib/syscall.zig b/src/lib/syscall.zig index 8f30972..642d0c4 100644 --- a/src/lib/syscall.zig +++ b/src/lib/syscall.zig @@ -2,6 +2,8 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later +const instructions = @import("instructions.zig"); +const paging = @import("paging.zig"); const trap = @import("trap.zig"); pub const Error = error{ @@ -10,6 +12,19 @@ pub const Error = error{ pub fn handle(trap_frame: *const trap.Frame) !void { switch (trap_frame.general_purpose_registers[17]) { + 100000 => uprint(trap_frame), else => return Error.UnknownSyscall, } } + +fn uprint(trap_frame: *const trap.Frame) void { + const procmem: *paging.Table = @ptrFromInt(instructions.satp.read().ppn << 12); + + const paddr = procmem.translate(trap_frame.general_purpose_registers[10]).?; + + const str_ptr: [*]const u8 = @ptrFromInt(paddr); + const str = str_ptr[0..trap_frame.general_purpose_registers[11]]; + + const w = @import("Console.zig").autoChoose().?.writer(); + w.print("User message: {s}\r\n", .{str}) catch unreachable; +} |