diff options
Diffstat (limited to 'arch/ia64/kernel/entry.S')
-rw-r--r-- | arch/ia64/kernel/entry.S | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 1ccbe12a4d84..940a67263629 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
@@ -61,14 +61,13 @@ ENTRY(ia64_execve) | |||
61 | * Allocate 8 input registers since ptrace() may clobber them | 61 | * Allocate 8 input registers since ptrace() may clobber them |
62 | */ | 62 | */ |
63 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) | 63 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) |
64 | alloc loc1=ar.pfs,8,2,4,0 | 64 | alloc loc1=ar.pfs,8,2,3,0 |
65 | mov loc0=rp | 65 | mov loc0=rp |
66 | .body | 66 | .body |
67 | mov out0=in0 // filename | 67 | mov out0=in0 // filename |
68 | ;; // stop bit between alloc and call | 68 | ;; // stop bit between alloc and call |
69 | mov out1=in1 // argv | 69 | mov out1=in1 // argv |
70 | mov out2=in2 // envp | 70 | mov out2=in2 // envp |
71 | add out3=16,sp // regs | ||
72 | br.call.sptk.many rp=sys_execve | 71 | br.call.sptk.many rp=sys_execve |
73 | .ret0: | 72 | .ret0: |
74 | cmp4.ge p6,p7=r8,r0 | 73 | cmp4.ge p6,p7=r8,r0 |
@@ -76,7 +75,6 @@ ENTRY(ia64_execve) | |||
76 | sxt4 r8=r8 // return 64-bit result | 75 | sxt4 r8=r8 // return 64-bit result |
77 | ;; | 76 | ;; |
78 | stf.spill [sp]=f0 | 77 | stf.spill [sp]=f0 |
79 | (p6) cmp.ne pKStk,pUStk=r0,r0 // a successful execve() lands us in user-mode... | ||
80 | mov rp=loc0 | 78 | mov rp=loc0 |
81 | (p6) mov ar.pfs=r0 // clear ar.pfs on success | 79 | (p6) mov ar.pfs=r0 // clear ar.pfs on success |
82 | (p7) br.ret.sptk.many rp | 80 | (p7) br.ret.sptk.many rp |
@@ -484,19 +482,6 @@ GLOBAL_ENTRY(prefetch_stack) | |||
484 | br.ret.sptk.many rp | 482 | br.ret.sptk.many rp |
485 | END(prefetch_stack) | 483 | END(prefetch_stack) |
486 | 484 | ||
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 | GLOBAL_ENTRY(clone) | ||
495 | mov r15=__NR_clone // put syscall number in place | ||
496 | break __BREAK_SYSCALL | ||
497 | br.ret.sptk.many rp | ||
498 | END(clone) | ||
499 | |||
500 | /* | 485 | /* |
501 | * Invoke a system call, but do some tracing before and after the call. | 486 | * Invoke a system call, but do some tracing before and after the call. |
502 | * We MUST preserve the current register frame throughout this routine | 487 | * We MUST preserve the current register frame throughout this routine |
@@ -600,6 +585,27 @@ GLOBAL_ENTRY(ia64_strace_leave_kernel) | |||
600 | .ret4: br.cond.sptk ia64_leave_kernel | 585 | .ret4: br.cond.sptk ia64_leave_kernel |
601 | END(ia64_strace_leave_kernel) | 586 | END(ia64_strace_leave_kernel) |
602 | 587 | ||
588 | ENTRY(call_payload) | ||
589 | .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0) | ||
590 | /* call the kernel_thread payload; fn is in r4, arg - in r5 */ | ||
591 | alloc loc1=ar.pfs,0,3,1,0 | ||
592 | mov loc0=rp | ||
593 | mov loc2=gp | ||
594 | mov out0=r5 // arg | ||
595 | ld8 r14 = [r4], 8 // fn.address | ||
596 | ;; | ||
597 | mov b6 = r14 | ||
598 | ld8 gp = [r4] // fn.gp | ||
599 | ;; | ||
600 | br.call.sptk.many rp=b6 // fn(arg) | ||
601 | .ret12: mov gp=loc2 | ||
602 | mov rp=loc0 | ||
603 | mov ar.pfs=loc1 | ||
604 | /* ... and if it has returned, we are going to userland */ | ||
605 | cmp.ne pKStk,pUStk=r0,r0 | ||
606 | br.ret.sptk.many rp | ||
607 | END(call_payload) | ||
608 | |||
603 | GLOBAL_ENTRY(ia64_ret_from_clone) | 609 | GLOBAL_ENTRY(ia64_ret_from_clone) |
604 | PT_REGS_UNWIND_INFO(0) | 610 | PT_REGS_UNWIND_INFO(0) |
605 | { /* | 611 | { /* |
@@ -616,6 +622,7 @@ GLOBAL_ENTRY(ia64_ret_from_clone) | |||
616 | br.call.sptk.many rp=ia64_invoke_schedule_tail | 622 | br.call.sptk.many rp=ia64_invoke_schedule_tail |
617 | } | 623 | } |
618 | .ret8: | 624 | .ret8: |
625 | (pKStk) br.call.sptk.many rp=call_payload | ||
619 | adds r2=TI_FLAGS+IA64_TASK_SIZE,r13 | 626 | adds r2=TI_FLAGS+IA64_TASK_SIZE,r13 |
620 | ;; | 627 | ;; |
621 | ld4 r2=[r2] | 628 | ld4 r2=[r2] |