| ... | ... | @@ -115,6 +115,9 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, |
| 115 | 115 | ); |
| 116 | 116 | } |
| 117 | 117 | |
| 118 | // NOTE: The o32 calling convention requires the callee to reserve 16 bytes for |
| 119 | // the first four arguments even though they're passed in $a0-$a3. |
| 120 | |
| 118 | 121 | pub fn syscall6( |
| 119 | 122 | number: SYS, |
| 120 | 123 | arg1: usize, |
| ... | ... | @@ -146,6 +149,40 @@ pub fn syscall6( |
| 146 | 149 | ); |
| 147 | 150 | } |
| 148 | 151 | |
| 152 | pub fn syscall7( |
| 153 | number: SYS, |
| 154 | arg1: usize, |
| 155 | arg2: usize, |
| 156 | arg3: usize, |
| 157 | arg4: usize, |
| 158 | arg5: usize, |
| 159 | arg6: usize, |
| 160 | arg7: usize, |
| 161 | ) usize { |
| 162 | return asm volatile ( |
| 163 | \\ .set noat |
| 164 | \\ subu $sp, $sp, 32 |
| 165 | \\ sw %[arg5], 16($sp) |
| 166 | \\ sw %[arg6], 20($sp) |
| 167 | \\ sw %[arg7], 24($sp) |
| 168 | \\ syscall |
| 169 | \\ addu $sp, $sp, 32 |
| 170 | \\ blez $7, 1f |
| 171 | \\ subu $2, $0, $2 |
| 172 | \\ 1: |
| 173 | : [ret] "={$2}" (-> usize) |
| 174 | : [number] "{$2}" (@enumToInt(number)), |
| 175 | [arg1] "{$4}" (arg1), |
| 176 | [arg2] "{$5}" (arg2), |
| 177 | [arg3] "{$6}" (arg3), |
| 178 | [arg4] "{$7}" (arg4), |
| 179 | [arg5] "r" (arg5), |
| 180 | [arg6] "r" (arg6), |
| 181 | [arg7] "r" (arg7) |
| 182 | : "memory", "cc", "$7" |
| 183 | ); |
| 184 | } |
| 185 | |
| 149 | 186 | /// This matches the libc clone function. |
| 150 | 187 | pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; |
| 151 | 188 | |