patch-2.4.20 linux-2.4.20/arch/x86_64/ia32/ia32entry.S
Next file: linux-2.4.20/arch/x86_64/ia32/ipc32.c
Previous file: linux-2.4.20/arch/x86_64/ia32/ia32_signal.c
Back to the patch index
Back to the overall index
- Lines: 391
- Date:
Thu Nov 28 15:53:12 2002
- Orig file:
linux-2.4.19/arch/x86_64/ia32/ia32entry.S
- Orig date:
Wed Dec 31 16:00:00 1969
diff -urN linux-2.4.19/arch/x86_64/ia32/ia32entry.S linux-2.4.20/arch/x86_64/ia32/ia32entry.S
@@ -0,0 +1,390 @@
+/*
+ * Compatibility mode system call entry point for x86-64.
+ *
+ * Copyright 2000,2001 Andi Kleen, SuSE Labs.
+ *
+ * $Id: ia32entry.S,v 1.36 2002/09/12 12:55:05 ak Exp $
+ */
+
+#include <asm/calling.h>
+#include <asm/offset.h>
+#include <asm/current.h>
+#include <linux/linkage.h>
+#include <asm/errno.h>
+#include <asm/ia32_unistd.h>
+
+ .macro IA32_ARG_FIXUP
+ movl %edi,%r8d
+ movl %ebp,%r9d
+ xchg %ecx,%esi
+ movl %ebx,%edi
+ movl %edx,%edx /* zero extension */
+ .endm
+
+/*
+ * 32bit SYSCALL instruction entry.
+ */
+ENTRY(ia32_cstar_target)
+ movq $-ENOSYS,%rax
+ sysretl
+
+/*
+ * Emulated IA32 system calls via int 0x80.
+ *
+ * Arguments:
+ * %eax System call number.
+ * %ebx Arg1
+ * %ecx Arg2
+ * %edx Arg3
+ * %esi Arg4
+ * %edi Arg5
+ * %ebp Arg6 [note: not saved in the stack frame, should not be touched]
+ *
+ * Notes:
+ * Uses the same stack frame as the x86-64 version.
+ * All registers except %eax must be saved (but ptrace may violate that)
+ * Arguments are zero extended. For system calls that want sign extension and
+ * take long arguments a wrapper is needed. Most calls can just be called
+ * directly.
+ * Assumes it is only called from user space and entered with interrups off.
+ */
+
+ENTRY(ia32_syscall)
+ swapgs
+ sti
+ pushq %rax
+ cld
+ SAVE_ARGS
+ GET_CURRENT(%r10)
+ testl $PT_TRACESYS,tsk_ptrace(%r10)
+ jne ia32_tracesys
+ cmpl $(IA32_NR_syscalls),%eax
+ jae ia32_badsys
+ IA32_ARG_FIXUP
+ call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
+ movq %rax,RAX-ARGOFFSET(%rsp)
+ jmp int_ret_from_sys_call
+
+ia32_tracesys:
+ SAVE_REST
+ movq $-ENOSYS,RAX(%rsp)
+ movq %rsp,%rdi /* &pt_regs -> arg1 */
+ call syscall_trace
+ LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */
+ addq $ARGOFFSET,%rsp
+ cmpl $(IA32_NR_syscalls),%eax
+ jae 1f
+ IA32_ARG_FIXUP
+ call *ia32_sys_call_table(,%rax,8)
+ia32_tracesys_end:
+ movq %rax,RAX-ARGOFFSET(%rsp)
+1: SAVE_REST
+ movq %rsp,%rdi /* &pt_regs -> arg1 */
+ call syscall_trace
+ addq $ARGOFFSET,%rsp
+ jmp int_ret_from_sys_call
+
+ia32_badsys:
+ movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
+ jmp int_ret_from_sys_call
+
+ni_syscall:
+ movq %rax,%rdi
+ jmp sys32_ni_syscall
+
+quiet_ni_syscall:
+ movl $-ENOSYS,%eax
+ ret
+
+ .macro PTREGSCALL label, func
+ .globl \label
+\label:
+ leaq \func(%rip),%rax
+ jmp ia32_ptregs_common
+ .endm
+
+ PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn
+ PTREGSCALL stub32_sigreturn, sys32_sigreturn
+ PTREGSCALL stub32_sigaltstack, sys32_sigaltstack
+ PTREGSCALL stub32_sigsuspend, sys32_sigsuspend
+ PTREGSCALL stub32_execve, sys32_execve
+ PTREGSCALL stub32_fork, sys32_fork
+ PTREGSCALL stub32_clone, sys32_clone
+ PTREGSCALL stub32_vfork, sys32_vfork
+ PTREGSCALL stub32_iopl, sys_iopl
+ PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend
+
+ENTRY(ia32_ptregs_common)
+ popq %r11
+ SAVE_REST
+ movq %r11, %r15
+ call *%rax
+ movq %r15, %r11
+ RESTORE_REST
+ pushq %r11
+ ret
+
+ .data
+ .align 8
+ .globl ia32_sys_call_table
+ia32_sys_call_table:
+ .quad ni_syscall /* 0 - old "setup" system call*/
+ .quad sys_exit
+ .quad stub32_fork
+ .quad sys_read
+ .quad sys_write
+ .quad sys_open /* 5 */
+ .quad sys_close
+ .quad sys32_waitpid
+ .quad sys_creat
+ .quad sys_link
+ .quad sys_unlink /* 10 */
+ .quad stub32_execve
+ .quad sys_chdir
+ .quad sys32_time
+ .quad sys_mknod
+ .quad sys_chmod /* 15 */
+ .quad sys_lchown16
+ .quad ni_syscall /* old break syscall holder */
+ .quad ni_syscall /* (old)stat */
+ .quad sys32_lseek
+ .quad sys_getpid /* 20 */
+ .quad sys_mount /* mount */
+ .quad sys_oldumount /* old_umount */
+ .quad sys_setuid16
+ .quad sys_getuid16
+ .quad sys_stime /* stime */ /* 25 */
+ .quad sys32_ptrace /* ptrace */
+ .quad sys_alarm /* XXX sign extension??? */
+ .quad ni_syscall /* (old)fstat */
+ .quad sys_pause
+ .quad sys32_utime /* 30 */
+ .quad ni_syscall /* old stty syscall holder */
+ .quad ni_syscall /* old gtty syscall holder */
+ .quad sys_access
+ .quad sys_nice
+ .quad ni_syscall /* 35 */ /* old ftime syscall holder */
+ .quad sys_sync
+ .quad sys32_kill
+ .quad sys_rename
+ .quad sys_mkdir
+ .quad sys_rmdir /* 40 */
+ .quad sys_dup
+ .quad sys32_pipe
+ .quad sys32_times
+ .quad ni_syscall /* old prof syscall holder */
+ .quad sys_brk /* 45 */
+ .quad sys_setgid16
+ .quad sys_getgid16
+ .quad ni_syscall /* signal */
+ .quad sys_geteuid16
+ .quad sys_getegid16 /* 50 */
+ .quad sys_acct
+ .quad sys_umount /* new_umount */
+ .quad ni_syscall /* old lock syscall holder */
+ .quad sys32_ioctl
+ .quad sys32_fcntl /* 55 */
+ .quad ni_syscall /* old mpx syscall holder */
+ .quad sys_setpgid
+ .quad ni_syscall /* old ulimit syscall holder */
+ .quad sys32_olduname
+ .quad sys_umask /* 60 */
+ .quad sys_chroot
+ .quad sys32_ustat
+ .quad sys_dup2
+ .quad sys_getppid
+ .quad sys_getpgrp /* 65 */
+ .quad sys_setsid
+ .quad sys32_sigaction
+ .quad sys_sgetmask
+ .quad sys_ssetmask
+ .quad sys_setreuid16 /* 70 */
+ .quad sys_setregid16
+ .quad stub32_sigsuspend
+ .quad sys32_sigpending
+ .quad sys_sethostname
+ .quad sys32_setrlimit /* 75 */
+ .quad sys32_old_getrlimit /* old_getrlimit */
+ .quad sys32_getrusage
+ .quad sys32_gettimeofday
+ .quad sys32_settimeofday
+ .quad sys_getgroups16 /* 80 */
+ .quad sys_setgroups16
+ .quad sys32_old_select
+ .quad sys_symlink
+ .quad ni_syscall /* (old)lstat */
+ .quad sys_readlink /* 85 */
+ .quad sys_uselib
+ .quad sys_swapon
+ .quad sys_reboot
+ .quad sys32_oldreaddir
+ .quad sys32_mmap /* 90 */
+ .quad sys_munmap
+ .quad sys_truncate
+ .quad sys_ftruncate
+ .quad sys_fchmod
+ .quad sys_fchown16 /* 95 */
+ .quad sys_getpriority
+ .quad sys_setpriority
+ .quad ni_syscall /* old profil syscall holder */
+ .quad sys32_statfs
+ .quad sys32_fstatfs /* 100 */
+ .quad sys_ioperm
+ .quad sys32_socketcall
+ .quad sys_syslog
+ .quad sys32_setitimer
+ .quad sys32_getitimer /* 105 */
+ .quad sys32_newstat
+ .quad sys32_newlstat
+ .quad sys32_newfstat
+ .quad sys32_uname
+ .quad stub32_iopl /* 110 */
+ .quad sys_vhangup
+ .quad ni_syscall /* old "idle" system call */
+ .quad ni_syscall /* vm86old */
+ .quad sys32_wait4
+ .quad sys_swapoff /* 115 */
+ .quad sys32_sysinfo
+ .quad sys32_ipc
+ .quad sys_fsync
+ .quad stub32_sigreturn
+ .quad stub32_clone /* 120 */
+ .quad sys_setdomainname
+ .quad sys_uname
+ .quad sys_modify_ldt
+ .quad sys32_adjtimex
+ .quad sys32_mprotect /* 125 */
+ .quad sys32_sigprocmask
+ .quad sys32_module_warning /* create_module */
+ .quad sys32_module_warning /* init_module */
+ .quad sys32_module_warning /* delete module */
+ .quad sys32_module_warning /* 130 get_kernel_syms */
+ .quad ni_syscall /* quotactl */
+ .quad sys_getpgid
+ .quad sys_fchdir
+ .quad ni_syscall /* bdflush */
+ .quad sys_sysfs /* 135 */
+ .quad sys_personality
+ .quad ni_syscall /* for afs_syscall */
+ .quad sys_setfsuid16
+ .quad sys_setfsgid16
+ .quad sys_llseek /* 140 */
+ .quad sys32_getdents
+ .quad sys32_select
+ .quad sys_flock
+ .quad sys_msync
+ .quad sys32_readv /* 145 */
+ .quad sys32_writev
+ .quad sys_getsid
+ .quad sys_fdatasync
+ .quad sys32_sysctl /* sysctl */
+ .quad sys_mlock /* 150 */
+ .quad sys_munlock
+ .quad sys_mlockall
+ .quad sys_munlockall
+ .quad sys_sched_setparam
+ .quad sys_sched_getparam /* 155 */
+ .quad sys_sched_setscheduler
+ .quad sys_sched_getscheduler
+ .quad sys_sched_yield
+ .quad sys_sched_get_priority_max
+ .quad sys_sched_get_priority_min /* 160 */
+ .quad sys_sched_rr_get_interval
+ .quad sys32_nanosleep
+ .quad sys_mremap
+ .quad sys_setresuid16
+ .quad sys_getresuid16 /* 165 */
+ .quad ni_syscall /* vm86 */
+ .quad quiet_ni_syscall /* query_module */
+ .quad sys_poll
+ .quad sys32_nfsservctl
+ .quad sys_setresgid16 /* 170 */
+ .quad sys_getresgid16
+ .quad sys_prctl
+ .quad stub32_rt_sigreturn
+ .quad sys32_rt_sigaction
+ .quad sys32_rt_sigprocmask /* 175 */
+ .quad sys32_rt_sigpending
+ .quad sys32_rt_sigtimedwait
+ .quad sys32_rt_sigqueueinfo
+ .quad stub32_rt_sigsuspend
+ .quad sys32_pread /* 180 */
+ .quad sys32_pwrite
+ .quad sys_chown16
+ .quad sys_getcwd
+ .quad sys_capget
+ .quad sys_capset
+ .quad stub32_sigaltstack
+ .quad sys32_sendfile
+ .quad ni_syscall /* streams1 */
+ .quad ni_syscall /* streams2 */
+ .quad stub32_vfork /* 190 */
+ .quad sys32_getrlimit
+ .quad sys32_mmap2
+ .quad sys_truncate
+ .quad sys_ftruncate
+ .quad sys32_stat64 /* 195 */
+ .quad sys32_lstat64
+ .quad sys32_fstat64
+ .quad sys_lchown
+ .quad sys_getuid
+ .quad sys_getgid /* 200 */
+ .quad sys_geteuid
+ .quad sys_getegid
+ .quad sys_setreuid
+ .quad sys_setregid
+ .quad sys_getgroups /* 205 */
+ .quad sys_setgroups
+ .quad sys_fchown
+ .quad sys_setresuid
+ .quad sys_getresuid
+ .quad sys_setresgid /* 210 */
+ .quad sys_getresgid
+ .quad sys_chown
+ .quad sys_setuid
+ .quad sys_setgid
+ .quad sys_setfsuid /* 215 */
+ .quad sys_setfsgid
+ .quad sys_pivot_root
+ .quad sys_mincore
+ .quad sys_madvise
+ .quad sys_getdents64 /* 220 getdents64 */
+ .quad sys32_fcntl64
+ .quad sys_ni_syscall /* tux */
+ .quad sys_ni_syscall /* security */
+ .quad sys_gettid
+ .quad sys_readahead /* 225 */
+ .quad sys_setxattr
+ .quad sys_lsetxattr
+ .quad sys_fsetxattr
+ .quad sys_getxattr
+ .quad sys_lgetxattr /* 230 */
+ .quad sys_fgetxattr
+ .quad sys_listxattr
+ .quad sys_llistxattr
+ .quad sys_flistxattr
+ .quad sys_removexattr /* 235 */
+ .quad sys_lremovexattr
+ .quad sys_fremovexattr
+ .quad sys_tkill /* 238 */
+ .quad sys_ni_syscall /* sendfile64 */
+ .quad sys_ni_syscall /* futex */
+ .quad sys_ni_syscall /* sched_setaffinity */
+ .quad sys_ni_syscall /* sched_getaffinity */
+ .quad sys_ni_syscall /* set_threadarea */
+ .quad sys_ni_syscall /* get_threadarea */
+ .quad sys_ni_syscall /* io_setup */
+ .quad sys_ni_syscall /* io_destroy */
+ .quad sys_ni_syscall /* io_getevents */
+ .quad sys_ni_syscall /* io_submit */
+ .quad sys_ni_syscall /* io_cancel */
+ .quad sys_ni_syscall /* alloc_hugepages */
+ .quad sys_ni_syscall /* free_hugepages */
+ .quad sys_ni_syscall /* exit_group */
+
+ia32_syscall_end:
+ .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
+ .quad ni_syscall
+ .endr
+
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)