sylveos

Toy Operating System
Log | Files | Refs

pinned-lookup.zig (1412B)


      1 const std = @import("std");
      2 const pi = @import("pi");
      3 
      4 const interrupts = pi.interrupts;
      5 const faults = pi.faults;
      6 const uart = pi.devices.mini_uart;
      7 
      8 fn data_abort_handler(regs: interrupts.Registers) void {
      9     const far = faults.FAR.get();
     10 
     11     uart.print("got fault on 0x{X} from 0x{X}\n", .{ far, regs.pc });
     12     pi.reboot();
     13 }
     14 
     15 pub fn main() !void {
     16     var buffer: [1024 * 1024]u8 = undefined;
     17     var fba: std.heap.FixedBufferAllocator = .init(&buffer);
     18     const alloc = fba.allocator();
     19 
     20     interrupts.set_exception_handler(.DataAbort, data_abort_handler);
     21 
     22     const map: pi.procmap.ProcMap = try .init(alloc, 1);
     23     try map.enable(1);
     24 
     25     for (map.entries.items, 0..) |entry, n| {
     26         const va = entry.virt_addr;
     27 
     28         uart.print("checking entry n={d} addr=0x{X}\n", .{ n, va });
     29         uart.print("  translation result=0x{X}\n", .{try pi.pinned.get(va)});
     30 
     31         if (!try pi.pinned.is_pinned(va)) {
     32             uart.print("expected 0x{X} to be pinned\n", .{va});
     33 
     34             return;
     35         }
     36 
     37         const pa = try pi.pinned.get(va);
     38 
     39         if (pa != va) {
     40             uart.print("VA address did not match, expected 0x{X}, got 0x{X}", .{ va, pa });
     41         }
     42     }
     43 
     44     uart.print("checking invalid\n", .{});
     45 
     46     if (try pi.pinned.is_pinned(0xDEADFAA0)) {
     47         uart.print("mapped invalid VA\n", .{});
     48     } else {
     49         uart.print("did not mapped invalid VA\n", .{});
     50     }
     51 }