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 }