sylveos

Toy Operating System
Log | Files | Refs

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 }