syscall.zig (1306B)
1 const std = @import("std"); 2 const pi = @import("pi"); 3 4 const uart = pi.devices.mini_uart; 5 const interrupts = pi.interrupts; 6 7 comptime { 8 asm ( 9 \\ .global syscall_test; 10 \\ .type syscall_test, %function; 11 \\ syscall_test: 12 \\ mov r0, 0 13 \\ mov r1, 1 14 \\ mov r2, 2 15 \\ mov r3, 3 16 \\ mov r4, 4 17 \\ mov r5, 5 18 \\ mov r6, 6 19 \\ mov r7, 7 20 \\ mov r8, 8 21 \\ mov r9, 9 22 \\ mov r10, 10 23 \\ mov r11, 11 24 \\ mov r12, 12 25 \\ swi 1 26 \\ bx lr 27 ); 28 } 29 extern fn syscall_test() void; 30 31 noinline fn software_interrupt_handler(regs: interrupts.Registers) void { 32 uart.writer.print("instruction=0x{X}\n", .{regs.pc}) catch {}; 33 for (regs.gp, 0..regs.gp.len) |r, i| { 34 uart.writer.print("r{d} = {d}\n", .{ i, r }) catch {}; 35 } 36 uart.writer.print("sp = 0x{X}\n", .{regs.sp}) catch {}; 37 uart.writer.print("lr = 0x{X}\n", .{regs.lr}) catch {}; 38 uart.writer.print("pc = 0x{X}\n", .{regs.pc}) catch {}; 39 } 40 41 pub fn main() !void { 42 uart.set_tx_interrupts(false); 43 interrupts.set_exception_handler(.SoftwareInterrupt, software_interrupt_handler); 44 45 try uart.writer.print("testing syscall\n", .{}); 46 uart.flush(); 47 48 syscall_test(); 49 }