patch-2.3.43 linux/arch/ia64/ia32/ia32_entry.S

Next file: linux/arch/ia64/ia32/ia32_signal.c
Previous file: linux/arch/ia64/ia32/binfmt_elf32.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.42/linux/arch/ia64/ia32/ia32_entry.S linux/arch/ia64/ia32/ia32_entry.S
@@ -0,0 +1,255 @@
+#include <asm/offsets.h>
+#include <asm/signal.h>
+
+	.global ia32_ret_from_syscall
+	.proc ia64_ret_from_syscall
+ia32_ret_from_syscall:
+	cmp.ge p6,p7=r8,r0                      // syscall executed successfully?
+	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp    // r2 = &pt_regs.r8
+	;; 
+	st8 [r2]=r8                             // store return value in slot for r8
+	br.cond.sptk.few ia64_leave_kernel
+
+	//
+	// Invoke a system call, but do some tracing before and after the call.
+	// We MUST preserve the current register frame throughout this routine
+	// because some system calls (such as ia64_execve) directly
+	// manipulate ar.pfs.
+	//
+	// Input:
+	//	r15 = syscall number
+	//	b6  = syscall entry point
+	//
+	.global ia32_trace_syscall
+	.proc ia32_trace_syscall
+ia32_trace_syscall:
+	br.call.sptk.few rp=invoke_syscall_trace // give parent a chance to catch syscall args
+.Lret4:	br.call.sptk.few rp=b6			// do the syscall
+.Lret5:	cmp.lt p6,p0=r8,r0			// syscall failed?
+	adds r2=IA64_PT_REGS_R8_OFFSET+16,sp	// r2 = &pt_regs.r8
+	;;
+	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
+.Lret6:	br.cond.sptk.many ia64_leave_kernel	// rp MUST be != ia64_leave_kernel!
+
+	.endp ia32_trace_syscall
+
+	.align 16
+	.global sys32_fork
+	.proc sys32_fork
+sys32_fork:
+	alloc r16=ar.pfs,2,2,3,0;;
+	movl r28=1f
+	mov loc1=rp
+	br.cond.sptk.many save_switch_stack
+1:
+	mov loc0=r16				// save ar.pfs across do_fork
+	adds out2=IA64_SWITCH_STACK_SIZE+16,sp
+	adds r2=IA64_SWITCH_STACK_SIZE+IA64_PT_REGS_R12_OFFSET+16,sp
+	mov out0=SIGCHLD			// out0 = clone_flags
+	;;
+	ld8 out1=[r2]				// fetch usp from pt_regs.r12
+	br.call.sptk.few rp=do_fork
+.ret1:
+	mov ar.pfs=loc0
+	adds sp=IA64_SWITCH_STACK_SIZE,sp	// pop the switch stack
+	mov rp=loc1
+	;;
+	br.ret.sptk.many rp
+	.endp sys32_fork
+
+	.rodata
+	.align 8
+	.globl ia32_syscall_table
+ia32_syscall_table:	
+	data8 sys_ni_syscall	  /* 0	-  old "setup(" system call*/
+	data8 sys_exit
+	data8 sys32_fork
+	data8 sys_read
+	data8 sys_write
+	data8 sys_open		  /* 5 */
+	data8 sys_close
+	data8 sys32_waitpid
+	data8 sys_creat
+	data8 sys_link
+	data8 sys_unlink	  /* 10 */
+	data8 sys32_execve
+	data8 sys_chdir
+	data8 sys_ni_syscall /* sys_time is not supported on ia64 */
+	data8 sys_mknod
+	data8 sys_chmod		  /* 15 */
+	data8 sys_lchown
+	data8 sys_ni_syscall	  /* old break syscall holder */
+	data8 sys_ni_syscall
+	data8 sys_lseek
+	data8 sys_getpid	  /* 20 */
+	data8 sys_mount
+	data8 sys_oldumount
+	data8 sys_setuid
+	data8 sys_getuid
+	data8 sys_ni_syscall /* sys_stime is not supported on IA64 */  /* 25 */
+	data8 sys_ptrace
+	data8 sys32_alarm
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall	  /* 30 */
+	data8 sys_ni_syscall	  /* old stty syscall holder */
+	data8 sys_ni_syscall	  /* old gtty syscall holder */
+	data8 sys_access
+	data8 sys_nice
+	data8 sys_ni_syscall	  /* 35 */	  /* old ftime syscall holder */
+	data8 sys_sync
+	data8 sys_kill
+	data8 sys_rename
+	data8 sys_mkdir
+	data8 sys_rmdir		  /* 40 */
+	data8 sys_dup
+	data8 sys32_pipe
+	data8 sys_times
+	data8 sys_ni_syscall	  /* old prof syscall holder */
+	data8 sys_brk		  /* 45 */
+	data8 sys_setgid
+	data8 sys_getgid
+	data8 sys_ni_syscall
+	data8 sys_geteuid
+	data8 sys_getegid	  /* 50 */
+	data8 sys_acct
+	data8 sys_umount	  /* recycled never used phys( */
+	data8 sys_ni_syscall	  /* old lock syscall holder */
+	data8 sys_ioctl
+	data8 sys_fcntl		  /* 55 */
+	data8 sys_ni_syscall	  /* old mpx syscall holder */
+	data8 sys_setpgid
+	data8 sys_ni_syscall	  /* old ulimit syscall holder */
+	data8 sys_ni_syscall
+	data8 sys_umask		  /* 60 */
+	data8 sys_chroot
+	data8 sys_ustat
+	data8 sys_dup2
+	data8 sys_getppid
+	data8 sys_getpgrp	  /* 65 */
+	data8 sys_setsid
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_ni_syscall
+	data8 sys_setreuid	  /* 70 */
+	data8 sys_setregid
+	data8 sys_ni_syscall
+	data8 sys_sigpending
+	data8 sys_sethostname
+	data8 sys32_setrlimit	  /* 75 */
+	data8 sys32_getrlimit
+	data8 sys_getrusage
+	data8 sys32_gettimeofday
+	data8 sys32_settimeofday
+	data8 sys_getgroups	  /* 80 */
+	data8 sys_setgroups
+	data8 sys_ni_syscall
+	data8 sys_symlink
+	data8 sys_ni_syscall
+	data8 sys_readlink	  /* 85 */
+	data8 sys_uselib
+	data8 sys_swapon
+	data8 sys_reboot
+	data8 sys32_readdir
+	data8 sys32_mmap	  /* 90 */
+	data8 sys_munmap
+	data8 sys_truncate
+	data8 sys_ftruncate
+	data8 sys_fchmod
+	data8 sys_fchown	  /* 95 */
+	data8 sys_getpriority
+	data8 sys_setpriority
+	data8 sys_ni_syscall	  /* old profil syscall holder */
+	data8 sys32_statfs
+	data8 sys32_fstatfs	  /* 100 */
+	data8 sys_ioperm
+	data8 sys32_socketcall
+	data8 sys_syslog
+	data8 sys32_setitimer
+	data8 sys32_getitimer	  /* 105 */
+	data8 sys32_newstat
+	data8 sys32_newlstat
+	data8 sys32_newfstat
+	data8 sys_ni_syscall
+	data8 sys_iopl		  /* 110 */
+	data8 sys_vhangup
+	data8 sys_ni_syscall		// used to be sys_idle
+	data8 sys_ni_syscall
+	data8 sys32_wait4
+	data8 sys_swapoff	  /* 115 */
+	data8 sys_sysinfo
+	data8 sys32_ipc
+	data8 sys_fsync
+	data8 sys32_sigreturn
+	data8 sys_clone		  /* 120 */
+	data8 sys_setdomainname
+	data8 sys_newuname
+	data8 sys_modify_ldt
+	data8 sys_adjtimex
+	data8 sys32_mprotect	  /* 125 */
+	data8 sys_sigprocmask
+	data8 sys_create_module
+	data8 sys_init_module
+	data8 sys_delete_module
+	data8 sys_get_kernel_syms  /* 130 */
+	data8 sys_quotactl
+	data8 sys_getpgid
+	data8 sys_fchdir
+	data8 sys_bdflush
+	data8 sys_sysfs		  /* 135 */
+	data8 sys_personality
+	data8 sys_ni_syscall	  /* for afs_syscall */
+	data8 sys_setfsuid
+	data8 sys_setfsgid
+	data8 sys_llseek	  /* 140 */
+	data8 sys32_getdents
+	data8 sys32_select
+	data8 sys_flock
+	data8 sys_msync
+	data8 sys32_readv	  /* 145 */
+	data8 sys32_writev
+	data8 sys_getsid
+	data8 sys_fdatasync
+	data8 sys_sysctl
+	data8 sys_mlock		  /* 150 */
+	data8 sys_munlock
+	data8 sys_mlockall
+	data8 sys_munlockall
+	data8 sys_sched_setparam
+	data8 sys_sched_getparam  /* 155 */
+	data8 sys_sched_setscheduler
+	data8 sys_sched_getscheduler
+	data8 sys_sched_yield
+	data8 sys_sched_get_priority_max
+	data8 sys_sched_get_priority_min	 /* 160 */
+	data8 sys_sched_rr_get_interval
+	data8 sys32_nanosleep
+	data8 sys_mremap
+	data8 sys_setresuid
+	data8 sys_getresuid	  /* 165 */
+	data8 sys_vm86
+	data8 sys_query_module
+	data8 sys_poll
+	data8 sys_nfsservctl
+	data8 sys_setresgid	  /* 170 */
+	data8 sys_getresgid
+	data8 sys_prctl
+	data8 sys32_rt_sigreturn
+	data8 sys32_rt_sigaction
+	data8 sys32_rt_sigprocmask /* 175 */
+	data8 sys_rt_sigpending
+	data8 sys_rt_sigtimedwait
+	data8 sys_rt_sigqueueinfo
+	data8 sys_rt_sigsuspend
+	data8 sys_pread		  /* 180 */
+	data8 sys_pwrite
+	data8 sys_chown
+	data8 sys_getcwd
+	data8 sys_capget
+	data8 sys_capset	  /* 185 */
+	data8 sys_sigaltstack
+	data8 sys_sendfile
+	data8 sys_ni_syscall		  /* streams1 */
+	data8 sys_ni_syscall		  /* streams2 */
+	data8 sys32_vfork	  /* 190 */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)