aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kernel.zig16
-rw-r--r--src/lib/instructions.zig26
-rw-r--r--src/lib/interrupts.zig2
-rw-r--r--src/lib/paging.zig6
-rw-r--r--src/lib/pci.zig23
-rw-r--r--src/lib/process.zig6
6 files changed, 44 insertions, 35 deletions
diff --git a/src/kernel.zig b/src/kernel.zig
index 3f71c01..e84361c 100644
--- a/src/kernel.zig
+++ b/src/kernel.zig
@@ -92,7 +92,7 @@ fn run(hart_id: usize) !noreturn {
try kmem.mapKernel();
- instructions.setSatp(kmem.satp(0));
+ instructions.satp.write(kmem.satp(0));
asm volatile (
\\ la sp, _stack_end
@@ -129,10 +129,11 @@ fn pagedRun() !noreturn {
try w.print("Hart : {d}\r\n", .{hart_data.hart_id});
+ const kmem: *paging.Table = @ptrFromInt(instructions.satp.read().ppn << 12);
try w.print("Paging : Sv39\r\n", .{});
interrupts.init();
- interrupts.setEnabled(interrupts.Enable.all);
+ instructions.sie.write(interrupts.Enable.all);
try w.print("Interrupts : All\r\n", .{});
try w.print("\r\n", .{});
@@ -167,9 +168,7 @@ fn pagedRun() !noreturn {
try w.print("\r\n", .{});
- if (pci.controllerFromHwInfo()) |pci_controller| {
- try w.print("\r\n", .{});
-
+ if (pci.controllerFromHwInfo(kmem)) |pci_controller| {
for (0..256) |bus| {
for (0..32) |device| {
const cfg_space = pci_controller.cfgSpace(@intCast(bus), @intCast(device), 0);
@@ -185,8 +184,11 @@ fn pagedRun() !noreturn {
}
try w.print("\r\n", .{});
- } else {
- try w.print("PCI not present\r\n", .{});
+ } else |err| {
+ switch (err) {
+ error.NoPciController => try w.print("PCI not present\r\n", .{}),
+ else => return err,
+ }
}
try w.print("Enter process demo\r\n", .{});
diff --git a/src/lib/instructions.zig b/src/lib/instructions.zig
index 2ae53ec..81775b2 100644
--- a/src/lib/instructions.zig
+++ b/src/lib/instructions.zig
@@ -4,6 +4,7 @@
const std = @import("std");
+const interrupts = @import("interrupts.zig");
const paging = @import("paging.zig");
pub const SbiRet = struct {
@@ -44,15 +45,26 @@ pub fn stackPointer() usize {
);
}
-pub const setSatp = setCsrFn(paging.Satp, "satp").?;
-pub const setSscratch = setCsrFn(usize, "sscratch").?;
-pub const setSepc = setCsrFn(usize, "sepc").?;
+pub const satp = Csr(paging.Satp, "satp");
+pub const sie = Csr(interrupts.Enable, "sie");
+pub const sscratch = Csr(usize, "sscratch");
+pub const sepc = Csr(usize, "sepc");
-pub fn setCsrFn(comptime T: type, csr: []const u8) ?fn (T) callconv(.Inline) void {
- if (csr.len > 8) return null;
+pub fn Csr(comptime T: type, csr: []const u8) type {
+ if (csr.len > 8) @compileError("CSR name length exceeds 8 characters");
return struct {
- inline fn setCsr(value: T) void {
+ pub inline fn read() T {
+ comptime var buf = [_]u8{0} ** 23;
+
+ const bits = asm volatile (std.fmt.bufPrint(buf[0..], "csrr %[bits], {s}", .{csr}) catch unreachable
+ : [bits] "=r" (-> usize),
+ );
+
+ return @bitCast(bits);
+ }
+
+ pub inline fn write(value: T) void {
const bits: usize = @bitCast(value);
comptime var buf = [_]u8{0} ** 23;
@@ -62,5 +74,5 @@ pub fn setCsrFn(comptime T: type, csr: []const u8) ?fn (T) callconv(.Inline) voi
: [bits] "r" (bits),
);
}
- }.setCsr;
+ };
}
diff --git a/src/lib/interrupts.zig b/src/lib/interrupts.zig
index 35a20d4..febe660 100644
--- a/src/lib/interrupts.zig
+++ b/src/lib/interrupts.zig
@@ -328,5 +328,3 @@ pub fn init() void {
: [trapframe] "r" (&trap_frame),
);
}
-
-pub const setEnabled = instructions.setCsrFn(Enable, "sie").?;
diff --git a/src/lib/paging.zig b/src/lib/paging.zig
index 1e785e7..52ea5a6 100644
--- a/src/lib/paging.zig
+++ b/src/lib/paging.zig
@@ -441,10 +441,10 @@ pub const Table = struct {
}
pub fn mapDevice(root: *Table, reg: *hwinfo.Reg) !void {
- const physical_start = reg.start & ~(page_size - 1);
- const physical_end = (reg.start + reg.len - 1) & ~(page_size - 1);
+ const physical_start = reg.addr & ~(page_size - 1);
+ const physical_end = (reg.addr + reg.len - 1) & ~(page_size - 1);
- reg.addr = next_mmio_vaddr | (reg.start & (page_size - 1));
+ reg.addr = next_mmio_vaddr | (reg.addr & (page_size - 1));
var paddr = physical_start;
while (paddr <= physical_end) : (paddr += page_size) {
diff --git a/src/lib/pci.zig b/src/lib/pci.zig
index 7b862ee..573ff18 100644
--- a/src/lib/pci.zig
+++ b/src/lib/pci.zig
@@ -5,17 +5,10 @@
const std = @import("std");
const hwinfo = @import("hwinfo.zig");
+const paging = @import("paging.zig");
pub const Error = error{
- NoRootNode,
- NoSoCnode,
- NoAddrCells,
- NoSizeCells,
- NoPcinode,
- NoUnitAddr,
- NoReg,
- NoCompatInfo,
- Incompatible,
+ NoPciController,
};
pub const CamType = enum {
@@ -747,15 +740,19 @@ pub const CfgSpace = packed struct(u576) {
}
};
-pub fn controllerFromHwInfo() ?Controller {
+pub fn controllerFromHwInfo(kmem: *paging.Table) !Controller {
var pcie = hwinfo.byKind(.pcie);
var pci = hwinfo.byKind(.pci);
if (try pcie.next()) |ecam| {
- return Controller{ .enhanced = .{ .reg = ecam.reg.slice(u8) } };
+ var reg = ecam.reg;
+ try kmem.mapDevice(&reg);
+ return Controller{ .enhanced = .{ .reg = reg.slice(u8) } };
} else if (try pci.next()) |cam| {
- return Controller{ .conventional = .{ .reg = cam.reg.slice(u8) } };
+ var reg = cam.reg;
+ try kmem.mapDevice(&reg);
+ return Controller{ .conventional = .{ .reg = reg.slice(u8) } };
} else {
- return null;
+ return Error.NoPciController;
}
}
diff --git a/src/lib/process.zig b/src/lib/process.zig
index 7b3e696..05c6773 100644
--- a/src/lib/process.zig
+++ b/src/lib/process.zig
@@ -93,7 +93,7 @@ pub fn next() ?*Info {
pub fn switchTo(proc: *Info) noreturn {
proc.state = .active;
- instructions.setSscratch(@intFromPtr(&proc.trap_frame));
+ instructions.sscratch.write(@intFromPtr(&proc.trap_frame));
asm volatile (
\\ csrr t0, sstatus
@@ -103,8 +103,8 @@ pub fn switchTo(proc: *Info) noreturn {
\\ csrw sstatus, t0
::: "t0", "t1");
- instructions.setSepc(proc.pc);
- instructions.setSatp(proc.satp());
+ instructions.sepc.write(proc.pc);
+ instructions.satp.write(proc.satp());
// Probably not always needed. Let's not take the risk for now.
asm volatile (