2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 1995 - 2000, 2001 by Ralf Baechle
7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8 * Copyright (C) 2001 MIPS Technologies, Inc.
10 * Hairy, the userspace application uses a different argument passing
11 * convention than the kernel, so we have to translate things from o32
12 * to ABI64 calling convention. 64-bit syscalls are also processed
15 #include <linux/config.h>
16 #include <linux/errno.h>
18 #include <asm/asmmacro.h>
19 #include <asm/mipsregs.h>
20 #include <asm/regdef.h>
21 #include <asm/stackframe.h>
22 #include <asm/thread_info.h>
23 #include <asm/unistd.h>
24 #include <asm/sysmips.h>
27 NESTED(handle_sys, PT_SIZE, sp)
32 ld t1, PT_EPC(sp) # skip syscall on return
34 subu t0, v0, __NR_O32_Linux # check syscall number
35 sltiu t0, t0, __NR_O32_Linux_syscalls + 1
36 daddiu t1, 4 # skip to next instruction
38 beqz t0, not_o32_scall
51 /* XXX Put both in one cacheline, should save a bit. */
52 dsll t0, v0, 3 # offset into table
53 ld t2, (sys_call_table - (__NR_O32_Linux * 8))(t0)
54 lbu t3, (sys_narg_table - __NR_O32_Linux)(v0)
56 subu t0, t3, 5 # 5 or more arguments?
57 sd a3, PT_R26(sp) # save a3 for syscall restarting
61 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
62 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled?
64 bnez t0, trace_a_syscall
66 jalr t2 # Do The Real Thing (TM)
68 li t0, -EMAXERRNO - 1 # error?
70 sd t0, PT_R7(sp) # set error flag
74 sd v0, PT_R0(sp) # flag for syscall restarting
75 1: sd v0, PT_R2(sp) # result
77 FEXPORT(o32_syscall_exit)
78 local_irq_disable # make need_resched and
79 # signals dont change between
81 LONG_L a2, TI_FLAGS($28)
82 li t0, _TIF_ALLWORK_MASK
84 bnez t0, o32_syscall_exit_work
88 o32_syscall_exit_work:
89 j syscall_exit_work_partial
91 /* ------------------------------------------------------------------------ */
106 ld a0, PT_R4(sp) # Restore argument registers
115 li t0, -EMAXERRNO - 1 # error?
117 sd t0, PT_R7(sp) # set error flag
121 sd v0, PT_R0(sp) # set flag for syscall restarting
122 1: sd v0, PT_R2(sp) # result
126 /* ------------------------------------------------------------------------ */
129 * More than four arguments. Try to deal with it by copying the
130 * stack arguments from the user stack to the kernel stack.
134 ld t0, PT_R29(sp) # get old user stack pointer
136 sll t1, t3, 2 # stack valid?
138 addu t1, t0 # end address
140 bltz t0, bad_stack # -> sp is bad
142 ld t0, PT_R29(sp) # get old user stack pointer
143 PTR_LA t1, 3f # copy 1 to 2 arguments
148 /* Ok, copy the args from the luser stack to the kernel stack */
152 1: lw a5, 20(t0) # argument #6 from usp
153 2: lw a4, 16(t0) # argument #5 from usp
156 j stack_done # go back
158 .section __ex_table,"a"
164 * The stackpointer for a call with more than 4 arguments is bad.
170 li t0, 1 # set error flag
176 * This is not an o32 compatibility syscall, pass it on
177 * to the 64-bit syscall handlers.
179 #ifdef CONFIG_MIPS32_N32
186 /* This also isn't a 64-bit syscall, throw an error. */
187 li v0, ENOSYS # error
189 li t0, 1 # set error flag
195 ld t0, PT_R29(sp) # user sp
197 sltu v0, a0, __NR_O32_Linux + __NR_O32_Linux_syscalls + 1
201 dla v1, sys32_syscall
202 ld t2, (sys_call_table - (__NR_O32_Linux * 8))(v0)
203 lbu t3, (sys_narg_table - __NR_O32_Linux)(a0)
206 beq t2, v1, out # do not recurse
208 beqz t2, enosys # null function pointer?
210 andi v0, t0, 0x3 # unaligned stack pointer?
213 daddiu v0, t0, 16 # v0 = usp + 16
214 daddu t1, v0, 12 # 3 32-bit arguments
215 ld v1, TI_ADDR_LIMIT($28)
220 move a0, a1 # shift argument registers
228 .section __ex_table,"a"
234 sw t3, 16(sp) # put into new stackframe
237 bnez t1, 1f # zero arguments?
238 daddu a0, sp, 32 # then pass sp in a0
246 enosys: li v0, -ENOSYS
255 efault: li v0, -EFAULT
261 sys sys32_syscall 0 /* 4000 */
266 sys sys_open 3 /* 4005 */
271 sys sys_unlink 1 /* 4010 */
276 sys sys_chmod 2 /* 4015 */
279 sys sys_ni_syscall 0 /* was sys_stat */
281 sys sys_getpid 0 /* 4020 */
286 sys sys_stime 1 /* 4025 */
289 sys sys_ni_syscall 0 /* was sys_fstat */
291 sys compat_sys_utime 2 /* 4030 */
296 sys sys_ni_syscall 0 /* 4035 */
301 sys sys_rmdir 1 /* 4040 */
304 sys compat_sys_times 1
306 sys sys_brk 1 /* 4045 */
309 sys sys_ni_syscall 0 /* was signal 2 */
311 sys sys_getegid 0 /* 4050 */
315 sys compat_sys_ioctl 3
316 sys compat_sys_fcntl 3 /* 4055 */
319 sys sys_ni_syscall, 0
321 sys sys_umask 1 /* 4060 */
326 sys sys_getpgrp 0 /* 4065 */
328 sys sys32_sigaction 3
331 sys sys_setreuid 2 /* 4070 */
333 sys sys32_sigsuspend 0
334 sys compat_sys_sigpending 1
335 sys sys_sethostname 2
336 sys compat_sys_setrlimit 2 /* 4075 */
337 sys compat_sys_getrlimit 2
338 sys compat_sys_getrusage 2
339 sys sys32_gettimeofday 2
340 sys sys32_settimeofday 2
341 sys sys_getgroups 2 /* 4080 */
343 sys sys_ni_syscall 0 /* old_select */
345 sys sys_ni_syscall 0 /* was sys_lstat */
346 sys sys_readlink 3 /* 4085 */
351 sys old_mmap 6 /* 4090 */
356 sys sys_fchown 3 /* 4095 */
357 sys sys_getpriority 2
358 sys sys_setpriority 3
360 sys compat_sys_statfs 2
361 sys compat_sys_fstatfs 2 /* 4100 */
362 sys sys_ni_syscall 0 /* sys_ioperm */
363 sys sys32_socketcall 2
365 sys compat_sys_setitimer 3
366 sys compat_sys_getitimer 2 /* 4105 */
367 sys compat_sys_newstat 2
368 sys compat_sys_newlstat 2
369 sys compat_sys_newfstat 2
371 sys sys_ni_syscall 0 /* sys_ioperm *//* 4110 */
373 sys sys_ni_syscall 0 /* was sys_idle */
374 sys sys_ni_syscall 0 /* sys_vm86 */
376 sys sys_swapoff 1 /* 4115 */
380 sys sys32_sigreturn 0
381 sys sys_clone 0 /* 4120 */
382 sys sys_setdomainname 2
384 sys sys_ni_syscall 0 /* sys_modify_ldt */
386 sys sys_mprotect 3 /* 4125 */
387 sys compat_sys_sigprocmask 3
388 sys sys_ni_syscall 0 /* was creat_module */
389 sys sys_init_module 5
390 sys sys_delete_module 1
391 sys sys_ni_syscall 0 /* 4130, get_kernel_syms */
396 sys sys_sysfs 3 /* 4135 */
397 sys sys32_personality 1
398 sys sys_ni_syscall 0 /* for afs_syscall */
401 sys sys32_llseek 5 /* 4140 */
403 sys compat_sys_select 5
406 sys compat_sys_readv 3 /* 4145 */
407 sys compat_sys_writev 3
411 sys sys_ni_syscall 0 /* 4150 */
416 sys sys_munlock 2 /* 4155 */
419 sys sys_sched_setparam 2
420 sys sys_sched_getparam 2
421 sys sys_sched_setscheduler 3 /* 4160 */
422 sys sys_sched_getscheduler 1
423 sys sys_sched_yield 0
424 sys sys_sched_get_priority_max 1
425 sys sys_sched_get_priority_min 1
426 sys sys32_sched_rr_get_interval 2 /* 4165 */
427 sys compat_sys_nanosleep 2
431 sys sys_connect 3 /* 4170 */
432 sys sys_getpeername 3
433 sys sys_getsockname 3
436 sys sys_recv 4 /* 4175 */
438 sys compat_sys_recvmsg 3
440 sys compat_sys_sendmsg 3
441 sys sys_sendto 6 /* 4180 */
442 sys compat_sys_setsockopt 5
446 sys sys_setresuid 3 /* 4185 */
448 sys sys_ni_syscall 0 /* was query_module */
451 sys sys_setresgid 3 /* 4190 */
454 sys sys32_rt_sigreturn 0
455 sys sys32_rt_sigaction 4
456 sys sys32_rt_sigprocmask 4 /* 4195 */
457 sys sys32_rt_sigpending 2
458 sys sys32_rt_sigtimedwait 4
459 sys sys32_rt_sigqueueinfo 3
460 sys sys32_rt_sigsuspend 0
461 sys sys32_pread 6 /* 4200 */
466 sys sys_capset 2 /* 4205 */
467 sys sys32_sigaltstack 0
471 sys sys32_mmap2 6 /* 4210 */
472 sys sys32_truncate64 4
473 sys sys32_ftruncate64 4
476 sys sys_newfstat 2 /* 4215 */
481 sys compat_sys_fcntl64 3 /* 4220 */
484 sys sys32_readahead 5
486 sys sys_lsetxattr 5 /* 4225 */
491 sys sys_listxattr 3 /* 4230 */
494 sys sys_removexattr 2
495 sys sys_lremovexattr 2
496 sys sys_fremovexattr 2 /* 4235 */
499 sys compat_sys_futex 5
500 sys compat_sys_sched_setaffinity 3
501 sys compat_sys_sched_getaffinity 3 /* 4240 */
504 sys sys_io_getevents 5
506 sys sys_io_cancel 3 /* 4245 */
508 sys sys_lookup_dcookie 3
509 sys sys_epoll_create 1
511 sys sys_epoll_wait 3 /* 4250 */
512 sys sys_remap_file_pages 5
513 sys sys_set_tid_address 1
514 sys sys_restart_syscall 0
515 sys sys_fadvise64_64 7
516 sys sys_statfs64 3 /* 4255 */
518 sys sys_timer_create 3
519 sys sys_timer_settime 4
520 sys sys_timer_gettime 2
521 sys sys_timer_getoverrun 1 /* 4260 */
522 sys sys_timer_delete 1
523 sys sys_clock_settime 2
524 sys sys_clock_gettime 2
525 sys sys_clock_getres 2
526 sys sys_clock_nanosleep 4 /* 4265 */
528 sys compat_sys_utimes 2
529 sys sys_ni_syscall 0 /* sys_mbind */
530 sys sys_ni_syscall 0 /* sys_get_mempolicy */
531 sys sys_ni_syscall 0 /* 4270 sys_set_mempolicy */
532 sys compat_sys_mq_open 4
534 sys compat_sys_mq_timedsend 5
535 sys compat_sys_mq_timedreceive 5
536 sys compat_sys_mq_notify 2 /* 4275 */
537 sys compat_sys_mq_getsetattr 3
538 sys sys_ni_syscall 0 /* sys_vserver */
542 .macro sys function, nargs
550 .macro sys function, nargs