2 * Compatibility mode system call entry point for x86-64.
4 * Copyright 2000,2001 Andi Kleen, SuSE Labs.
6 * $Id: ia32entry.S,v 1.42 2003/11/27 00:55:43 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>
21 movl %edx,%edx /* zero extension */
25 * 32bit SYSCALL instruction entry.
27 ENTRY(ia32_cstar_target)
32 * Emulated IA32 system calls via int 0x80.
35 * %eax System call number.
41 * %ebp Arg6 [note: not saved in the stack frame, should not be touched]
44 * Uses the same stack frame as the x86-64 version.
45 * All registers except %eax must be saved (but ptrace may violate that)
46 * Arguments are zero extended. For system calls that want sign extension and
47 * take long arguments a wrapper is needed. Most calls can just be called
49 * Assumes it is only called from user space and entered with interrups off.
60 testl $PT_TRACESYS,tsk_ptrace(%r10)
62 cmpl $(IA32_NR_syscalls),%eax
65 call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
66 movq %rax,RAX-ARGOFFSET(%rsp)
67 jmp int_ret_from_sys_call
71 movq $-ENOSYS,RAX(%rsp)
72 movq %rsp,%rdi /* &pt_regs -> arg1 */
74 LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */
76 cmpl $(IA32_NR_syscalls),%eax
79 call *ia32_sys_call_table(,%rax,8)
81 movq %rax,RAX-ARGOFFSET(%rsp)
83 movq %rsp,%rdi /* &pt_regs -> arg1 */
86 jmp int_ret_from_sys_call
89 movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
90 movq $0,ORIG_RAX-ARGOFFSET(%rsp)
91 jmp int_ret_from_sys_call
101 .macro PTREGSCALL label, func
104 leaq \func(%rip),%rax
105 jmp ia32_ptregs_common
108 PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn
109 PTREGSCALL stub32_sigreturn, sys32_sigreturn
110 PTREGSCALL stub32_sigaltstack, sys32_sigaltstack
111 PTREGSCALL stub32_sigsuspend, sys32_sigsuspend
112 PTREGSCALL stub32_execve, sys32_execve
113 PTREGSCALL stub32_fork, sys32_fork
114 PTREGSCALL stub32_clone, sys32_clone
115 PTREGSCALL stub32_vfork, sys32_vfork
116 PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend
118 .macro PTREGSCALL3 label, func, arg
121 leaq \func(%rip),%rax
122 leaq -ARGOFFSET+8(%rsp),\arg /* 8 for return address */
123 jmp ia32_ptregs_common
126 PTREGSCALL3 stub32_iopl, sys_iopl, %rsi
128 ENTRY(ia32_ptregs_common)
140 .globl ia32_sys_call_table
142 .quad ni_syscall /* 0 - old "setup" system call*/
147 .quad sys32_open /* 5 */
152 .quad sys_unlink /* 10 */
157 .quad sys_chmod /* 15 */
159 .quad ni_syscall /* old break syscall holder */
160 .quad ni_syscall /* (old)stat */
162 .quad sys_getpid /* 20 */
163 .quad sys_mount /* mount */
164 .quad sys_oldumount /* old_umount */
167 .quad sys_stime /* stime */ /* 25 */
168 .quad sys32_ptrace /* ptrace */
169 .quad sys_alarm /* XXX sign extension??? */
170 .quad ni_syscall /* (old)fstat */
172 .quad sys32_utime /* 30 */
173 .quad ni_syscall /* old stty syscall holder */
174 .quad ni_syscall /* old gtty syscall holder */
177 .quad ni_syscall /* 35 */ /* old ftime syscall holder */
182 .quad sys_rmdir /* 40 */
186 .quad ni_syscall /* old prof syscall holder */
187 .quad sys_brk /* 45 */
192 .quad sys_getegid16 /* 50 */
194 .quad sys_umount /* new_umount */
195 .quad ni_syscall /* old lock syscall holder */
197 .quad sys32_fcntl /* 55 */
198 .quad ni_syscall /* old mpx syscall holder */
200 .quad ni_syscall /* old ulimit syscall holder */
202 .quad sys_umask /* 60 */
207 .quad sys_getpgrp /* 65 */
209 .quad sys32_sigaction
212 .quad sys_setreuid16 /* 70 */
214 .quad stub32_sigsuspend
215 .quad sys32_sigpending
216 .quad sys_sethostname
217 .quad sys32_setrlimit /* 75 */
218 .quad sys32_old_getrlimit /* old_getrlimit */
219 .quad sys32_getrusage
220 .quad sys32_gettimeofday
221 .quad sys32_settimeofday
222 .quad sys_getgroups16 /* 80 */
223 .quad sys_setgroups16
224 .quad sys32_old_select
226 .quad ni_syscall /* (old)lstat */
227 .quad sys_readlink /* 85 */
231 .quad sys32_oldreaddir
232 .quad sys32_mmap /* 90 */
237 .quad sys_fchown16 /* 95 */
238 .quad sys_getpriority
239 .quad sys_setpriority
240 .quad ni_syscall /* old profil syscall holder */
242 .quad sys32_fstatfs /* 100 */
244 .quad sys32_socketcall
246 .quad sys32_setitimer
247 .quad sys32_getitimer /* 105 */
252 .quad stub32_iopl /* 110 */
254 .quad ni_syscall /* old "idle" system call */
255 .quad sys32_vm86_warning /* vm86old */
257 .quad sys_swapoff /* 115 */
261 .quad stub32_sigreturn
262 .quad stub32_clone /* 120 */
263 .quad sys_setdomainname
265 .quad sys32_modify_ldt
267 .quad sys32_mprotect /* 125 */
268 .quad sys32_sigprocmask
269 .quad sys32_create_module
270 .quad sys32_init_module
271 .quad sys32_delete_module
272 .quad sys32_get_kernel_syms /* 130 */
273 .quad ni_syscall /* quotactl */
276 .quad ni_syscall /* bdflush */
277 .quad sys_sysfs /* 135 */
278 .quad sys_personality
279 .quad ni_syscall /* for afs_syscall */
282 .quad sys_llseek /* 140 */
287 .quad sys32_readv /* 145 */
291 .quad sys32_sysctl /* sysctl */
292 .quad sys_mlock /* 150 */
296 .quad sys_sched_setparam
297 .quad sys_sched_getparam /* 155 */
298 .quad sys_sched_setscheduler
299 .quad sys_sched_getscheduler
300 .quad sys_sched_yield
301 .quad sys_sched_get_priority_max
302 .quad sys_sched_get_priority_min /* 160 */
303 .quad sys_sched_rr_get_interval
304 .quad sys32_nanosleep
306 .quad sys_setresuid16
307 .quad sys_getresuid16 /* 165 */
308 .quad sys32_vm86_warning /* vm86 */
309 .quad sys32_query_module
311 .quad sys32_nfsservctl
312 .quad sys_setresgid16 /* 170 */
313 .quad sys_getresgid16
315 .quad stub32_rt_sigreturn
316 .quad sys32_rt_sigaction
317 .quad sys32_rt_sigprocmask /* 175 */
318 .quad sys32_rt_sigpending
319 .quad sys32_rt_sigtimedwait
320 .quad sys32_rt_sigqueueinfo
321 .quad stub32_rt_sigsuspend
322 .quad sys32_pread /* 180 */
328 .quad stub32_sigaltstack
330 .quad ni_syscall /* streams1 */
331 .quad ni_syscall /* streams2 */
332 .quad stub32_vfork /* 190 */
333 .quad sys32_getrlimit
335 .quad sys32_truncate64
336 .quad sys32_ftruncate64
337 .quad sys32_stat64 /* 195 */
342 .quad sys_getgid /* 200 */
347 .quad sys_getgroups /* 205 */
352 .quad sys_setresgid /* 210 */
357 .quad sys_setfsuid /* 215 */
362 .quad sys_getdents64 /* 220 getdents64 */
364 .quad sys_ni_syscall /* tux */
365 .quad sys_ni_syscall /* security */
367 .quad sys_readahead /* 225 */
368 .quad quiet_ni_syscall /* xattr syscalls 226-237 */
369 .quad quiet_ni_syscall
370 .quad quiet_ni_syscall
371 .quad quiet_ni_syscall
372 .quad quiet_ni_syscall /* 230 */
373 .quad quiet_ni_syscall
374 .quad quiet_ni_syscall
375 .quad quiet_ni_syscall
376 .quad quiet_ni_syscall
377 .quad quiet_ni_syscall /* 235 */
378 .quad quiet_ni_syscall
379 .quad quiet_ni_syscall /* fremovexattr - 237 */
382 .quad quiet_ni_syscall /* futex */
383 .quad quiet_ni_syscall /* sched_setaffinity */
384 .quad quiet_ni_syscall /* sched_getaffinity */
386 .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8