.. | .. |
---|
185 | 185 | ldw r5, PT_R5(sp) |
---|
186 | 186 | |
---|
187 | 187 | local_restart: |
---|
| 188 | + stw r2, PT_ORIG_R2(sp) |
---|
188 | 189 | /* Check that the requested system call is within limits */ |
---|
189 | 190 | movui r1, __NR_syscalls |
---|
190 | 191 | bgeu r2, r1, ret_invsyscall |
---|
.. | .. |
---|
192 | 193 | movhi r11, %hiadj(sys_call_table) |
---|
193 | 194 | add r1, r1, r11 |
---|
194 | 195 | ldw r1, %lo(sys_call_table)(r1) |
---|
195 | | - beq r1, r0, ret_invsyscall |
---|
196 | 196 | |
---|
197 | 197 | /* Check if we are being traced */ |
---|
198 | 198 | GET_THREAD_INFO r11 |
---|
.. | .. |
---|
213 | 213 | translate_rc_and_ret: |
---|
214 | 214 | movi r1, 0 |
---|
215 | 215 | bge r2, zero, 3f |
---|
| 216 | + ldw r1, PT_ORIG_R2(sp) |
---|
| 217 | + addi r1, r1, 1 |
---|
| 218 | + beq r1, zero, 3f |
---|
216 | 219 | sub r2, zero, r2 |
---|
217 | 220 | movi r1, 1 |
---|
218 | 221 | 3: |
---|
.. | .. |
---|
255 | 258 | ldw r6, PT_R6(sp) |
---|
256 | 259 | ldw r7, PT_R7(sp) |
---|
257 | 260 | |
---|
258 | | - /* Fetch the syscall function, we don't need to check the boundaries |
---|
259 | | - * since this is already done. |
---|
260 | | - */ |
---|
| 261 | + /* Fetch the syscall function. */ |
---|
| 262 | + movui r1, __NR_syscalls |
---|
| 263 | + bgeu r2, r1, traced_invsyscall |
---|
261 | 264 | slli r1, r2, 2 |
---|
262 | 265 | movhi r11,%hiadj(sys_call_table) |
---|
263 | 266 | add r1, r1, r11 |
---|
.. | .. |
---|
276 | 279 | translate_rc_and_ret2: |
---|
277 | 280 | movi r1, 0 |
---|
278 | 281 | bge r2, zero, 4f |
---|
| 282 | + ldw r1, PT_ORIG_R2(sp) |
---|
| 283 | + addi r1, r1, 1 |
---|
| 284 | + beq r1, zero, 4f |
---|
279 | 285 | sub r2, zero, r2 |
---|
280 | 286 | movi r1, 1 |
---|
281 | 287 | 4: |
---|
.. | .. |
---|
286 | 292 | call do_syscall_trace_exit |
---|
287 | 293 | RESTORE_SWITCH_STACK |
---|
288 | 294 | br ret_from_exception |
---|
| 295 | + |
---|
| 296 | + /* If the syscall number was invalid return ENOSYS */ |
---|
| 297 | +traced_invsyscall: |
---|
| 298 | + movi r2, -ENOSYS |
---|
| 299 | + br translate_rc_and_ret2 |
---|
289 | 300 | |
---|
290 | 301 | Luser_return: |
---|
291 | 302 | GET_THREAD_INFO r11 /* get thread_info pointer */ |
---|
.. | .. |
---|
336 | 347 | /* skip if no interrupt is pending */ |
---|
337 | 348 | beq r12, r0, ret_from_interrupt |
---|
338 | 349 | |
---|
339 | | - movi r24, -1 |
---|
340 | | - stw r24, PT_ORIG_R2(sp) |
---|
341 | | - |
---|
342 | 350 | /* |
---|
343 | 351 | * Process an external hardware interrupt. |
---|
344 | 352 | */ |
---|
.. | .. |
---|
365 | 373 | ldw r1, PT_ESTATUS(sp) /* check if returning to kernel */ |
---|
366 | 374 | TSTBNZ r1, r1, ESTATUS_EU, Luser_return |
---|
367 | 375 | |
---|
368 | | -#ifdef CONFIG_PREEMPT |
---|
| 376 | +#ifdef CONFIG_PREEMPTION |
---|
369 | 377 | GET_THREAD_INFO r1 |
---|
370 | 378 | ldw r4, TI_PREEMPT_COUNT(r1) |
---|
371 | 379 | bne r4, r0, restore_all |
---|
.. | .. |
---|
389 | 397 | */ |
---|
390 | 398 | ENTRY(sys_clone) |
---|
391 | 399 | SAVE_SWITCH_STACK |
---|
392 | | - addi sp, sp, -4 |
---|
393 | | - stw r7, 0(sp) /* Pass 5th arg thru stack */ |
---|
394 | | - mov r7, r6 /* 4th arg is 3rd of clone() */ |
---|
395 | | - mov r6, zero /* 3rd arg always 0 */ |
---|
396 | | - call do_fork |
---|
397 | | - addi sp, sp, 4 |
---|
| 400 | + subi sp, sp, 4 /* make space for tls pointer */ |
---|
| 401 | + stw r8, 0(sp) /* pass tls pointer (r8) via stack (5th argument) */ |
---|
| 402 | + call nios2_clone |
---|
| 403 | + addi sp, sp, 4 |
---|
398 | 404 | RESTORE_SWITCH_STACK |
---|
399 | 405 | ret |
---|
400 | 406 | |
---|