aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-06-22 12:27:52 +0200
committerHimbeer <himbeer@disroot.org>2024-06-22 12:27:52 +0200
commit3c37cdb7036cb40a51599ddfcbeabd9983b33edc (patch)
tree287a0e77247f4294aabccc577148aae6512e24e6
parentb8cd1321bdaeb25d87492bf8f7e4871440f03935 (diff)
syscall: Add naive uprint syscall
-rw-r--r--src/lib/syscall.zig15
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;
+}