1/* 2 * Compatibility mode system call entry point for x86-64. 3 * 4 * Copyright 2000,2001 Andi Kleen, SuSE Labs. 5 * 6 * $Id: ia32entry.S,v 1.42 2003/11/27 00:55:43 ak Exp $ 7 */ 8 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 16 .macro IA32_ARG_FIXUP 17 movl %edi,%r8d 18 movl %ebp,%r9d 19 xchg %ecx,%esi 20 movl %ebx,%edi 21 movl %edx,%edx /* zero extension */ 22 .endm 23 24/* 25 * 32bit SYSCALL instruction entry. 26 */ 27ENTRY(ia32_cstar_target) 28 movq $-ENOSYS,%rax 29 sysretl 30 31/* 32 * Emulated IA32 system calls via int 0x80. 33 * 34 * Arguments: 35 * %eax System call number. 36 * %ebx Arg1 37 * %ecx Arg2 38 * %edx Arg3 39 * %esi Arg4 40 * %edi Arg5 41 * %ebp Arg6 [note: not saved in the stack frame, should not be touched] 42 * 43 * Notes: 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 48 * directly. 49 * Assumes it is only called from user space and entered with interrups off. 50 */ 51 52ENTRY(ia32_syscall) 53 swapgs 54 sti 55 movl %eax,%eax 56 pushq %rax 57 cld 58 SAVE_ARGS 59 GET_CURRENT(%r10) 60 testl $PT_TRACESYS,tsk_ptrace(%r10) 61 jne ia32_tracesys 62 cmpl $(IA32_NR_syscalls),%eax 63 jae ia32_badsys 64 IA32_ARG_FIXUP 65 call *ia32_sys_call_table(,%rax,8) # xxx: rip relative 66 movq %rax,RAX-ARGOFFSET(%rsp) 67 jmp int_ret_from_sys_call 68 69ia32_tracesys: 70 SAVE_REST 71 movq $-ENOSYS,RAX(%rsp) 72 movq %rsp,%rdi /* &pt_regs -> arg1 */ 73 call syscall_trace 74 LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */ 75 RESTORE_REST 76 cmpq $(IA32_NR_syscalls),%rax 77 jae 1f 78 IA32_ARG_FIXUP 79 call *ia32_sys_call_table(,%rax,8) 80ia32_tracesys_end: 81 movq %rax,RAX-ARGOFFSET(%rsp) 821: SAVE_REST 83 movq %rsp,%rdi /* &pt_regs -> arg1 */ 84 call syscall_trace 85 RESTORE_REST 86 jmp int_ret_from_sys_call 87 88ia32_badsys: 89 movq $-ENOSYS,RAX-ARGOFFSET(%rsp) 90 movq $0,ORIG_RAX-ARGOFFSET(%rsp) 91 jmp int_ret_from_sys_call 92 93ni_syscall: 94 movq %rax,%rdi 95 jmp sys32_ni_syscall 96 97quiet_ni_syscall: 98 movl $-ENOSYS,%eax 99 ret 100 101 .macro PTREGSCALL label, func 102 .globl \label 103\label: 104 leaq \func(%rip),%rax 105 jmp ia32_ptregs_common 106 .endm 107 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 117 118 .macro PTREGSCALL3 label, func, arg 119 .globl \label 120\label: 121 leaq \func(%rip),%rax 122 leaq -ARGOFFSET+8(%rsp),\arg /* 8 for return address */ 123 jmp ia32_ptregs_common 124 .endm 125 126 PTREGSCALL3 stub32_iopl, sys_iopl, %rsi 127 128ENTRY(ia32_ptregs_common) 129 popq %r11 130 SAVE_REST 131 movq %r11, %r15 132 call *%rax 133 movq %r15, %r11 134 RESTORE_REST 135 pushq %r11 136 ret 137 138 .data 139 .align 8 140 .globl ia32_sys_call_table 141ia32_sys_call_table: 142 .quad ni_syscall /* 0 - old "setup" system call*/ 143 .quad sys_exit 144 .quad stub32_fork 145 .quad sys_read 146 .quad sys_write 147 .quad sys32_open /* 5 */ 148 .quad sys_close 149 .quad sys32_waitpid 150 .quad sys_creat 151 .quad sys_link 152 .quad sys_unlink /* 10 */ 153 .quad stub32_execve 154 .quad sys_chdir 155 .quad sys32_time 156 .quad sys_mknod 157 .quad sys_chmod /* 15 */ 158 .quad sys_lchown16 159 .quad ni_syscall /* old break syscall holder */ 160 .quad ni_syscall /* (old)stat */ 161 .quad sys32_lseek 162 .quad sys_getpid /* 20 */ 163 .quad sys_mount /* mount */ 164 .quad sys_oldumount /* old_umount */ 165 .quad sys_setuid16 166 .quad sys_getuid16 167 .quad sys_stime /* stime */ /* 25 */ 168 .quad sys32_ptrace /* ptrace */ 169 .quad sys_alarm /* XXX sign extension??? */ 170 .quad ni_syscall /* (old)fstat */ 171 .quad sys_pause 172 .quad sys32_utime /* 30 */ 173 .quad ni_syscall /* old stty syscall holder */ 174 .quad ni_syscall /* old gtty syscall holder */ 175 .quad sys_access 176 .quad sys_nice 177 .quad ni_syscall /* 35 */ /* old ftime syscall holder */ 178 .quad sys_sync 179 .quad sys32_kill 180 .quad sys_rename 181 .quad sys_mkdir 182 .quad sys_rmdir /* 40 */ 183 .quad sys_dup 184 .quad sys32_pipe 185 .quad sys32_times 186 .quad ni_syscall /* old prof syscall holder */ 187 .quad sys_brk /* 45 */ 188 .quad sys_setgid16 189 .quad sys_getgid16 190 .quad sys_signal 191 .quad sys_geteuid16 192 .quad sys_getegid16 /* 50 */ 193 .quad sys_acct 194 .quad sys_umount /* new_umount */ 195 .quad ni_syscall /* old lock syscall holder */ 196 .quad sys32_ioctl 197 .quad sys32_fcntl /* 55 */ 198 .quad ni_syscall /* old mpx syscall holder */ 199 .quad sys_setpgid 200 .quad ni_syscall /* old ulimit syscall holder */ 201 .quad sys32_olduname 202 .quad sys_umask /* 60 */ 203 .quad sys_chroot 204 .quad sys32_ustat 205 .quad sys_dup2 206 .quad sys_getppid 207 .quad sys_getpgrp /* 65 */ 208 .quad sys_setsid 209 .quad sys32_sigaction 210 .quad sys_sgetmask 211 .quad sys_ssetmask 212 .quad sys_setreuid16 /* 70 */ 213 .quad sys_setregid16 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 225 .quad sys_symlink 226 .quad ni_syscall /* (old)lstat */ 227 .quad sys_readlink /* 85 */ 228 .quad sys_uselib 229 .quad sys_swapon 230 .quad sys_reboot 231 .quad sys32_oldreaddir 232 .quad sys32_mmap /* 90 */ 233 .quad sys_munmap 234 .quad sys_truncate 235 .quad sys_ftruncate 236 .quad sys_fchmod 237 .quad sys_fchown16 /* 95 */ 238 .quad sys_getpriority 239 .quad sys_setpriority 240 .quad ni_syscall /* old profil syscall holder */ 241 .quad sys32_statfs 242 .quad sys32_fstatfs /* 100 */ 243 .quad sys_ioperm 244 .quad sys32_socketcall 245 .quad sys_syslog 246 .quad sys32_setitimer 247 .quad sys32_getitimer /* 105 */ 248 .quad sys32_newstat 249 .quad sys32_newlstat 250 .quad sys32_newfstat 251 .quad sys32_uname 252 .quad stub32_iopl /* 110 */ 253 .quad sys_vhangup 254 .quad ni_syscall /* old "idle" system call */ 255 .quad sys32_vm86_warning /* vm86old */ 256 .quad sys32_wait4 257 .quad sys_swapoff /* 115 */ 258 .quad sys32_sysinfo 259 .quad sys32_ipc 260 .quad sys_fsync 261 .quad stub32_sigreturn 262 .quad stub32_clone /* 120 */ 263 .quad sys_setdomainname 264 .quad sys_uname 265 .quad sys32_modify_ldt 266 .quad sys32_adjtimex 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 */ 274 .quad sys_getpgid 275 .quad sys_fchdir 276 .quad ni_syscall /* bdflush */ 277 .quad sys_sysfs /* 135 */ 278 .quad sys_personality 279 .quad ni_syscall /* for afs_syscall */ 280 .quad sys_setfsuid16 281 .quad sys_setfsgid16 282 .quad sys_llseek /* 140 */ 283 .quad sys32_getdents 284 .quad sys32_select 285 .quad sys_flock 286 .quad sys_msync 287 .quad sys32_readv /* 145 */ 288 .quad sys32_writev 289 .quad sys_getsid 290 .quad sys_fdatasync 291 .quad sys32_sysctl /* sysctl */ 292 .quad sys_mlock /* 150 */ 293 .quad sys_munlock 294 .quad sys_mlockall 295 .quad sys_munlockall 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 305 .quad sys_mremap 306 .quad sys_setresuid16 307 .quad sys_getresuid16 /* 165 */ 308 .quad sys32_vm86_warning /* vm86 */ 309 .quad sys32_query_module 310 .quad sys_poll 311 .quad sys32_nfsservctl 312 .quad sys_setresgid16 /* 170 */ 313 .quad sys_getresgid16 314 .quad sys_prctl 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 */ 323 .quad sys32_pwrite 324 .quad sys_chown16 325 .quad sys_getcwd 326 .quad sys_capget 327 .quad sys_capset 328 .quad stub32_sigaltstack 329 .quad sys32_sendfile 330 .quad ni_syscall /* streams1 */ 331 .quad ni_syscall /* streams2 */ 332 .quad stub32_vfork /* 190 */ 333 .quad sys32_getrlimit 334 .quad sys32_mmap2 335 .quad sys32_truncate64 336 .quad sys32_ftruncate64 337 .quad sys32_stat64 /* 195 */ 338 .quad sys32_lstat64 339 .quad sys32_fstat64 340 .quad sys_lchown 341 .quad sys_getuid 342 .quad sys_getgid /* 200 */ 343 .quad sys_geteuid 344 .quad sys_getegid 345 .quad sys_setreuid 346 .quad sys_setregid 347 .quad sys_getgroups /* 205 */ 348 .quad sys_setgroups 349 .quad sys_fchown 350 .quad sys_setresuid 351 .quad sys_getresuid 352 .quad sys_setresgid /* 210 */ 353 .quad sys_getresgid 354 .quad sys_chown 355 .quad sys_setuid 356 .quad sys_setgid 357 .quad sys_setfsuid /* 215 */ 358 .quad sys_setfsgid 359 .quad sys_pivot_root 360 .quad sys_mincore 361 .quad sys_madvise 362 .quad sys_getdents64 /* 220 getdents64 */ 363 .quad sys32_fcntl64 364 .quad sys_ni_syscall /* tux */ 365 .quad sys_ni_syscall /* security */ 366 .quad sys_gettid 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 */ 380 .quad sys_tkill 381 .quad sys_sendfile64 382 .quad quiet_ni_syscall /* futex */ 383 .quad quiet_ni_syscall /* sched_setaffinity */ 384 .quad quiet_ni_syscall /* sched_getaffinity */ 385ia32_syscall_end: 386 .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8 387 .quad ni_syscall 388 .endr 389 390 391