aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interrupts.zig2
-rw-r--r--src/main.zig4
-rw-r--r--src/process.zig5
-rw-r--r--src/sbi/time.zig4
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);
}