| ... | @@ -1,11 +1,21 @@ | ... | @@ -1,11 +1,21 @@ |
| 1 | const plan9 = @import("../plan9.zig"); | 1 | const plan9 = @import("../plan9.zig"); |
| 2 | // TODO get ret from inline asm | | |
| 3 | // TODO better inline asm | 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 | return asm volatile ( | 18 | return asm volatile ( |
| 7 | \\push %%r11 | | |
| 8 | \\push %%r10 | | |
| 9 | \\push %%r9 | 19 | \\push %%r9 |
| 10 | \\push %%r8 | 20 | \\push %%r8 |
| 11 | \\push $0 | 21 | \\push $0 |
| ... | @@ -13,29 +23,51 @@ pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usi | ... | @@ -13,29 +23,51 @@ pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usi |
| 13 | \\pop %%r11 | 23 | \\pop %%r11 |
| 14 | \\pop %%r11 | 24 | \\pop %%r11 |
| 15 | \\pop %%r11 | 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 | \\pop %%r11 | 42 | \\pop %%r11 |
| 17 | \\pop %%r11 | 43 | \\pop %%r11 |
| 18 | : [ret] "={rax}" (-> usize), | 44 | : [ret] "={rax}" (-> usize), |
| 19 | // : | | |
| 20 | : [arg0] "{r8}" (arg0), | 45 | : [arg0] "{r8}" (arg0), |
| 21 | [arg1] "{r9}" (arg1), | 46 | [arg1] "{r9}" (arg1), |
| 22 | [arg2] "{r10}" (arg2), | 47 | [arg2] "{r10}" (arg2), |
| 23 | [arg2] "{r11}" (arg3), | | |
| 24 | [syscall_number] "{rbp}" (@enumToInt(sys)), | 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 { | 52 | pub fn syscall4(sys: plan9.SYS, arg0: usize, arg1: usize, arg2: usize, arg3: usize) usize { |
| 29 | _ = sys; | 53 | return asm volatile ( |
| 30 | asm volatile ( | 54 | \\push %%r11 |
| | 55 | \\push %%r10 |
| | 56 | \\push %%r9 |
| 31 | \\push %%r8 | 57 | \\push %%r8 |
| 32 | \\push $0 | 58 | \\push $0 |
| 33 | \\syscall | 59 | \\syscall |
| 34 | \\pop %%r11 | 60 | \\pop %%r11 |
| 35 | \\pop %%r11 | 61 | \\pop %%r11 |
| 36 | : | 62 | \\pop %%r11 |
| 37 | : [syscall_number] "{rbp}" (@enumToInt(sys)), | 63 | \\pop %%r11 |
| 38 | [arg0] "{r8}" (arg0), | 64 | \\pop %%r11 |
| 39 | : "rcx", "rbp", "r11", "memory" | 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 | } |