aboutsummaryrefslogtreecommitdiff
path: root/src/TrapFrame.zig
blob: 71556ed0c7fa8f5113c89d7e81a36bb033b14f62 (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
31
32
33
34
35
36
37
38
// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org>
//
// SPDX-License-Identifier: AGPL-3.0-or-later

general_purpose_registers: [32]usize, // Offset: 0
floating_point_registers: [32]usize, // Offset: 256
satp: usize, // Offset: 512
stack_pointer: *allowzero u8, // Offset: 520
hart_id: usize, // Offset: 528

const Self = @This();

pub fn setReturnValue(self: *Self, value: anytype) void {
    switch (@typeInfo(@TypeOf(value))) {
        .ErrorUnion => self.returnErrorUnion(value),
        .ErrorSet => self.returnError(value),
        else => self.returnValue(value),
    }
}

fn returnErrorUnion(self: *Self, error_union: anytype) void {
    if (error_union) |value| {
        self.returnValue(value);
    } else |err| {
        self.returnError(err);
    }
}

fn returnError(self: *Self, err: anyerror) void {
    self.general_purpose_registers[11] = @intFromError(err);
}

fn returnValue(self: *Self, value: anytype) void {
    self.general_purpose_registers[11] = 0;
    if (@typeInfo(@TypeOf(value)) != .Void) {
        self.general_purpose_registers[10] = @bitCast(value);
    }
}