1 #include <asm/asmmacro.h>
3 #include <asm/asm-offsets.h>
4 #include <asm/signal.h>
5 #include <asm/thread_info.h>
7 #include "../kernel/minstate.h"
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).
15 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(3)
16 alloc loc1=ar.pfs,3,2,4,0
19 zxt4 out0=in0 // filename
20 ;; // stop bit between alloc and call
23 add out3=16,sp // regs
24 br.call.sptk.few rp=sys32_execve
26 mov ar.pfs=loc1 // restore ar.pfs
28 (p6) mov ar.pfs=r0 // clear ar.pfs in case of success
29 sxt4 r8=r8 // return 64-bit result
35 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5)
36 alloc r16=ar.pfs,5,2,6,0
39 mov loc1=r16 // save ar.pfs across do_fork
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
49 adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack
55 ENTRY(sys32_rt_sigsuspend)
56 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
57 alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs
60 mov out1=in1 // sigsetsize
61 mov out2=sp // out2 = &sigscratch
63 adds sp=-16,sp // allocate dummy "sigscratch"
66 br.call.sptk.many rp=ia32_rt_sigsuspend
72 END(sys32_rt_sigsuspend)
74 ENTRY(sys32_sigsuspend)
75 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
76 alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs
78 mov out0=in2 // mask (first two args are ignored)
80 mov out1=sp // out1 = &sigscratch
82 adds sp=-16,sp // allocate dummy "sigscratch"
84 br.call.sptk.many rp=ia32_sigsuspend
92 GLOBAL_ENTRY(ia32_ret_from_clone)
93 PT_REGS_UNWIND_INFO(0)
95 * Some versions of gas generate bad unwind info if the first instruction of a
96 * procedure doesn't go into the first slot of a bundle. This is a workaround.
101 * We need to call schedule_tail() to complete the scheduling process.
102 * Called by ia64_switch_to after do_fork()->copy_thread(). r8 contains the
103 * address of the previously executing task.
105 br.call.sptk.many rp=ia64_invoke_schedule_tail
108 adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
113 and r2=_TIF_SYSCALL_TRACEAUDIT,r2
116 (p6) br.cond.spnt .ia32_strace_check_retval
117 ;; // prevent RAW on r8
118 END(ia32_ret_from_clone)
120 GLOBAL_ENTRY(ia32_ret_from_syscall)
121 PT_REGS_UNWIND_INFO(0)
123 cmp.ge p6,p7=r8,r0 // syscall executed successfully?
124 adds r2=IA64_PT_REGS_R8_OFFSET+16,sp // r2 = &pt_regs.r8
126 alloc r3=ar.pfs,0,0,0,0 // drop the syscall argument frame
127 st8 [r2]=r8 // store return value in slot for r8
128 br.cond.sptk.many ia64_leave_kernel
129 END(ia32_ret_from_syscall)
132 // Invoke a system call, but do some tracing before and after the call.
133 // We MUST preserve the current register frame throughout this routine
134 // because some system calls (such as ia64_execve) directly
135 // manipulate ar.pfs.
138 // r8 = syscall number
139 // b6 = syscall entry point
141 GLOBAL_ENTRY(ia32_trace_syscall)
142 PT_REGS_UNWIND_INFO(0)
144 adds r2=IA64_PT_REGS_R8_OFFSET+16,sp
146 st8 [r2]=r3 // initialize return code to -ENOSYS
147 br.call.sptk.few rp=syscall_trace_enter // give parent a chance to catch syscall args
148 .ret2: // Need to reload arguments (they may be changed by the tracing process)
149 adds r2=IA64_PT_REGS_R1_OFFSET+16,sp // r2 = &pt_regs.r1
150 adds r3=IA64_PT_REGS_R13_OFFSET+16,sp // r3 = &pt_regs.r13
151 mov r15=IA32_NR_syscalls
153 ld4 r8=[r2],IA64_PT_REGS_R9_OFFSET-IA64_PT_REGS_R1_OFFSET
154 movl r16=ia32_syscall_table
156 ld4 r33=[r2],8 // r9 == ecx
157 ld4 r37=[r3],16 // r13 == ebp
158 cmp.ltu.unc p6,p7=r8,r15
160 ld4 r34=[r2],8 // r10 == edx
161 ld4 r36=[r3],8 // r15 == edi
162 (p6) shladd r16=r8,3,r16 // force ni_syscall if not valid syscall number
166 ld4 r32=[r2],8 // r11 == ebx
168 ld4 r35=[r3],8 // r14 == esi
169 br.call.sptk.few rp=b6 // do the syscall
170 .ia32_strace_check_retval:
171 cmp.lt p6,p0=r8,r0 // syscall failed?
172 adds r2=IA64_PT_REGS_R8_OFFSET+16,sp // r2 = &pt_regs.r8
174 st8.spill [r2]=r8 // store return value in slot for r8
175 br.call.sptk.few rp=syscall_trace_leave // give parent a chance to catch return value
176 .ret4: alloc r2=ar.pfs,0,0,0,0 // drop the syscall argument frame
177 br.cond.sptk.many ia64_leave_kernel
178 END(ia32_trace_syscall)
180 GLOBAL_ENTRY(sys32_vfork)
181 alloc r16=ar.pfs,2,2,4,0;;
182 mov out0=IA64_CLONE_VFORK|IA64_CLONE_VM|SIGCHLD // out0 = clone_flags
183 br.cond.sptk.few .fork1 // do the work
186 GLOBAL_ENTRY(sys32_fork)
187 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
188 alloc r16=ar.pfs,2,2,4,0
189 mov out0=SIGCHLD // out0 = clone_flags
193 mov loc1=r16 // save ar.pfs across do_fork
200 adds out2=IA64_SWITCH_STACK_SIZE+16,sp // out2 = ®s
201 br.call.sptk.few rp=do_fork
203 adds sp=IA64_SWITCH_STACK_SIZE,sp // pop the switch stack
211 .globl ia32_syscall_table
213 data8 sys_ni_syscall /* 0 - old "setup(" system call*/
218 data8 compat_sys_open /* 5 */
223 data8 sys_unlink /* 10 */
226 data8 compat_sys_time
228 data8 sys_chmod /* 15 */
229 data8 sys_lchown /* 16-bit version */
230 data8 sys_ni_syscall /* old break syscall holder */
233 data8 sys_getpid /* 20 */
234 data8 compat_sys_mount
236 data8 sys_setuid /* 16-bit version */
237 data8 sys_getuid /* 16-bit version */
238 data8 compat_sys_stime /* 25 */
243 data8 compat_sys_utime /* 30 */
244 data8 sys_ni_syscall /* old stty syscall holder */
245 data8 sys_ni_syscall /* old gtty syscall holder */
248 data8 sys_ni_syscall /* 35 */ /* old ftime syscall holder */
253 data8 sys_rmdir /* 40 */
256 data8 compat_sys_times
257 data8 sys_ni_syscall /* old prof syscall holder */
258 data8 sys32_brk /* 45 */
259 data8 sys_setgid /* 16-bit version */
260 data8 sys_getgid /* 16-bit version */
262 data8 sys_geteuid /* 16-bit version */
263 data8 sys_getegid /* 16-bit version */ /* 50 */
265 data8 sys_umount /* recycled never used phys( */
266 data8 sys_ni_syscall /* old lock syscall holder */
267 data8 compat_sys_ioctl
268 data8 compat_sys_fcntl /* 55 */
269 data8 sys_ni_syscall /* old mpx syscall holder */
271 data8 sys_ni_syscall /* old ulimit syscall holder */
273 data8 sys_umask /* 60 */
278 data8 sys_getpgrp /* 65 */
280 data8 sys32_sigaction
283 data8 sys_setreuid /* 16-bit version */ /* 70 */
284 data8 sys_setregid /* 16-bit version */
285 data8 sys32_sigsuspend
286 data8 compat_sys_sigpending
287 data8 sys_sethostname
288 data8 compat_sys_setrlimit /* 75 */
289 data8 compat_sys_old_getrlimit
290 data8 compat_sys_getrusage
291 data8 sys32_gettimeofday
292 data8 sys32_settimeofday
293 data8 sys32_getgroups16 /* 80 */
294 data8 sys32_setgroups16
295 data8 sys32_old_select
298 data8 sys_readlink /* 85 */
303 data8 sys32_mmap /* 90 */
308 data8 sys_fchown /* 16-bit version */ /* 95 */
309 data8 sys_getpriority
310 data8 sys_setpriority
311 data8 sys_ni_syscall /* old profil syscall holder */
312 data8 compat_sys_statfs
313 data8 compat_sys_fstatfs /* 100 */
314 data8 sys_ni_syscall /* ioperm */
315 data8 compat_sys_socketcall
317 data8 compat_sys_setitimer
318 data8 compat_sys_getitimer /* 105 */
319 data8 compat_sys_newstat
320 data8 compat_sys_newlstat
321 data8 compat_sys_newfstat
323 data8 sys_ni_syscall /* iopl */ /* 110 */
325 data8 sys_ni_syscall /* used to be sys_idle */
327 data8 compat_sys_wait4
328 data8 sys_swapoff /* 115 */
329 data8 compat_sys_sysinfo
332 data8 sys32_sigreturn
333 data8 ia32_clone /* 120 */
334 data8 sys_setdomainname
336 data8 sys32_modify_ldt
337 data8 compat_sys_adjtimex
338 data8 sys32_mprotect /* 125 */
339 data8 compat_sys_sigprocmask
340 data8 sys_ni_syscall /* create_module */
341 data8 sys_ni_syscall /* init_module */
342 data8 sys_ni_syscall /* delete_module */
343 data8 sys_ni_syscall /* get_kernel_syms */ /* 130 */
347 data8 sys_ni_syscall /* sys_bdflush */
348 data8 sys_sysfs /* 135 */
349 data8 sys32_personality
350 data8 sys_ni_syscall /* for afs_syscall */
351 data8 sys_setfsuid /* 16-bit version */
352 data8 sys_setfsgid /* 16-bit version */
353 data8 sys_llseek /* 140 */
354 data8 compat_sys_getdents
355 data8 compat_sys_select
358 data8 compat_sys_readv /* 145 */
359 data8 compat_sys_writev
363 data8 sys_mlock /* 150 */
367 data8 sys_sched_setparam
368 data8 sys_sched_getparam /* 155 */
369 data8 sys_sched_setscheduler
370 data8 sys_sched_getscheduler
371 data8 sys_sched_yield
372 data8 sys_sched_get_priority_max
373 data8 sys_sched_get_priority_min /* 160 */
374 data8 sys32_sched_rr_get_interval
375 data8 compat_sys_nanosleep
377 data8 sys_setresuid /* 16-bit version */
378 data8 sys32_getresuid16 /* 16-bit version */ /* 165 */
379 data8 sys_ni_syscall /* vm86 */
380 data8 sys_ni_syscall /* sys_query_module */
382 data8 sys_ni_syscall /* nfsservctl */
383 data8 sys_setresgid /* 170 */
384 data8 sys32_getresgid16
386 data8 sys32_rt_sigreturn
387 data8 sys32_rt_sigaction
388 data8 sys32_rt_sigprocmask /* 175 */
389 data8 sys_rt_sigpending
390 data8 compat_sys_rt_sigtimedwait
391 data8 sys32_rt_sigqueueinfo
392 data8 sys32_rt_sigsuspend
393 data8 sys32_pread /* 180 */
395 data8 sys_chown /* 16-bit version */
398 data8 sys_capset /* 185 */
399 data8 sys32_sigaltstack
401 data8 sys_ni_syscall /* streams1 */
402 data8 sys_ni_syscall /* streams2 */
403 data8 sys32_vfork /* 190 */
404 data8 compat_sys_getrlimit
406 data8 sys32_truncate64
407 data8 sys32_ftruncate64
408 data8 sys32_stat64 /* 195 */
413 data8 sys_getgid /* 200 */
418 data8 sys_getgroups /* 205 */
423 data8 sys_setresgid /* 210 */
428 data8 sys_setfsuid /* 215 */
433 data8 compat_sys_getdents64 /* 220 */
434 data8 compat_sys_fcntl64
435 data8 sys_ni_syscall /* reserved for TUX */
436 data8 sys_ni_syscall /* reserved for Security */
438 data8 sys_readahead /* 225 */
443 data8 sys_lgetxattr /* 230 */
448 data8 sys_removexattr /* 235 */
449 data8 sys_lremovexattr
450 data8 sys_fremovexattr
453 data8 compat_sys_futex /* 240 */
454 data8 compat_sys_sched_setaffinity
455 data8 compat_sys_sched_getaffinity
456 data8 sys32_set_thread_area
457 data8 sys32_get_thread_area
458 data8 compat_sys_io_setup /* 245 */
460 data8 compat_sys_io_getevents
461 data8 compat_sys_io_submit
463 data8 sys_fadvise64 /* 250 */
466 data8 sys_lookup_dcookie
467 data8 sys_epoll_create
468 data8 sys32_epoll_ctl /* 255 */
469 data8 sys32_epoll_wait
470 data8 sys_remap_file_pages
471 data8 sys_set_tid_address
472 data8 compat_sys_timer_create
473 data8 compat_sys_timer_settime /* 260 */
474 data8 compat_sys_timer_gettime
475 data8 sys_timer_getoverrun
476 data8 sys_timer_delete
477 data8 compat_sys_clock_settime
478 data8 compat_sys_clock_gettime /* 265 */
479 data8 compat_sys_clock_getres
480 data8 compat_sys_clock_nanosleep
481 data8 compat_sys_statfs64
482 data8 compat_sys_fstatfs64
483 data8 sys_tgkill /* 270 */
484 data8 compat_sys_utimes
485 data8 sys32_fadvise64_64
488 data8 sys_ni_syscall /* 275 */
490 data8 compat_sys_mq_open
492 data8 compat_sys_mq_timedsend
493 data8 compat_sys_mq_timedreceive /* 280 */
494 data8 compat_sys_mq_notify
495 data8 compat_sys_mq_getsetattr
496 data8 sys_ni_syscall /* reserved for kexec */
497 data8 compat_sys_waitid
499 // guard against failures to increase IA32_NR_syscalls
500 .org ia32_syscall_table + 8*IA32_NR_syscalls