patch-2.4.4 linux/arch/ia64/ia32/ia32_entry.S
Next file: linux/arch/ia64/ia32/ia32_support.c
Previous file: linux/arch/ia64/ia32/binfmt_elf32.c
Back to the patch index
Back to the overall index
- Lines: 183
- Date:
Thu Apr 5 12:51:47 2001
- Orig file:
v2.4.3/linux/arch/ia64/ia32/ia32_entry.S
- Orig date:
Thu Jan 4 12:50:17 2001
diff -u --recursive --new-file v2.4.3/linux/arch/ia64/ia32/ia32_entry.S linux/arch/ia64/ia32/ia32_entry.S
@@ -4,11 +4,34 @@
#include "../kernel/entry.h"
+ /*
+ * execve() is special because in case of success, we need to
+ * setup a null register window frame (in case an IA-32 process
+ * is exec'ing an IA-64 program).
+ */
+ENTRY(ia32_execve)
+ .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(3)
+ alloc loc1=ar.pfs,3,2,4,0
+ mov loc0=rp
+ .body
+ mov out0=in0 // filename
+ ;; // stop bit between alloc and call
+ mov out1=in1 // argv
+ mov out2=in2 // envp
+ add out3=16,sp // regs
+ br.call.sptk.few rp=sys32_execve
+1: cmp4.ge p6,p0=r8,r0
+ mov ar.pfs=loc1 // restore ar.pfs
+ ;;
+(p6) mov ar.pfs=r0 // clear ar.pfs in case of success
+ sxt4 r8=r8 // return 64-bit result
+ mov rp=loc0
+ br.ret.sptk.few rp
+END(ia32_execve)
+
//
// Get possibly unaligned sigmask argument into an aligned
// kernel buffer
- .text
-
GLOBAL_ENTRY(ia32_rt_sigsuspend)
// We'll cheat and not do an alloc here since we are ultimately
// going to do a simple branch to the IA64 sys_rt_sigsuspend.
@@ -16,38 +39,30 @@
// We copy this 4-byte aligned value to an 8-byte aligned buffer
// in the task structure and then jump to the IA64 code.
- mov r8=r0 // no memory access errors yet
- add r10=4,r32
- ;;
-1:
- ld4 r2=[r32] // get first half of sigmask
- ld4 r3=[r10] // get second half of sigmask
-2:
- cmp.lt p6,p0=r8,r0 // check memory access
+ EX(.Lfail, ld4 r2=[r32],4) // load low part of sigmask
;;
-(p6) br.ret.sptk.many rp // it failed
-
+ EX(.Lfail, ld4 r3=[r32]) // load high part of sigmask
adds r32=IA64_TASK_THREAD_SIGMASK_OFFSET,r13
+ ;;
+ st8 [r32]=r2
adds r10=IA64_TASK_THREAD_SIGMASK_OFFSET+4,r13
;;
- st4 [r32]=r2
+
st4 [r10]=r3
br.cond.sptk.many sys_rt_sigsuspend
-END(ia32_rt_sigsuspend)
- .section __ex_table,"a"
- data4 @gprel(1b)
- data4 (2b-1b)|1
- .previous
+.Lfail: br.ret.sptk.many rp // failed to read sigmask
+END(ia32_rt_sigsuspend)
GLOBAL_ENTRY(ia32_ret_from_syscall)
PT_REGS_UNWIND_INFO(0)
cmp.ge p6,p7=r8,r0 // syscall executed successfully?
adds r2=IA64_PT_REGS_R8_OFFSET+16,sp // r2 = &pt_regs.r8
- ;;
+ ;;
+ alloc r3=ar.pfs,0,0,0,0 // drop the syscall argument frame
st8 [r2]=r8 // store return value in slot for r8
- br.cond.sptk.few ia64_leave_kernel
+ br.cond.sptk.many ia64_leave_kernel
END(ia32_ret_from_syscall)
//
@@ -69,7 +84,8 @@
;;
st8.spill [r2]=r8 // store return value in slot for r8
br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch return value
-.ret2: br.cond.sptk.many ia64_leave_kernel // rp MUST be != ia64_leave_kernel!
+.ret2: alloc r2=ar.pfs,0,0,0,0 // drop the syscall argument frame
+ br.cond.sptk.many ia64_leave_kernel // rp MUST be != ia64_leave_kernel!
END(ia32_trace_syscall)
GLOBAL_ENTRY(sys32_vfork)
@@ -79,7 +95,7 @@
END(sys32_vfork)
GLOBAL_ENTRY(sys32_fork)
- UNW(.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2))
+ .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
alloc r16=ar.pfs,2,2,4,0
mov out0=SIGCHLD // out0 = clone_flags
;;
@@ -88,14 +104,14 @@
mov loc1=r16 // save ar.pfs across do_fork
DO_SAVE_SWITCH_STACK
- UNW(.body)
+ .body
mov out1=0
mov out3=0
adds out2=IA64_SWITCH_STACK_SIZE+16,sp // out2 = ®s
br.call.sptk.few rp=do_fork
.ret3: mov ar.pfs=loc1
- UNW(.restore sp)
+ .restore sp
adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack
mov rp=loc0
br.ret.sptk.many rp
@@ -104,7 +120,7 @@
.rodata
.align 8
.globl ia32_syscall_table
-ia32_syscall_table:
+ia32_syscall_table:
data8 sys32_ni_syscall /* 0 - old "setup(" system call*/
data8 sys_exit
data8 sys32_fork
@@ -116,7 +132,7 @@
data8 sys_creat
data8 sys_link
data8 sys_unlink /* 10 */
- data8 sys32_execve
+ data8 ia32_execve
data8 sys_chdir
data8 sys32_time
data8 sys_mknod
@@ -133,8 +149,8 @@
data8 sys32_ni_syscall /* sys_stime is not supported on IA64 */ /* 25 */
data8 sys32_ptrace
data8 sys32_alarm
- data8 sys_pause
data8 sys32_ni_syscall
+ data8 sys_pause
data8 ia32_utime /* 30 */
data8 sys32_ni_syscall /* old stty syscall holder */
data8 sys32_ni_syscall /* old gtty syscall holder */
@@ -153,7 +169,7 @@
data8 sys_brk /* 45 */
data8 sys_setgid
data8 sys_getgid
- data8 sys32_ni_syscall
+ data8 sys32_signal
data8 sys_geteuid
data8 sys_getegid /* 50 */
data8 sys_acct
@@ -227,7 +243,7 @@
data8 sys32_sigreturn
data8 sys_clone /* 120 */
data8 sys_setdomainname
- data8 sys_newuname
+ data8 sys32_newuname
data8 sys_modify_ldt
data8 sys_adjtimex
data8 sys32_mprotect /* 125 */
@@ -249,12 +265,12 @@
data8 sys32_getdents
data8 sys32_select
data8 sys_flock
- data8 sys_msync
+ data8 sys32_msync
data8 sys32_readv /* 145 */
data8 sys32_writev
data8 sys_getsid
data8 sys_fdatasync
- data8 sys_sysctl
+ data8 sys32_sysctl
data8 sys_mlock /* 150 */
data8 sys_munlock
data8 sys_mlockall
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)