aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-05-13 20:07:00 +0200
committerHimbeer <himbeer@disroot.org>2024-05-13 20:07:00 +0200
commitb016bb0b246f71d7c487320b9a12dcd7368f8054 (patch)
tree87330cbbfc678a01ea06fc3bcd1cd373ae7aa488
parentd2f716849b284b3c411621961ed318526fd7aeb1 (diff)
interrupts: Fix clock cycle calculation
-rw-r--r--src/interrupts.zig4
-rw-r--r--src/sbi/time.zig2
2 files changed, 2 insertions, 4 deletions
diff --git a/src/interrupts.zig b/src/interrupts.zig
index 5e642bd..efde552 100644
--- a/src/interrupts.zig
+++ b/src/interrupts.zig
@@ -102,9 +102,6 @@ export fn handleTrap(epc: usize, tval: usize, cause_bits: usize, hart_id: usize,
switch (@as(AsyncCause, @enumFromInt(cause.num))) {
.supervisor_software => w.print("Hart {d}: Software interrupt\r\n", .{hart_id}) catch while (true) {},
.supervisor_timer => {
- time.interruptInMillis(null, process.schedule_interval_millis) catch |err| {
- std.debug.panic("Hart {d}: Unable to set interrupt timer: {any}", .{ hart_id, err });
- };
schedule() catch |err| {
std.debug.panic("Hart {d}: Unable to schedule next process: {any}", .{ hart_id, err });
};
@@ -268,6 +265,7 @@ export fn supervisorTrapVector() align(4) callconv(.Naked) noreturn {
fn schedule() !noreturn {
if (process.next()) |next| {
+ try time.interruptInMillis(null, process.schedule_interval_millis);
process.switchTo(next);
}
diff --git a/src/sbi/time.zig b/src/sbi/time.zig
index c0d9069..4700191 100644
--- a/src/sbi/time.zig
+++ b/src/sbi/time.zig
@@ -43,7 +43,7 @@ pub fn interruptInMillis(dt: ?*const fdt.Tree, millis: u64) !void {
frequency = std.mem.readInt(u32, frequency_prop[0..@sizeOf(u32)], .big);
} else return Error.TimebaseFrequencyPropTooShort;
- const cycles = millis / 1000 * frequency;
+ const cycles = frequency / 1000 * millis;
try setTimer(stime + cycles);
}