| .. | .. |
|---|
| 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 | |
|---|