| ... | @@ -115,6 +115,9 @@ pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, | ... | @@ -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 | pub fn syscall6( | 121 | pub fn syscall6( |
| 119 | number: SYS, | 122 | number: SYS, |
| 120 | arg1: usize, | 123 | arg1: usize, |
| ... | @@ -146,6 +149,40 @@ pub fn syscall6( | ... | @@ -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 | /// This matches the libc clone function. | 186 | /// This matches the libc clone function. |
| 150 | pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: u32, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize; | 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 | |