diff options
author | Himbeer <himbeer@disroot.org> | 2024-05-13 20:07:00 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-05-13 20:07:00 +0200 |
commit | b016bb0b246f71d7c487320b9a12dcd7368f8054 (patch) | |
tree | 87330cbbfc678a01ea06fc3bcd1cd373ae7aa488 | |
parent | d2f716849b284b3c411621961ed318526fd7aeb1 (diff) |
interrupts: Fix clock cycle calculation
-rw-r--r-- | src/interrupts.zig | 4 | ||||
-rw-r--r-- | src/sbi/time.zig | 2 |
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); } |