aboutsummaryrefslogtreecommitdiff
path: root/src/lib/syscall.zig
blob: 642d0c45ed3000e0344e9d253302cf5621c04177 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org>
//
// 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{
    UnknownSyscall,
};

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;
}