aboutsummaryrefslogtreecommitdiff
path: root/src/lib/interrupts.zig
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-04 13:13:09 +0200
committerHimbeer <himbeer@disroot.org>2024-07-04 13:13:24 +0200
commit5cec5fc15406d9f0d29294d5aacc5bfd9da17577 (patch)
treedde1bc74858135240d87ca43845322a749b4b3f9 /src/lib/interrupts.zig
parent680558985053f99a018190ff84c1851b22cf6665 (diff)
interrupts: Send the process being interrupted back into waiting state
Diffstat (limited to 'src/lib/interrupts.zig')
-rw-r--r--src/lib/interrupts.zig4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/lib/interrupts.zig b/src/lib/interrupts.zig
index 3b1884d..3a012c3 100644
--- a/src/lib/interrupts.zig
+++ b/src/lib/interrupts.zig
@@ -140,6 +140,9 @@ export fn handleTrap(epc: usize, tval: usize, cause_bits: usize, frame: *trap.Fr
},
}
} else {
+ const proc = &process.list.last.?.data;
+ proc.state = .waiting;
+
switch (@as(SyncCause, @enumFromInt(cause.num))) {
.illegal_instruction => {
std.debug.panic("Hart {d}: Illegal instruction, EPC = 0x{x:0>16}", .{ frame.hart_id, epc });
@@ -154,7 +157,6 @@ export fn handleTrap(epc: usize, tval: usize, cause_bits: usize, frame: *trap.Fr
std.debug.panic("Hart {d}: Store/AMO access fault: EPC = 0x{x:0>16}, TVAL = 0x{x:0>16}", .{ frame.hart_id, epc, tval });
},
.ecall => {
- const proc = &process.list.last.?.data;
syscall.handler(proc, frame) catch |err| switch (err) {
syscall.Error.UnknownSyscall => {
const a7 = frame.general_purpose_registers[17];