diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/kernel.zig | 16 | ||||
-rw-r--r-- | src/lib/instructions.zig | 26 | ||||
-rw-r--r-- | src/lib/interrupts.zig | 2 | ||||
-rw-r--r-- | src/lib/paging.zig | 6 | ||||
-rw-r--r-- | src/lib/pci.zig | 23 | ||||
-rw-r--r-- | src/lib/process.zig | 6 |
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(®); + 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(®); + 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 ( |