zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

blob b8d8a163 (2637B) - Raw


      1 usingnamespace @import("../bits.zig");
      2 
      3 pub fn syscall0(number: usize) usize {
      4     return asm volatile ("svc #0"
      5         : [ret] "={x0}" (-> usize)
      6         : [number] "{x8}" (number)
      7         : "memory", "cc"
      8     );
      9 }
     10 
     11 pub fn syscall1(number: usize, arg1: usize) usize {
     12     return asm volatile ("svc #0"
     13         : [ret] "={x0}" (-> usize)
     14         : [number] "{x8}" (number),
     15           [arg1] "{x0}" (arg1)
     16         : "memory", "cc"
     17     );
     18 }
     19 
     20 pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
     21     return asm volatile ("svc #0"
     22         : [ret] "={x0}" (-> usize)
     23         : [number] "{x8}" (number),
     24           [arg1] "{x0}" (arg1),
     25           [arg2] "{x1}" (arg2)
     26         : "memory", "cc"
     27     );
     28 }
     29 
     30 pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
     31     return asm volatile ("svc #0"
     32         : [ret] "={x0}" (-> usize)
     33         : [number] "{x8}" (number),
     34           [arg1] "{x0}" (arg1),
     35           [arg2] "{x1}" (arg2),
     36           [arg3] "{x2}" (arg3)
     37         : "memory", "cc"
     38     );
     39 }
     40 
     41 pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
     42     return asm volatile ("svc #0"
     43         : [ret] "={x0}" (-> usize)
     44         : [number] "{x8}" (number),
     45           [arg1] "{x0}" (arg1),
     46           [arg2] "{x1}" (arg2),
     47           [arg3] "{x2}" (arg3),
     48           [arg4] "{x3}" (arg4)
     49         : "memory", "cc"
     50     );
     51 }
     52 
     53 pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
     54     return asm volatile ("svc #0"
     55         : [ret] "={x0}" (-> usize)
     56         : [number] "{x8}" (number),
     57           [arg1] "{x0}" (arg1),
     58           [arg2] "{x1}" (arg2),
     59           [arg3] "{x2}" (arg3),
     60           [arg4] "{x3}" (arg4),
     61           [arg5] "{x4}" (arg5)
     62         : "memory", "cc"
     63     );
     64 }
     65 
     66 pub fn syscall6(
     67     number: usize,
     68     arg1: usize,
     69     arg2: usize,
     70     arg3: usize,
     71     arg4: usize,
     72     arg5: usize,
     73     arg6: usize,
     74 ) usize {
     75     return asm volatile ("svc #0"
     76         : [ret] "={x0}" (-> usize)
     77         : [number] "{x8}" (number),
     78           [arg1] "{x0}" (arg1),
     79           [arg2] "{x1}" (arg2),
     80           [arg3] "{x2}" (arg3),
     81           [arg4] "{x3}" (arg4),
     82           [arg5] "{x4}" (arg5),
     83           [arg6] "{x5}" (arg6)
     84         : "memory", "cc"
     85     );
     86 }
     87 
     88 /// This matches the libc clone function.
     89 pub extern fn clone(func: extern fn (arg: usize) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize;
     90 
     91 pub const restore = restore_rt;
     92 
     93 pub nakedcc fn restore_rt() void {
     94     return asm volatile ("svc #0"
     95         :
     96         : [number] "{x8}" (usize(SYS_rt_sigreturn))
     97         : "memory", "cc"
     98     );
     99 }