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.1.1.1 2008/10/15 03:26:19 james26_jang 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 pushq %rax 56 cld 57 SAVE_ARGS 58 GET_CURRENT(%r10) 59 testl $PT_TRACESYS,tsk_ptrace(%r10) 60 jne ia32_tracesys 61 cmpl $(IA32_NR_syscalls),%eax 62 jae ia32_badsys 63 IA32_ARG_FIXUP 64 call *ia32_sys_call_table(,%rax,8) # xxx: rip relative 65 movq %rax,RAX-ARGOFFSET(%rsp) 66 jmp int_ret_from_sys_call 67 68ia32_tracesys: 69 SAVE_REST 70 movq $-ENOSYS,RAX(%rsp) 71 movq %rsp,%rdi /* &pt_regs -> arg1 */ 72 call syscall_trace 73 LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */ 74 addq $ARGOFFSET,%rsp 75 cmpl $(IA32_NR_syscalls),%eax 76 jae 1f 77 IA32_ARG_FIXUP 78 call *ia32_sys_call_table(,%rax,8) 79ia32_tracesys_end: 80 movq %rax,RAX-ARGOFFSET(%rsp) 811: SAVE_REST 82 movq %rsp,%rdi /* &pt_regs -> arg1 */ 83 call syscall_trace 84 addq $ARGOFFSET,%rsp 85 jmp int_ret_from_sys_call 86 87ia32_badsys: 88 movq $-ENOSYS,RAX-ARGOFFSET(%rsp) 89 jmp int_ret_from_sys_call 90 91ni_syscall: 92 movq %rax,%rdi 93 jmp sys32_ni_syscall 94 95quiet_ni_syscall: 96 movl $-ENOSYS,%eax 97 ret 98 99 .macro PTREGSCALL label, func 100 .globl \label 101\label: 102 leaq \func(%rip),%rax 103 jmp ia32_ptregs_common 104 .endm 105 106 PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn 107 PTREGSCALL stub32_sigreturn, sys32_sigreturn 108 PTREGSCALL stub32_sigaltstack, sys32_sigaltstack 109 PTREGSCALL stub32_sigsuspend, sys32_sigsuspend 110 PTREGSCALL stub32_execve, sys32_execve 111 PTREGSCALL stub32_fork, sys32_fork 112 PTREGSCALL stub32_clone, sys32_clone 113 PTREGSCALL stub32_vfork, sys32_vfork 114 PTREGSCALL stub32_iopl, sys_iopl 115 PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend 116 117ENTRY(ia32_ptregs_common) 118 popq %r11 119 SAVE_REST 120 movq %r11, %r15 121 call *%rax 122 movq %r15, %r11 123 RESTORE_REST 124 pushq %r11 125 ret 126 127 .data 128 .align 8 129 .globl ia32_sys_call_table 130ia32_sys_call_table: 131 .quad ni_syscall /* 0 - old "setup" system call*/ 132 .quad sys_exit 133 .quad stub32_fork 134 .quad sys_read 135 .quad sys_write 136 .quad sys_open /* 5 */ 137 .quad sys_close 138 .quad sys32_waitpid 139 .quad sys_creat 140 .quad sys_link 141 .quad sys_unlink /* 10 */ 142 .quad stub32_execve 143 .quad sys_chdir 144 .quad sys32_time 145 .quad sys_mknod 146 .quad sys_chmod /* 15 */ 147 .quad sys_lchown16 148 .quad ni_syscall /* old break syscall holder */ 149 .quad ni_syscall /* (old)stat */ 150 .quad sys32_lseek 151 .quad sys_getpid /* 20 */ 152 .quad sys_mount /* mount */ 153 .quad sys_oldumount /* old_umount */ 154 .quad sys_setuid16 155 .quad sys_getuid16 156 .quad sys_stime /* stime */ /* 25 */ 157 .quad sys32_ptrace /* ptrace */ 158 .quad sys_alarm 159 .quad ni_syscall /* (old)fstat */ 160 .quad sys_pause 161 .quad sys32_utime /* 30 */ 162 .quad ni_syscall /* old stty syscall holder */ 163 .quad ni_syscall /* old gtty syscall holder */ 164 .quad sys_access 165 .quad sys_nice 166 .quad ni_syscall /* 35 */ /* old ftime syscall holder */ 167 .quad sys_sync 168 .quad sys32_kill 169 .quad sys_rename 170 .quad sys_mkdir 171 .quad sys_rmdir /* 40 */ 172 .quad sys_dup 173 .quad sys32_pipe 174 .quad sys32_times 175 .quad ni_syscall /* old prof syscall holder */ 176 .quad sys_brk /* 45 */ 177 .quad sys_setgid16 178 .quad sys_getgid16 179 .quad ni_syscall /* signal */ 180 .quad sys_geteuid16 181 .quad sys_getegid16 /* 50 */ 182 .quad sys_acct 183 .quad sys_umount /* new_umount */ 184 .quad ni_syscall /* old lock syscall holder */ 185 .quad sys32_ioctl 186 .quad sys32_fcntl /* 55 */ 187 .quad ni_syscall /* old mpx syscall holder */ 188 .quad sys_setpgid 189 .quad ni_syscall /* old ulimit syscall holder */ 190 .quad sys32_olduname 191 .quad sys_umask /* 60 */ 192 .quad sys_chroot 193 .quad sys32_ustat 194 .quad sys_dup2 195 .quad sys_getppid 196 .quad sys_getpgrp /* 65 */ 197 .quad sys_setsid 198 .quad sys32_sigaction 199 .quad sys_sgetmask 200 .quad sys_ssetmask 201 .quad sys_setreuid16 /* 70 */ 202 .quad sys_setregid16 203 .quad stub32_sigsuspend 204 .quad sys32_sigpending 205 .quad sys_sethostname 206 .quad sys32_setrlimit /* 75 */ 207 .quad sys32_old_getrlimit /* old_getrlimit */ 208 .quad sys32_getrusage 209 .quad sys32_gettimeofday 210 .quad sys32_settimeofday 211 .quad sys_getgroups16 /* 80 */ 212 .quad sys_setgroups16 213 .quad sys32_old_select 214 .quad sys_symlink 215 .quad ni_syscall /* (old)lstat */ 216 .quad sys_readlink /* 85 */ 217 .quad sys_uselib 218 .quad sys_swapon 219 .quad sys_reboot 220 .quad sys32_oldreaddir 221 .quad sys32_mmap /* 90 */ 222 .quad sys_munmap 223 .quad sys_truncate 224 .quad sys_ftruncate 225 .quad sys_fchmod 226 .quad sys_fchown16 /* 95 */ 227 .quad sys_getpriority 228 .quad sys_setpriority 229 .quad ni_syscall /* old profil syscall holder */ 230 .quad sys32_statfs 231 .quad sys32_fstatfs /* 100 */ 232 .quad sys_ioperm 233 .quad sys32_socketcall 234 .quad sys_syslog 235 .quad sys32_setitimer 236 .quad sys32_getitimer /* 105 */ 237 .quad sys32_newstat 238 .quad sys32_newlstat 239 .quad sys32_newfstat 240 .quad sys32_uname 241 .quad stub32_iopl /* 110 */ 242 .quad sys_vhangup 243 .quad ni_syscall /* old "idle" system call */ 244 .quad ni_syscall /* vm86old */ 245 .quad sys32_wait4 246 .quad sys_swapoff /* 115 */ 247 .quad sys32_sysinfo 248 .quad sys32_ipc 249 .quad sys_fsync 250 .quad stub32_sigreturn 251 .quad stub32_clone /* 120 */ 252 .quad sys_setdomainname 253 .quad sys_uname 254 .quad sys_modify_ldt 255 .quad sys32_adjtimex 256 .quad sys32_mprotect /* 125 */ 257 .quad sys32_sigprocmask 258 .quad sys32_module_warning /* create_module */ 259 .quad sys32_module_warning /* init_module */ 260 .quad sys32_module_warning /* delete module */ 261 .quad sys32_module_warning /* 130 get_kernel_syms */ 262 .quad ni_syscall /* quotactl */ 263 .quad sys_getpgid 264 .quad sys_fchdir 265 .quad ni_syscall /* bdflush */ 266 .quad sys_sysfs /* 135 */ 267 .quad sys_personality 268 .quad ni_syscall /* for afs_syscall */ 269 .quad sys_setfsuid16 270 .quad sys_setfsgid16 271 .quad sys_llseek /* 140 */ 272 .quad sys32_getdents 273 .quad sys32_select 274 .quad sys_flock 275 .quad sys_msync 276 .quad sys32_readv /* 145 */ 277 .quad sys32_writev 278 .quad sys_getsid 279 .quad sys_fdatasync 280 .quad sys32_sysctl /* sysctl */ 281 .quad sys_mlock /* 150 */ 282 .quad sys_munlock 283 .quad sys_mlockall 284 .quad sys_munlockall 285 .quad sys_sched_setparam 286 .quad sys_sched_getparam /* 155 */ 287 .quad sys_sched_setscheduler 288 .quad sys_sched_getscheduler 289 .quad sys_sched_yield 290 .quad sys_sched_get_priority_max 291 .quad sys_sched_get_priority_min /* 160 */ 292 .quad sys_sched_rr_get_interval 293 .quad sys32_nanosleep 294 .quad sys_mremap 295 .quad sys_setresuid16 296 .quad sys_getresuid16 /* 165 */ 297 .quad ni_syscall /* vm86 */ 298 .quad quiet_ni_syscall /* query_module */ 299 .quad sys_poll 300 .quad sys32_nfsservctl 301 .quad sys_setresgid16 /* 170 */ 302 .quad sys_getresgid16 303 .quad sys_prctl 304 .quad stub32_rt_sigreturn 305 .quad sys32_rt_sigaction 306 .quad sys32_rt_sigprocmask /* 175 */ 307 .quad sys32_rt_sigpending 308 .quad sys32_rt_sigtimedwait 309 .quad sys32_rt_sigqueueinfo 310 .quad stub32_rt_sigsuspend 311 .quad sys32_pread /* 180 */ 312 .quad sys32_pwrite 313 .quad sys_chown16 314 .quad sys_getcwd 315 .quad sys_capget 316 .quad sys_capset 317 .quad stub32_sigaltstack 318 .quad sys32_sendfile 319 .quad ni_syscall /* streams1 */ 320 .quad ni_syscall /* streams2 */ 321 .quad stub32_vfork /* 190 */ 322 .quad sys32_getrlimit 323 .quad sys32_mmap2 324 .quad sys_truncate 325 .quad sys_ftruncate 326 .quad sys32_stat64 /* 195 */ 327 .quad sys32_lstat64 328 .quad sys32_fstat64 329 .quad sys_lchown 330 .quad sys_getuid 331 .quad sys_getgid /* 200 */ 332 .quad sys_geteuid 333 .quad sys_getegid 334 .quad sys_setreuid 335 .quad sys_setregid 336 .quad sys_getgroups /* 205 */ 337 .quad sys_setgroups 338 .quad sys_fchown 339 .quad sys_setresuid 340 .quad sys_getresuid 341 .quad sys_setresgid /* 210 */ 342 .quad sys_getresgid 343 .quad sys_chown 344 .quad sys_setuid 345 .quad sys_setgid 346 .quad sys_setfsuid /* 215 */ 347 .quad sys_setfsgid 348 .quad sys_pivot_root 349 .quad sys_mincore 350 .quad sys_madvise 351 .quad sys_getdents64 /* 220 getdents64 */ 352 .quad sys32_fcntl64 353 .quad sys_ni_syscall /* tux */ 354 .quad sys_ni_syscall /* security */ 355 .quad sys_gettid 356 .quad sys_readahead /* 225 */ 357 .quad sys_setxattr 358 .quad sys_lsetxattr 359 .quad sys_fsetxattr 360 .quad sys_getxattr 361 .quad sys_lgetxattr /* 230 */ 362 .quad sys_fgetxattr 363 .quad sys_listxattr 364 .quad sys_llistxattr 365 .quad sys_flistxattr 366 .quad sys_removexattr /* 235 */ 367 .quad sys_lremovexattr 368 .quad sys_fremovexattr 369 .quad sys_tkill /* 238 */ 370 .quad sys_ni_syscall /* sendfile64 */ 371 .quad sys_ni_syscall /* futex */ 372 .quad sys_ni_syscall /* sched_setaffinity */ 373 .quad sys_ni_syscall /* sched_getaffinity */ 374 .quad sys_ni_syscall /* set_threadarea */ 375 .quad sys_ni_syscall /* get_threadarea */ 376 .quad sys_ni_syscall /* io_setup */ 377 .quad sys_ni_syscall /* io_destroy */ 378 .quad sys_ni_syscall /* io_getevents */ 379 .quad sys_ni_syscall /* io_submit */ 380 .quad sys_ni_syscall /* io_cancel */ 381 .quad sys_ni_syscall /* alloc_hugepages */ 382 .quad sys_ni_syscall /* free_hugepages */ 383 .quad sys_ni_syscall /* exit_group */ 384 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