| ... | ... | @@ -1,11 +1,21 @@ |
| 1 | 1 | const plan9 = @import("../plan9.zig"); |
| 2 | | // TODO get ret from inline asm |
| 3 | 2 | // TODO better inline asm |
| 4 | 3 | |
| 5 | | pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usize) usize { |
| 4 | pub fn syscall1(sys: plan9.SYS, arg0: usize) usize { |
| 5 | return asm volatile ( |
| 6 | \\push %%r8 |
| 7 | \\push $0 |
| 8 | \\syscall |
| 9 | \\pop %%r11 |
| 10 | \\pop %%r11 |
| 11 | : [ret] "={rax}" (-> usize), |
| 12 | : [syscall_number] "{rbp}" (@enumToInt(sys)), |
| 13 | [arg0] "{r8}" (arg0), |
| 14 | : "rcx", "rax", "rbp", "r11", "memory" |
| 15 | ); |
| 16 | } |
| 17 | pub fn syscall2(sys: plan9.SYS, arg0: usize, arg1: usize) usize { |
| 6 | 18 | return asm volatile ( |
| 7 | | \\push %%r11 |
| 8 | | \\push %%r10 |
| 9 | 19 | \\push %%r9 |
| 10 | 20 | \\push %%r8 |
| 11 | 21 | \\push $0 |
| ... | ... | @@ -13,29 +23,51 @@ pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usi |
| 13 | 23 | \\pop %%r11 |
| 14 | 24 | \\pop %%r11 |
| 15 | 25 | \\pop %%r11 |
| 26 | : [ret] "={rax}" (-> usize), |
| 27 | : [arg0] "{r8}" (arg0), |
| 28 | [arg1] "{r9}" (arg1), |
| 29 | [syscall_number] "{rbp}" (@enumToInt(sys)), |
| 30 | : "rcx", "rax", "rbp", "r11", "memory" |
| 31 | ); |
| 32 | } |
| 33 | pub fn syscall3(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize) usize { |
| 34 | return asm volatile ( |
| 35 | \\push %%r10 |
| 36 | \\push %%r9 |
| 37 | \\push %%r8 |
| 38 | \\push $0 |
| 39 | \\syscall |
| 40 | \\pop %%r11 |
| 41 | \\pop %%r11 |
| 16 | 42 | \\pop %%r11 |
| 17 | 43 | \\pop %%r11 |
| 18 | 44 | : [ret] "={rax}" (-> usize), |
| 19 | | // : |
| 20 | 45 | : [arg0] "{r8}" (arg0), |
| 21 | 46 | [arg1] "{r9}" (arg1), |
| 22 | 47 | [arg2] "{r10}" (arg2), |
| 23 | | [arg2] "{r11}" (arg3), |
| 24 | 48 | [syscall_number] "{rbp}" (@enumToInt(sys)), |
| 25 | | : "rcx", "rbp", "r11", "memory" |
| 49 | : "rcx", "rax", "rbp", "r11", "memory" |
| 26 | 50 | ); |
| 27 | 51 | } |
| 28 | | pub fn syscall1(sys: plan9.SYS, arg0: usize) void { |
| 29 | | _ = sys; |
| 30 | | asm volatile ( |
| 52 | pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usize) usize { |
| 53 | return asm volatile ( |
| 54 | \\push %%r11 |
| 55 | \\push %%r10 |
| 56 | \\push %%r9 |
| 31 | 57 | \\push %%r8 |
| 32 | 58 | \\push $0 |
| 33 | 59 | \\syscall |
| 34 | 60 | \\pop %%r11 |
| 35 | 61 | \\pop %%r11 |
| 36 | | : |
| 37 | | : [syscall_number] "{rbp}" (@enumToInt(sys)), |
| 38 | | [arg0] "{r8}" (arg0), |
| 39 | | : "rcx", "rbp", "r11", "memory" |
| 62 | \\pop %%r11 |
| 63 | \\pop %%r11 |
| 64 | \\pop %%r11 |
| 65 | : [ret] "={rax}" (-> usize), |
| 66 | : [arg0] "{r8}" (arg0), |
| 67 | [arg1] "{r9}" (arg1), |
| 68 | [arg2] "{r10}" (arg2), |
| 69 | [arg2] "{r11}" (arg3), |
| 70 | [syscall_number] "{rbp}" (@enumToInt(sys)), |
| 71 | : "rcx", "rax", "rbp", "r11", "memory" |
| 40 | 72 | ); |
| 41 | 73 | } |