diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/interrupts.zig | 2 | ||||
-rw-r--r-- | src/main.zig | 4 | ||||
-rw-r--r-- | src/process.zig | 5 | ||||
-rw-r--r-- | src/sbi/time.zig | 4 |
4 files changed, 9 insertions, 6 deletions
diff --git a/src/interrupts.zig b/src/interrupts.zig index 4d12f99..5e642bd 100644 --- a/src/interrupts.zig +++ b/src/interrupts.zig @@ -102,7 +102,7 @@ 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.interruptInSeconds(null, 1) catch |err| { + 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| { diff --git a/src/main.zig b/src/main.zig index 2b44fd7..b046465 100644 --- a/src/main.zig +++ b/src/main.zig @@ -13,7 +13,6 @@ const paging = @import("paging.zig"); const pci = @import("pci.zig"); const plic = @import("plic.zig"); const process = @import("process.zig"); -const time = @import("sbi/time.zig"); const Error = error{ HartIdOutOfRange, @@ -109,8 +108,7 @@ fn run(hart_id: usize, fdt_blob: *fdt.RawHeader, w: debug_console.Writer) !noret try w.print("\r\n", .{}); - try time.interruptInSeconds(null, 1); - try w.print("Timer : 1 Hz\r\n", .{}); + try w.print("Timer : {e} Hz\r\n", .{1 / (@as(f64, process.schedule_interval_millis) / 1000)}); try plic.init(&fdt.default, allocator); try w.print("PLIC : Disabled\r\n", .{}); diff --git a/src/process.zig b/src/process.zig index 045d667..d875871 100644 --- a/src/process.zig +++ b/src/process.zig @@ -6,8 +6,11 @@ const std = @import("std"); const instructions = @import("instructions.zig"); const paging = @import("paging.zig"); +const time = @import("sbi/time.zig"); const trap = @import("trap.zig"); +pub const schedule_interval_millis = 1; + const num_stack_pages = 2; var next_pid: u16 = 1; @@ -159,5 +162,7 @@ pub fn demo(allocator: std.mem.Allocator) !void { proc_node.data = proc; list.prepend(proc_node); + try time.interruptInMillis(null, schedule_interval_millis); + while (true) asm volatile ("wfi"); } diff --git a/src/sbi/time.zig b/src/sbi/time.zig index e10784a..c0d9069 100644 --- a/src/sbi/time.zig +++ b/src/sbi/time.zig @@ -27,7 +27,7 @@ pub fn setTimer(stime_absolute: u64) !void { if (ret.err != 0) return sbi.errorFromCode(ret.err); } -pub fn interruptInSeconds(dt: ?*const fdt.Tree, seconds: u64) !void { +pub fn interruptInMillis(dt: ?*const fdt.Tree, millis: u64) !void { const stime = asm volatile ( \\ csrr %[stime], time : [stime] "=r" (-> u64), @@ -43,7 +43,7 @@ pub fn interruptInSeconds(dt: ?*const fdt.Tree, seconds: u64) !void { frequency = std.mem.readInt(u32, frequency_prop[0..@sizeOf(u32)], .big); } else return Error.TimebaseFrequencyPropTooShort; - const cycles = seconds * frequency; + const cycles = millis / 1000 * frequency; try setTimer(stime + cycles); } |