aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/kernel/entry.S
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-10-14 15:43:06 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-10-19 14:28:09 -0400
commit54d496c3915a10b5e46c5dd9de1a6d301ceb32bd (patch)
treed55abe04fe72f9c348256cd64917d2bcfde76965 /arch/ia64/kernel/entry.S
parentc19e6d67e4be16e20ff90f0baa98b16d926d23a5 (diff)
ia64: switch to generic kernel_thread()/kernel_execve()
Acked-by: Tony Luck <tony.luck@intel.com> Tested-by: Tony Luck <tony.luck@intel.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/ia64/kernel/entry.S')
-rw-r--r--arch/ia64/kernel/entry.S29
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
485END(prefetch_stack) 485END(prefetch_stack)
486 486
487GLOBAL_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
492END(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
595END(ia64_strace_leave_kernel) 588END(ia64_strace_leave_kernel)
596 589
590ENTRY(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
609END(call_payload)
610
597GLOBAL_ENTRY(ia64_ret_from_clone) 611GLOBAL_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]