1#include <asm/asmmacro.h> 2#include <asm/ia32.h> 3#include <asm/asm-offsets.h> 4#include <asm/signal.h> 5#include <asm/thread_info.h> 6 7#include "../kernel/minstate.h" 8 9 /* 10 * execve() is special because in case of success, we need to 11 * setup a null register window frame (in case an IA-32 process 12 * is exec'ing an IA-64 program). 13 */ 14ENTRY(ia32_execve) 15 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(3) 16 alloc loc1=ar.pfs,3,2,4,0 17 mov loc0=rp 18 .body 19 zxt4 out0=in0 // filename 20 ;; // stop bit between alloc and call 21 zxt4 out1=in1 // argv 22 zxt4 out2=in2 // envp 23 add out3=16,sp // regs 24 br.call.sptk.few rp=sys32_execve 251: cmp.ge p6,p0=r8,r0 26 mov ar.pfs=loc1 // restore ar.pfs 27 ;; 28(p6) mov ar.pfs=r0 // clear ar.pfs in case of success 29 sxt4 r8=r8 // return 64-bit result 30 mov rp=loc0 31 br.ret.sptk.few rp 32END(ia32_execve) 33 34ENTRY(ia32_clone) 35 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5) 36 alloc r16=ar.pfs,5,2,6,0 37 DO_SAVE_SWITCH_STACK 38 mov loc0=rp 39 mov loc1=r16 // save ar.pfs across do_fork 40 .body 41 zxt4 out1=in1 // newsp 42 mov out3=16 // stacksize (compensates for 16-byte scratch area) 43 adds out2=IA64_SWITCH_STACK_SIZE+16,sp // out2 = ®s 44 mov out0=in0 // out0 = clone_flags 45 zxt4 out4=in2 // out4 = parent_tidptr 46 zxt4 out5=in4 // out5 = child_tidptr 47 br.call.sptk.many rp=do_fork 48.ret0: .restore sp 49 adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack 50 mov ar.pfs=loc1 51 mov rp=loc0 52 br.ret.sptk.many rp 53END(ia32_clone) 54 55GLOBAL_ENTRY(ia32_ret_from_clone) 56 PT_REGS_UNWIND_INFO(0) 57{ 58 nop.m 0 59 nop.i 0 60 /* 61 * We need to call schedule_tail() to complete the scheduling process. 62 * Called by ia64_switch_to after do_fork()->copy_thread(). r8 contains the 63 * address of the previously executing task. 64 */ 65 br.call.sptk.many rp=ia64_invoke_schedule_tail 66} 67.ret1: 68 adds r2=TI_FLAGS+IA64_TASK_SIZE,r13 69 ;; 70 ld4 r2=[r2] 71 ;; 72 mov r8=0 73 and r2=_TIF_SYSCALL_TRACEAUDIT,r2 74 ;; 75 cmp.ne p6,p0=r2,r0 76(p6) br.cond.spnt .ia32_strace_check_retval 77 ;; // prevent RAW on r8 78END(ia32_ret_from_clone) 79 // fall thrugh 80GLOBAL_ENTRY(ia32_ret_from_syscall) 81 PT_REGS_UNWIND_INFO(0) 82 83 cmp.ge p6,p7=r8,r0 // syscall executed successfully? 84 adds r2=IA64_PT_REGS_R8_OFFSET+16,sp // r2 = &pt_regs.r8 85 ;; 86 alloc r3=ar.pfs,0,0,0,0 // drop the syscall argument frame 87 st8 [r2]=r8 // store return value in slot for r8 88 br.cond.sptk.many ia64_leave_kernel 89END(ia32_ret_from_syscall) 90 91 // 92 // Invoke a system call, but do some tracing before and after the call. 93 // We MUST preserve the current register frame throughout this routine 94 // because some system calls (such as ia64_execve) directly 95 // manipulate ar.pfs. 96 // 97 // Input: 98 // r8 = syscall number 99 // b6 = syscall entry point 100 // 101GLOBAL_ENTRY(ia32_trace_syscall) 102 PT_REGS_UNWIND_INFO(0) 103 mov r3=-38 104 adds r2=IA64_PT_REGS_R8_OFFSET+16,sp 105 ;; 106 st8 [r2]=r3 // initialize return code to -ENOSYS 107 br.call.sptk.few rp=syscall_trace_enter // give parent a chance to catch syscall args 108.ret2: // Need to reload arguments (they may be changed by the tracing process) 109 adds r2=IA64_PT_REGS_R1_OFFSET+16,sp // r2 = &pt_regs.r1 110 adds r3=IA64_PT_REGS_R13_OFFSET+16,sp // r3 = &pt_regs.r13 111 mov r15=IA32_NR_syscalls 112 ;; 113 ld4 r8=[r2],IA64_PT_REGS_R9_OFFSET-IA64_PT_REGS_R1_OFFSET 114 movl r16=ia32_syscall_table 115 ;; 116 ld4 r33=[r2],8 // r9 == ecx 117 ld4 r37=[r3],16 // r13 == ebp 118 cmp.ltu.unc p6,p7=r8,r15 119 ;; 120 ld4 r34=[r2],8 // r10 == edx 121 ld4 r36=[r3],8 // r15 == edi 122(p6) shladd r16=r8,3,r16 // force ni_syscall if not valid syscall number 123 ;; 124 ld8 r16=[r16] 125 ;; 126 ld4 r32=[r2],8 // r11 == ebx 127 mov b6=r16 128 ld4 r35=[r3],8 // r14 == esi 129 br.call.sptk.few rp=b6 // do the syscall 130.ia32_strace_check_retval: 131 cmp.lt p6,p0=r8,r0 // syscall failed? 132 adds r2=IA64_PT_REGS_R8_OFFSET+16,sp // r2 = &pt_regs.r8 133 ;; 134 st8.spill [r2]=r8 // store return value in slot for r8 135 br.call.sptk.few rp=syscall_trace_leave // give parent a chance to catch return value 136.ret4: alloc r2=ar.pfs,0,0,0,0 // drop the syscall argument frame 137 br.cond.sptk.many ia64_leave_kernel 138END(ia32_trace_syscall) 139 140GLOBAL_ENTRY(sys32_vfork) 141 alloc r16=ar.pfs,2,2,4,0;; 142 mov out0=IA64_CLONE_VFORK|IA64_CLONE_VM|SIGCHLD // out0 = clone_flags 143 br.cond.sptk.few .fork1 // do the work 144END(sys32_vfork) 145 146GLOBAL_ENTRY(sys32_fork) 147 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2) 148 alloc r16=ar.pfs,2,2,4,0 149 mov out0=SIGCHLD // out0 = clone_flags 150 ;; 151.fork1: 152 mov loc0=rp 153 mov loc1=r16 // save ar.pfs across do_fork 154 DO_SAVE_SWITCH_STACK 155 156 .body 157 158 mov out1=0 159 mov out3=0 160 adds out2=IA64_SWITCH_STACK_SIZE+16,sp // out2 = ®s 161 br.call.sptk.few rp=do_fork 162.ret5: .restore sp 163 adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack 164 mov ar.pfs=loc1 165 mov rp=loc0 166 br.ret.sptk.many rp 167END(sys32_fork) 168 169 .rodata 170 .align 8 171 .globl ia32_syscall_table 172ia32_syscall_table: 173 data8 sys_ni_syscall /* 0 - old "setup(" system call*/ 174 data8 sys_exit 175 data8 sys32_fork 176 data8 sys_read 177 data8 sys_write 178 data8 compat_sys_open /* 5 */ 179 data8 sys_close 180 data8 sys32_waitpid 181 data8 sys_creat 182 data8 sys_link 183 data8 sys_unlink /* 10 */ 184 data8 ia32_execve 185 data8 sys_chdir 186 data8 compat_sys_time 187 data8 sys_mknod 188 data8 sys_chmod /* 15 */ 189 data8 sys_lchown /* 16-bit version */ 190 data8 sys_ni_syscall /* old break syscall holder */ 191 data8 sys_ni_syscall 192 data8 sys32_lseek 193 data8 sys_getpid /* 20 */ 194 data8 compat_sys_mount 195 data8 sys_oldumount 196 data8 sys_setuid /* 16-bit version */ 197 data8 sys_getuid /* 16-bit version */ 198 data8 compat_sys_stime /* 25 */ 199 data8 sys32_ptrace 200 data8 sys32_alarm 201 data8 sys_ni_syscall 202 data8 sys32_pause 203 data8 compat_sys_utime /* 30 */ 204 data8 sys_ni_syscall /* old stty syscall holder */ 205 data8 sys_ni_syscall /* old gtty syscall holder */ 206 data8 sys_access 207 data8 sys_nice 208 data8 sys_ni_syscall /* 35 */ /* old ftime syscall holder */ 209 data8 sys_sync 210 data8 sys_kill 211 data8 sys_rename 212 data8 sys_mkdir 213 data8 sys_rmdir /* 40 */ 214 data8 sys_dup 215 data8 sys32_pipe 216 data8 compat_sys_times 217 data8 sys_ni_syscall /* old prof syscall holder */ 218 data8 sys32_brk /* 45 */ 219 data8 sys_setgid /* 16-bit version */ 220 data8 sys_getgid /* 16-bit version */ 221 data8 sys32_signal 222 data8 sys_geteuid /* 16-bit version */ 223 data8 sys_getegid /* 16-bit version */ /* 50 */ 224 data8 sys_acct 225 data8 sys_umount /* recycled never used phys( */ 226 data8 sys_ni_syscall /* old lock syscall holder */ 227 data8 compat_sys_ioctl 228 data8 compat_sys_fcntl /* 55 */ 229 data8 sys_ni_syscall /* old mpx syscall holder */ 230 data8 sys_setpgid 231 data8 sys_ni_syscall /* old ulimit syscall holder */ 232 data8 sys_ni_syscall 233 data8 sys_umask /* 60 */ 234 data8 sys_chroot 235 data8 sys_ustat 236 data8 sys_dup2 237 data8 sys_getppid 238 data8 sys_getpgrp /* 65 */ 239 data8 sys_setsid 240 data8 sys32_sigaction 241 data8 sys_ni_syscall 242 data8 sys_ni_syscall 243 data8 sys_setreuid /* 16-bit version */ /* 70 */ 244 data8 sys_setregid /* 16-bit version */ 245 data8 sys32_sigsuspend 246 data8 compat_sys_sigpending 247 data8 sys_sethostname 248 data8 compat_sys_setrlimit /* 75 */ 249 data8 compat_sys_old_getrlimit 250 data8 compat_sys_getrusage 251 data8 sys32_gettimeofday 252 data8 sys32_settimeofday 253 data8 sys32_getgroups16 /* 80 */ 254 data8 sys32_setgroups16 255 data8 sys32_old_select 256 data8 sys_symlink 257 data8 sys_ni_syscall 258 data8 sys_readlink /* 85 */ 259 data8 sys_uselib 260 data8 sys_swapon 261 data8 sys_reboot 262 data8 sys32_readdir 263 data8 sys32_mmap /* 90 */ 264 data8 sys32_munmap 265 data8 sys_truncate 266 data8 sys_ftruncate 267 data8 sys_fchmod 268 data8 sys_fchown /* 16-bit version */ /* 95 */ 269 data8 sys_getpriority 270 data8 sys_setpriority 271 data8 sys_ni_syscall /* old profil syscall holder */ 272 data8 compat_sys_statfs 273 data8 compat_sys_fstatfs /* 100 */ 274 data8 sys_ni_syscall /* ioperm */ 275 data8 compat_sys_socketcall 276 data8 sys_syslog 277 data8 compat_sys_setitimer 278 data8 compat_sys_getitimer /* 105 */ 279 data8 compat_sys_newstat 280 data8 compat_sys_newlstat 281 data8 compat_sys_newfstat 282 data8 sys_ni_syscall 283 data8 sys_ni_syscall /* iopl */ /* 110 */ 284 data8 sys_vhangup 285 data8 sys_ni_syscall /* used to be sys_idle */ 286 data8 sys_ni_syscall 287 data8 compat_sys_wait4 288 data8 sys_swapoff /* 115 */ 289 data8 compat_sys_sysinfo 290 data8 sys32_ipc 291 data8 sys_fsync 292 data8 sys32_sigreturn 293 data8 ia32_clone /* 120 */ 294 data8 sys_setdomainname 295 data8 sys32_newuname 296 data8 sys32_modify_ldt 297 data8 compat_sys_adjtimex 298 data8 sys32_mprotect /* 125 */ 299 data8 compat_sys_sigprocmask 300 data8 sys_ni_syscall /* create_module */ 301 data8 sys_ni_syscall /* init_module */ 302 data8 sys_ni_syscall /* delete_module */ 303 data8 sys_ni_syscall /* get_kernel_syms */ /* 130 */ 304 data8 sys_quotactl 305 data8 sys_getpgid 306 data8 sys_fchdir 307 data8 sys_ni_syscall /* sys_bdflush */ 308 data8 sys_sysfs /* 135 */ 309 data8 sys32_personality 310 data8 sys_ni_syscall /* for afs_syscall */ 311 data8 sys_setfsuid /* 16-bit version */ 312 data8 sys_setfsgid /* 16-bit version */ 313 data8 sys_llseek /* 140 */ 314 data8 compat_sys_getdents 315 data8 compat_sys_select 316 data8 sys_flock 317 data8 sys32_msync 318 data8 compat_sys_readv /* 145 */ 319 data8 compat_sys_writev 320 data8 sys_getsid 321 data8 sys_fdatasync 322 data8 sys32_sysctl 323 data8 sys_mlock /* 150 */ 324 data8 sys_munlock 325 data8 sys_mlockall 326 data8 sys_munlockall 327 data8 sys_sched_setparam 328 data8 sys_sched_getparam /* 155 */ 329 data8 sys_sched_setscheduler 330 data8 sys_sched_getscheduler 331 data8 sys_sched_yield 332 data8 sys_sched_get_priority_max 333 data8 sys_sched_get_priority_min /* 160 */ 334 data8 sys32_sched_rr_get_interval 335 data8 compat_sys_nanosleep 336 data8 sys32_mremap 337 data8 sys_setresuid /* 16-bit version */ 338 data8 sys32_getresuid16 /* 16-bit version */ /* 165 */ 339 data8 sys_ni_syscall /* vm86 */ 340 data8 sys_ni_syscall /* sys_query_module */ 341 data8 sys_poll 342 data8 sys_ni_syscall /* nfsservctl */ 343 data8 sys_setresgid /* 170 */ 344 data8 sys32_getresgid16 345 data8 sys_prctl 346 data8 sys32_rt_sigreturn 347 data8 sys32_rt_sigaction 348 data8 sys32_rt_sigprocmask /* 175 */ 349 data8 sys_rt_sigpending 350 data8 compat_sys_rt_sigtimedwait 351 data8 sys32_rt_sigqueueinfo 352 data8 compat_sys_rt_sigsuspend 353 data8 sys32_pread /* 180 */ 354 data8 sys32_pwrite 355 data8 sys_chown /* 16-bit version */ 356 data8 sys_getcwd 357 data8 sys_capget 358 data8 sys_capset /* 185 */ 359 data8 sys32_sigaltstack 360 data8 sys32_sendfile 361 data8 sys_ni_syscall /* streams1 */ 362 data8 sys_ni_syscall /* streams2 */ 363 data8 sys32_vfork /* 190 */ 364 data8 compat_sys_getrlimit 365 data8 sys32_mmap2 366 data8 sys32_truncate64 367 data8 sys32_ftruncate64 368 data8 sys32_stat64 /* 195 */ 369 data8 sys32_lstat64 370 data8 sys32_fstat64 371 data8 sys_lchown 372 data8 sys_getuid 373 data8 sys_getgid /* 200 */ 374 data8 sys_geteuid 375 data8 sys_getegid 376 data8 sys_setreuid 377 data8 sys_setregid 378 data8 sys_getgroups /* 205 */ 379 data8 sys_setgroups 380 data8 sys_fchown 381 data8 sys_setresuid 382 data8 sys_getresuid 383 data8 sys_setresgid /* 210 */ 384 data8 sys_getresgid 385 data8 sys_chown 386 data8 sys_setuid 387 data8 sys_setgid 388 data8 sys_setfsuid /* 215 */ 389 data8 sys_setfsgid 390 data8 sys_pivot_root 391 data8 sys_mincore 392 data8 sys_madvise 393 data8 compat_sys_getdents64 /* 220 */ 394 data8 compat_sys_fcntl64 395 data8 sys_ni_syscall /* reserved for TUX */ 396 data8 sys_ni_syscall /* reserved for Security */ 397 data8 sys_gettid 398 data8 sys_readahead /* 225 */ 399 data8 sys_setxattr 400 data8 sys_lsetxattr 401 data8 sys_fsetxattr 402 data8 sys_getxattr 403 data8 sys_lgetxattr /* 230 */ 404 data8 sys_fgetxattr 405 data8 sys_listxattr 406 data8 sys_llistxattr 407 data8 sys_flistxattr 408 data8 sys_removexattr /* 235 */ 409 data8 sys_lremovexattr 410 data8 sys_fremovexattr 411 data8 sys_tkill 412 data8 sys_sendfile64 413 data8 compat_sys_futex /* 240 */ 414 data8 compat_sys_sched_setaffinity 415 data8 compat_sys_sched_getaffinity 416 data8 sys32_set_thread_area 417 data8 sys32_get_thread_area 418 data8 compat_sys_io_setup /* 245 */ 419 data8 sys_io_destroy 420 data8 compat_sys_io_getevents 421 data8 compat_sys_io_submit 422 data8 sys_io_cancel 423 data8 sys_fadvise64 /* 250 */ 424 data8 sys_ni_syscall 425 data8 sys_exit_group 426 data8 sys_lookup_dcookie 427 data8 sys_epoll_create 428 data8 sys32_epoll_ctl /* 255 */ 429 data8 sys32_epoll_wait 430 data8 sys_remap_file_pages 431 data8 sys_set_tid_address 432 data8 compat_sys_timer_create 433 data8 compat_sys_timer_settime /* 260 */ 434 data8 compat_sys_timer_gettime 435 data8 sys_timer_getoverrun 436 data8 sys_timer_delete 437 data8 compat_sys_clock_settime 438 data8 compat_sys_clock_gettime /* 265 */ 439 data8 compat_sys_clock_getres 440 data8 compat_sys_clock_nanosleep 441 data8 compat_sys_statfs64 442 data8 compat_sys_fstatfs64 443 data8 sys_tgkill /* 270 */ 444 data8 compat_sys_utimes 445 data8 sys32_fadvise64_64 446 data8 sys_ni_syscall 447 data8 sys_ni_syscall 448 data8 sys_ni_syscall /* 275 */ 449 data8 sys_ni_syscall 450 data8 compat_sys_mq_open 451 data8 sys_mq_unlink 452 data8 compat_sys_mq_timedsend 453 data8 compat_sys_mq_timedreceive /* 280 */ 454 data8 compat_sys_mq_notify 455 data8 compat_sys_mq_getsetattr 456 data8 sys_ni_syscall /* reserved for kexec */ 457 data8 compat_sys_waitid 458 459 // guard against failures to increase IA32_NR_syscalls 460 .org ia32_syscall_table + 8*IA32_NR_syscalls 461