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