patch-2.4.0-test5 linux/arch/ia64/kernel/entry.S
Next file: linux/arch/ia64/kernel/fw-emu.c
Previous file: linux/arch/ia64/kernel/efi_stub.S
Back to the patch index
Back to the overall index
- Lines: 279
- Date:
Fri Jul 14 16:08:11 2000
- Orig file:
v2.4.0-test4/linux/arch/ia64/kernel/entry.S
- Orig date:
Fri Jun 23 21:55:07 2000
diff -u --recursive --new-file v2.4.0-test4/linux/arch/ia64/kernel/entry.S linux/arch/ia64/kernel/entry.S
@@ -17,8 +17,6 @@
* pSys: See entry.h.
* pNonSys: !pSys
* p2: (Alias of pKern!) True if any signals are pending.
- * p16/p17: Used by stubs calling ia64_do_signal to indicate if current task
- * has PF_PTRACED flag bit set. p16 is true if so, p17 is the complement.
*/
#include <linux/config.h>
@@ -62,27 +60,41 @@
br.ret.sptk.few rp
END(ia64_execve)
-GLOBAL_ENTRY(sys_clone)
+GLOBAL_ENTRY(sys_clone2)
UNW(.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2))
- alloc r16=ar.pfs,2,2,3,0;;
- mov loc0=rp
+ alloc r16=ar.pfs,3,2,4,0
DO_SAVE_SWITCH_STACK
+ mov loc0=rp
mov loc1=r16 // save ar.pfs across do_fork
UNW(.body)
- adds out2=IA64_SWITCH_STACK_SIZE+16,sp
- adds r2=IA64_SWITCH_STACK_SIZE+IA64_PT_REGS_R12_OFFSET+16,sp
- cmp.eq p8,p9=in1,r0 // usp == 0?
+ mov out1=in1
+ mov out2=in2
+ adds out3=IA64_SWITCH_STACK_SIZE+16,sp // out3 = ®s
mov out0=in0 // out0 = clone_flags
- ;;
-(p8) ld8 out1=[r2] // fetch usp from pt_regs.r12
-(p9) mov out1=in1
br.call.sptk.few rp=do_fork
-.ret1:
+.ret1: UNW(.restore sp)
+ adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack
mov ar.pfs=loc1
- UNW(.restore sp)
+ mov rp=loc0
+ br.ret.sptk.many rp
+END(sys_clone2)
+
+GLOBAL_ENTRY(sys_clone)
+ UNW(.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2))
+ alloc r16=ar.pfs,2,2,4,0
+ DO_SAVE_SWITCH_STACK
+ mov loc0=rp
+ mov loc1=r16 // save ar.pfs across do_fork
+ UNW(.body)
+ mov out1=in1
+ mov out2=0
+ adds out3=IA64_SWITCH_STACK_SIZE+16,sp // out3 = ®s
+ mov out0=in0 // out0 = clone_flags
+ br.call.sptk.few rp=do_fork
+.ret2: UNW(.restore sp)
adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack
+ mov ar.pfs=loc1
mov rp=loc0
- ;;
br.ret.sptk.many rp
END(sys_clone)
@@ -387,9 +399,9 @@
;; // WAW on CFM at the br.call
mov loc0=rp
br.call.sptk.many rp=save_switch_stack_with_current_frame // must preserve b6!!
-.ret2: mov loc2=b6
+.ret4: mov loc2=b6
br.call.sptk.few rp=syscall_trace
-.ret3: adds sp=IA64_SWITCH_STACK_SIZE,sp // drop switch_stack frame
+.ret5: adds sp=IA64_SWITCH_STACK_SIZE,sp // drop switch_stack frame
mov rp=loc0
mov ar.pfs=loc1
mov b6=loc2
@@ -408,26 +420,14 @@
// r15 = syscall number
// b6 = syscall entry point
//
- .global ia64_trace_syscall
.global ia64_strace_leave_kernel
-GLOBAL_ENTRY(ia64_strace_clear_r8)
- // this is where we return after cloning when PF_TRACESYS is on
- PT_REGS_UNWIND_INFO(0)
-# ifdef CONFIG_SMP
- br.call.sptk.few rp=invoke_schedule_tail
-# endif
- mov r8=0
- br strace_check_retval
-END(ia64_strace_clear_r8)
-
-ENTRY(ia64_trace_syscall)
+GLOBAL_ENTRY(ia64_trace_syscall)
PT_REGS_UNWIND_INFO(0)
br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch syscall args
-.ret4: br.call.sptk.few rp=b6 // do the syscall
+.ret6: br.call.sptk.few rp=b6 // do the syscall
strace_check_retval:
-.ret5: cmp.lt p6,p0=r8,r0 // syscall failed?
- ;;
+ cmp.lt p6,p0=r8,r0 // syscall failed?
adds r2=IA64_PT_REGS_R8_OFFSET+16,sp // r2 = &pt_regs.r8
adds r3=IA64_PT_REGS_R8_OFFSET+32,sp // r3 = &pt_regs.r10
mov r10=0
@@ -438,7 +438,7 @@
.mem.offset 8,0; st8.spill [r3]=r10 // clear error indication in slot for r10
ia64_strace_leave_kernel:
br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch return value
-.ret6: br.cond.sptk.many ia64_leave_kernel
+.rety: br.cond.sptk.many ia64_leave_kernel
strace_error:
ld8 r3=[r2] // load pt_regs.r8
@@ -468,18 +468,24 @@
#define rKRBS r22
#define rB6 r21
-GLOBAL_ENTRY(ia64_ret_from_syscall_clear_r8)
+GLOBAL_ENTRY(ia64_ret_from_clone)
PT_REGS_UNWIND_INFO(0)
#ifdef CONFIG_SMP
// In SMP mode, we need to call schedule_tail to complete the scheduling process.
// Called by ia64_switch_to after do_fork()->copy_thread(). r8 contains the
// address of the previously executing task.
br.call.sptk.few rp=invoke_schedule_tail
-.ret7:
-#endif
+.ret8:
+#endif
+ adds r2=IA64_TASK_PTRACE_OFFSET,r13
+ ;;
+ ld8 r2=[r2]
+ ;;
mov r8=0
+ tbit.nz p6,p0=r2,PT_TRACESYS_BIT
+(p6) br strace_check_retval
;; // added stop bits to prevent r8 dependency
-END(ia64_ret_from_syscall_clear_r8)
+END(ia64_ret_from_clone)
// fall through
GLOBAL_ENTRY(ia64_ret_from_syscall)
PT_REGS_UNWIND_INFO(0)
@@ -542,6 +548,7 @@
2:
// check & deliver pending signals:
(p2) br.call.spnt.few rp=handle_signal_delivery
+.ret9:
#if defined(CONFIG_ITANIUM_ASTEP_SPECIFIC) || defined(CONFIG_IA64_SOFTSDV_HACKS)
// Check for lost ticks
rsm psr.i
@@ -555,6 +562,7 @@
;;
cmp.ge p6,p7 = r2, r0
(p6) br.call.spnt.few rp=invoke_ia64_reset_itm
+.ret10:
;;
ssm psr.i
#endif
@@ -749,8 +757,7 @@
mov out0=r8 // Address of previous task
;;
br.call.sptk.few rp=schedule_tail
-.ret8:
- mov ar.pfs=loc1
+.ret11: mov ar.pfs=loc1
mov rp=loc0
br.ret.sptk.many rp
END(invoke_schedule_tail)
@@ -766,7 +773,7 @@
;;
UNW(.body)
br.call.sptk.many rp=ia64_reset_itm
- ;;
+.ret12: ;;
mov ar.pfs=loc1
mov rp=loc0
br.ret.sptk.many rp
@@ -785,8 +792,7 @@
;;
UNW(.body)
br.call.sptk.few rp=do_softirq
-.ret9:
- mov ar.pfs=loc1
+.ret13: mov ar.pfs=loc1
mov rp=loc0
br.ret.sptk.many rp
END(invoke_do_softirq)
@@ -802,8 +808,7 @@
;;
UNW(.body)
br.call.sptk.few rp=schedule
-.ret10:
- mov ar.pfs=loc1
+.ret14: mov ar.pfs=loc1
mov rp=loc0
br.ret.sptk.many rp
END(invoke_schedule)
@@ -829,8 +834,7 @@
st8 [sp]=r9,-16 // allocate space for ar.unat and save it
.body
br.call.sptk.few rp=ia64_do_signal
-.ret11:
- .restore sp
+.ret15: .restore sp
adds sp=16,sp // pop scratch stack space
;;
ld8 r9=[sp] // load new unat from sw->caller_unat
@@ -851,8 +855,7 @@
(pSys) mov out2=1 // out2==1 => we're in a syscall
(pNonSys) mov out2=0 // out2==0 => not a syscall
br.call.sptk.few rp=ia64_do_signal
-.ret11:
- // restore the switch stack (ptrace may have modified it)
+.ret16: // restore the switch stack (ptrace may have modified it)
DO_LOAD_SWITCH_STACK( )
br.ret.sptk.many rp
#endif /* !CONFIG_IA64_NEW_UNWIND */
@@ -873,8 +876,7 @@
st8 [sp]=r9,-16 // allocate space for ar.unat and save it
.body
br.call.sptk.few rp=ia64_rt_sigsuspend
-.ret12:
- .restore sp
+.ret17: .restore sp
adds sp=16,sp // pop scratch stack space
;;
ld8 r9=[sp] // load new unat from sw->caller_unat
@@ -893,8 +895,7 @@
mov out1=in1 // sigsetsize
adds out2=16,sp // out1=&sigscratch
br.call.sptk.many rp=ia64_rt_sigsuspend
-.ret12:
- // restore the switch stack (ptrace may have modified it)
+.ret18: // restore the switch stack (ptrace may have modified it)
DO_LOAD_SWITCH_STACK( )
br.ret.sptk.many rp
#endif /* !CONFIG_IA64_NEW_UNWIND */
@@ -912,8 +913,7 @@
;;
adds out0=16,sp // out0 = &sigscratch
br.call.sptk.few rp=ia64_rt_sigreturn
-.ret13:
- adds sp=16,sp // doesn't drop pt_regs, so don't mark it as restoring sp!
+.ret19: adds sp=16,sp // doesn't drop pt_regs, so don't mark it as restoring sp!
PT_REGS_UNWIND_INFO(0) // instead, create a new body section with the smaller frame
;;
ld8 r9=[sp] // load new ar.unat
@@ -937,8 +937,7 @@
adds out0=16,sp // out0 = &sigscratch
br.call.sptk.few rp=ia64_rt_sigreturn
-.ret13:
- adds r3=IA64_SWITCH_STACK_CALLER_UNAT_OFFSET+16,sp
+.ret20: adds r3=IA64_SWITCH_STACK_CALLER_UNAT_OFFSET+16,sp
;;
ld8 r9=[r3] // load new ar.unat
mov b7=r8
@@ -957,9 +956,10 @@
//
PT_REGS_UNWIND_INFO(0)
mov r16=r0
+ UNW(.prologue)
DO_SAVE_SWITCH_STACK
br.call.sptk.few rp=ia64_handle_unaligned // stack frame setup in ivt
-.ret14:
+.ret21: .body
DO_LOAD_SWITCH_STACK(PT_REGS_UNWIND_INFO(0))
br.cond.sptk.many rp // goes to ia64_leave_kernel
END(ia64_prepare_handle_unaligned)
@@ -1206,7 +1206,7 @@
data8 sys_newstat // 1210
data8 sys_newlstat
data8 sys_newfstat
- data8 ia64_ni_syscall
+ data8 sys_clone2
data8 ia64_ni_syscall
data8 ia64_ni_syscall // 1215
data8 ia64_ni_syscall
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)