aboutsummaryrefslogtreecommitdiff
path: root/src/lib/trap.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/trap.zig')
-rw-r--r--src/lib/trap.zig27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/lib/trap.zig b/src/lib/trap.zig
index 4460cfd..99db8ba 100644
--- a/src/lib/trap.zig
+++ b/src/lib/trap.zig
@@ -8,4 +8,31 @@ pub const Frame = extern struct {
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);
+ }
+ }
};