diff options
Diffstat (limited to 'src/lib/trap.zig')
-rw-r--r-- | src/lib/trap.zig | 27 |
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); + } + } }; |