diff options
Diffstat (limited to 'arch/ia64/kernel/entry.S')
-rw-r--r-- | arch/ia64/kernel/entry.S | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 6b0648d97b4c..0dea684e1905 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -484,13 +484,6 @@ GLOBAL_ENTRY(prefetch_stack) | |||
484 | br.ret.sptk.many rp | 484 | br.ret.sptk.many rp |
485 | END(prefetch_stack) | 485 | END(prefetch_stack) |
486 | 486 | ||
487 | GLOBAL_ENTRY(kernel_execve) | ||
488 | rum psr.ac | ||
489 | mov r15=__NR_execve // put syscall number in place | ||
490 | break __BREAK_SYSCALL | ||
491 | br.ret.sptk.many rp | ||
492 | END(kernel_execve) | ||
493 | |||
494 | /* | 487 | /* |
495 | * Invoke a system call, but do some tracing before and after the call. | 488 | * Invoke a system call, but do some tracing before and after the call. |
496 | * We MUST preserve the current register frame throughout this routine | 489 | * We MUST preserve the current register frame throughout this routine |
@@ -594,6 +587,27 @@ GLOBAL_ENTRY(ia64_strace_leave_kernel) | |||
594 | .ret4: br.cond.sptk ia64_leave_kernel | 587 | .ret4: br.cond.sptk ia64_leave_kernel |
595 | END(ia64_strace_leave_kernel) | 588 | END(ia64_strace_leave_kernel) |
596 | 589 | ||
590 | ENTRY(call_payload) | ||
591 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0) | ||
592 | /* call the kernel_thread payload; fn is in r4, arg - in r5 */ | ||
593 | alloc loc1=ar.pfs,0,3,1,0 | ||
594 | mov loc0=rp | ||
595 | mov loc2=gp | ||
596 | mov out0=r5 // arg | ||
597 | ld8 r14 = [r4], 8 // fn.address | ||
598 | ;; | ||
599 | mov b6 = r14 | ||
600 | ld8 gp = [r4] // fn.gp | ||
601 | ;; | ||
602 | br.call.sptk.many rp=b6 // fn(arg) | ||
603 | .ret12: mov gp=loc2 | ||
604 | mov rp=loc0 | ||
605 | mov ar.pfs=loc1 | ||
606 | /* ... and if it has returned, we are going to userland */ | ||
607 | cmp.ne pKStk,pUStk=r0,r0 | ||
608 | br.ret.sptk.many rp | ||
609 | END(call_payload) | ||
610 | |||
597 | GLOBAL_ENTRY(ia64_ret_from_clone) | 611 | GLOBAL_ENTRY(ia64_ret_from_clone) |
598 | PT_REGS_UNWIND_INFO(0) | 612 | PT_REGS_UNWIND_INFO(0) |
599 | { /* | 613 | { /* |
@@ -610,6 +624,7 @@ GLOBAL_ENTRY(ia64_ret_from_clone) | |||
610 | br.call.sptk.many rp=ia64_invoke_schedule_tail | 624 | br.call.sptk.many rp=ia64_invoke_schedule_tail |
611 | } | 625 | } |
612 | .ret8: | 626 | .ret8: |
627 | (pKStk) br.call.sptk.many rp=call_payload | ||
613 | adds r2=TI_FLAGS+IA64_TASK_SIZE,r13 | 628 | adds r2=TI_FLAGS+IA64_TASK_SIZE,r13 |
614 | ;; | 629 | ;; |
615 | ld4 r2=[r2] | 630 | ld4 r2=[r2] |