aboutsummaryrefslogtreecommitdiff
path: root/src/lib/trap.zig
blob: 99db8ba97b01d69acb5a7cdf526ca4cbe62fb6f9 (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

pub const Frame = extern struct {
    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

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

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

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

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