diff options
author | Himbeer <himbeer@disroot.org> | 2024-06-22 12:27:52 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-06-22 12:27:52 +0200 |
commit | 3c37cdb7036cb40a51599ddfcbeabd9983b33edc (patch) | |
tree | 287a0e77247f4294aabccc577148aae6512e24e6 | |
parent | b8cd1321bdaeb25d87492bf8f7e4871440f03935 (diff) |
syscall: Add naive uprint syscall
-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; +} |