2 * Compatibility mode system call entry point for x86-64.
4 * Copyright 2000,2001 Andi Kleen, SuSE Labs.
6 * $Id: ia32entry.S,v 1.31 2002/03/24 13:01:45 ak Exp $
9 #include <asm/calling.h>
10 #include <asm/offset.h>
11 #include <asm/current.h>
12 #include <linux/linkage.h>
13 #include <asm/errno.h>
14 #include <asm/ia32_unistd.h>
15 #include <asm/thread_info.h>
22 movl %edx,%edx /* zero extension */
26 * 32bit SYSCALL instruction entry.
27 * It'll probably kill you because it destroys your segments.
28 * Should coredump here, but the next instruction will likely do
31 ENTRY(ia32_cstar_target)
36 * Emulated IA32 system calls via int 0x80.
39 * %eax System call number.
45 * %ebp Arg6 [note: not saved in the stack frame, should not be touched]
48 * Uses the same stack frame as the x86-64 version.
49 * All registers except %eax must be saved (but ptrace may violate that)
50 * Arguments are zero extended. For system calls that want sign extension and
51 * take long arguments a wrapper is needed. Most calls can just be called
53 * Assumes it is only called from user space and entered with interrups off.
63 bt $TIF_SYSCALL_TRACE,threadinfo_flags(%r10)
66 cmpl $(IA32_NR_syscalls),%eax
69 call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
70 movq %rax,RAX-ARGOFFSET(%rsp)
71 jmp int_ret_from_sys_call
75 movq $-ENOSYS,RAX(%rsp) /* really needed? */
76 movq %rsp,%rdi /* &pt_regs -> arg1 */
78 LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */
83 movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
84 jmp int_ret_from_sys_call
90 .macro PTREGSCALL label, func
94 jmp ia32_ptregs_common
97 PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn
98 PTREGSCALL stub32_sigreturn, sys32_sigreturn
99 PTREGSCALL stub32_sigaltstack, sys32_sigaltstack
100 PTREGSCALL stub32_sigsuspend, sys32_sigsuspend
101 PTREGSCALL stub32_execve, sys32_execve
102 PTREGSCALL stub32_fork, sys32_fork
103 PTREGSCALL stub32_clone, sys32_clone
104 PTREGSCALL stub32_vfork, sys32_vfork
105 PTREGSCALL stub32_iopl, sys_iopl
106 PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend
108 ENTRY(ia32_ptregs_common)
121 .quad ni_syscall /* 0 - old "setup" system call*/
126 .quad sys_open /* 5 */
131 .quad sys_unlink /* 10 */
136 .quad sys_chmod /* 15 */
138 .quad ni_syscall /* old break syscall holder */
139 .quad ni_syscall /* (old)stat */
141 .quad sys_getpid /* 20 */
142 .quad sys_mount /* mount */
143 .quad sys_oldumount /* old_umount */
146 .quad ni_syscall /* stime */ /* 25 */
147 .quad sys32_ptrace /* ptrace */
148 .quad sys_alarm /* XXX sign extension??? */
149 .quad ni_syscall /* (old)fstat */
151 .quad sys32_utime /* 30 */
152 .quad ni_syscall /* old stty syscall holder */
153 .quad ni_syscall /* old gtty syscall holder */
156 .quad ni_syscall /* 35 */ /* old ftime syscall holder */
161 .quad sys_rmdir /* 40 */
165 .quad ni_syscall /* old prof syscall holder */
166 .quad sys_brk /* 45 */
169 .quad ni_syscall /* signal */
171 .quad sys_getegid16 /* 50 */
173 .quad sys_umount /* new_umount */
174 .quad ni_syscall /* old lock syscall holder */
176 .quad sys32_fcntl /* 55 */
177 .quad ni_syscall /* old mpx syscall holder */
179 .quad ni_syscall /* old ulimit syscall holder */
181 .quad sys_umask /* 60 */
186 .quad sys_getpgrp /* 65 */
188 .quad sys32_sigaction
191 .quad sys_setreuid16 /* 70 */
193 .quad stub32_sigsuspend
194 .quad sys32_sigpending
195 .quad sys_sethostname
196 .quad sys32_setrlimit /* 75 */
197 .quad sys32_old_getrlimit /* old_getrlimit */
198 .quad sys32_getrusage
199 .quad sys32_gettimeofday
200 .quad sys32_settimeofday
201 .quad sys_getgroups16 /* 80 */
202 .quad sys_setgroups16
203 .quad sys32_old_select
205 .quad ni_syscall /* (old)lstat */
206 .quad sys_readlink /* 85 */
210 .quad sys32_oldreaddir
211 .quad sys32_mmap /* 90 */
216 .quad sys_fchown16 /* 95 */
217 .quad sys_getpriority
218 .quad sys_setpriority
219 .quad ni_syscall /* old profil syscall holder */
221 .quad sys32_fstatfs /* 100 */
223 .quad sys32_socketcall
225 .quad sys32_setitimer
226 .quad sys32_getitimer /* 105 */
231 .quad stub32_iopl /* 110 */
233 .quad ni_syscall /* old "idle" system call */
234 .quad ni_syscall /* vm86old */
236 .quad sys_swapoff /* 115 */
240 .quad stub32_sigreturn
241 .quad stub32_clone /* 120 */
242 .quad sys_setdomainname
246 .quad sys32_mprotect /* 125 */
247 .quad sys32_sigprocmask
248 .quad sys32_module_warning /* create_module */
249 .quad sys32_module_warning /* init_module */
250 .quad sys32_module_warning /* delete module */
251 .quad sys32_module_warning /* 130 get_kernel_syms */
252 .quad ni_syscall /* quotactl */
255 .quad ni_syscall /* bdflush */
256 .quad sys_sysfs /* 135 */
257 .quad sys_personality
258 .quad ni_syscall /* for afs_syscall */
261 .quad sys_llseek /* 140 */
266 .quad sys32_readv /* 145 */
270 .quad sys32_sysctl /* sysctl */
271 .quad sys_mlock /* 150 */
275 .quad sys_sched_setparam
276 .quad sys_sched_getparam /* 155 */
277 .quad sys_sched_setscheduler
278 .quad sys_sched_getscheduler
279 .quad sys_sched_yield
280 .quad sys_sched_get_priority_max
281 .quad sys_sched_get_priority_min /* 160 */
282 .quad sys_sched_rr_get_interval
283 .quad sys32_nanosleep
285 .quad sys_setresuid16
286 .quad sys_getresuid16 /* 165 */
287 .quad ni_syscall /* vm86 */
288 .quad ni_syscall /* query_module */
290 .quad sys32_nfsservctl
291 .quad sys_setresgid16 /* 170 */
292 .quad sys_getresgid16
294 .quad stub32_rt_sigreturn
295 .quad sys32_rt_sigaction
296 .quad sys32_rt_sigprocmask /* 175 */
297 .quad sys32_rt_sigpending
298 .quad sys32_rt_sigtimedwait
299 .quad sys32_rt_sigqueueinfo
300 .quad stub32_rt_sigsuspend
301 .quad sys32_pread /* 180 */
307 .quad stub32_sigaltstack
309 .quad ni_syscall /* streams1 */
310 .quad ni_syscall /* streams2 */
311 .quad stub32_vfork /* 190 */
312 .quad sys32_getrlimit
316 .quad sys32_stat64 /* 195 */
321 .quad sys_getgid /* 200 */
326 .quad sys32_getgroups /* 205 */
327 .quad sys32_setgroups
329 .quad sys32_setresuid
330 .quad sys32_getresuid
331 .quad sys32_setresgid /* 210 */
332 .quad sys32_getresgid
336 .quad sys_setfsuid /* 215 */
341 .quad sys_getdents64 /* 220 getdents64 */
343 .quad sys_ni_syscall /* tux */
344 .quad sys_ni_syscall /* security */
346 .quad sys_readahead /* 225 */
351 .quad sys_lgetxattr /* 230 */
356 .quad sys_removexattr /* 235 */
357 .quad sys_lremovexattr
358 .quad sys_fremovexattr
359 .quad sys_tkill /* 238 */
362 .quad sys32_sched_setaffinity
363 .quad sys32_sched_getaffinity
365 .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8