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 dsubu 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 dsll t0, v0, 3 # offset into table
52 ld t2, (sys_call_table - (__NR_O32_Linux * 8))(t0)
54 sd a3, PT_R26(sp) # save a3 for syscall restarting
57 * More than four arguments. Try to deal with it by copying the
58 * stack arguments from the user stack to the kernel stack.
61 * We intentionally keep the kernel stack a little below the top of
62 * userspace so we don't have to do a slower byte accurate check here.
64 ld t0, PT_R29(sp) # get old user stack pointer
68 1: lw a4, 16(t0) # argument #5 from usp
69 2: lw a5, 20(t0) # argument #6 from usp
70 3: lw a6, 24(t0) # argument #7 from usp
72 .section __ex_table,"a"
78 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
79 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled?
81 bnez t0, trace_a_syscall
83 jalr t2 # Do The Real Thing (TM)
85 li t0, -EMAXERRNO - 1 # error?
87 sd t0, PT_R7(sp) # set error flag
91 sd v0, PT_R0(sp) # flag for syscall restarting
92 1: sd v0, PT_R2(sp) # result
94 FEXPORT(o32_syscall_exit)
95 local_irq_disable # make need_resched and
96 # signals dont change between
98 LONG_L a2, TI_FLAGS($28)
99 li t0, _TIF_ALLWORK_MASK
101 bnez t0, o32_syscall_exit_work
105 o32_syscall_exit_work:
106 j syscall_exit_work_partial
108 /* ------------------------------------------------------------------------ */
122 ld a0, PT_R4(sp) # Restore argument registers
128 ld a6, PT_R10(sp) # For indirect syscalls
131 li t0, -EMAXERRNO - 1 # error?
133 sd t0, PT_R7(sp) # set error flag
137 sd v0, PT_R0(sp) # set flag for syscall restarting
138 1: sd v0, PT_R2(sp) # result
142 /* ------------------------------------------------------------------------ */
145 * The stackpointer for a call with more than 4 arguments is bad.
151 li t0, 1 # set error flag
157 * This is not an o32 compatibility syscall, pass it on
158 * to the 64-bit syscall handlers.
160 #ifdef CONFIG_MIPS32_N32
167 /* This also isn't a 64-bit syscall, throw an error. */
168 li v0, ENOSYS # error
170 li t0, 1 # set error flag
176 ld t0, PT_R29(sp) # user sp
178 sltu v0, a0, __NR_O32_Linux + __NR_O32_Linux_syscalls + 1
182 dla v1, sys32_syscall
183 ld t2, (sys_call_table - (__NR_O32_Linux * 8))(v0)
186 beq t2, v1, out # do not recurse
188 beqz t2, enosys # null function pointer?
190 andi v0, t0, 0x3 # unaligned stack pointer?
193 daddiu v0, t0, 16 # v0 = usp + 16
194 daddu t1, v0, 12 # 3 32-bit arguments
195 ld v1, TI_ADDR_LIMIT($28)
200 move a0, a1 # shift argument registers
209 enosys: li v0, -ENOSYS
218 efault: li v0, -EFAULT
224 .type sys_call_table,@object;
226 PTR sys32_syscall /* 4000 */
231 PTR sys_open /* 4005 */
236 PTR sys_unlink /* 4010 */
241 PTR sys_chmod /* 4015 */
244 PTR sys_ni_syscall /* was sys_stat */
246 PTR sys_getpid /* 4020 */
251 PTR sys_stime /* 4025 */
254 PTR sys_ni_syscall /* was sys_fstat */
256 PTR compat_sys_utime /* 4030 */
261 PTR sys_ni_syscall /* 4035 */
266 PTR sys_rmdir /* 4040 */
271 PTR sys_brk /* 4045 */
274 PTR sys_ni_syscall /* was signal 2 */
276 PTR sys_getegid /* 4050 */
281 PTR compat_sys_fcntl /* 4055 */
286 PTR sys_umask /* 4060 */
291 PTR sys_getpgrp /* 4065 */
296 PTR sys_setreuid /* 4070 */
299 PTR compat_sys_sigpending
301 PTR compat_sys_setrlimit /* 4075 */
302 PTR compat_sys_getrlimit
303 PTR compat_sys_getrusage
304 PTR sys32_gettimeofday
305 PTR sys32_settimeofday
306 PTR sys_getgroups /* 4080 */
308 PTR sys_ni_syscall /* old_select */
310 PTR sys_ni_syscall /* was sys_lstat */
311 PTR sys_readlink /* 4085 */
316 PTR old_mmap /* 4090 */
321 PTR sys_fchown /* 4095 */
325 PTR compat_sys_statfs
326 PTR compat_sys_fstatfs /* 4100 */
327 PTR sys_ni_syscall /* sys_ioperm */
330 PTR compat_sys_setitimer
331 PTR compat_sys_getitimer /* 4105 */
332 PTR compat_sys_newstat
333 PTR compat_sys_newlstat
334 PTR compat_sys_newfstat
336 PTR sys_ni_syscall /* sys_ioperm *//* 4110 */
338 PTR sys_ni_syscall /* was sys_idle */
339 PTR sys_ni_syscall /* sys_vm86 */
341 PTR sys_swapoff /* 4115 */
346 PTR sys_clone /* 4120 */
347 PTR sys_setdomainname
349 PTR sys_ni_syscall /* sys_modify_ldt */
351 PTR sys_mprotect /* 4125 */
352 PTR compat_sys_sigprocmask
353 PTR sys_ni_syscall /* was creat_module */
355 PTR sys_delete_module
356 PTR sys_ni_syscall /* 4130, get_kernel_syms */
361 PTR sys_sysfs /* 4135 */
362 PTR sys32_personality
363 PTR sys_ni_syscall /* for afs_syscall */
366 PTR sys32_llseek /* 4140 */
368 PTR compat_sys_select
371 PTR compat_sys_readv /* 4145 */
372 PTR compat_sys_writev
376 PTR sys_ni_syscall /* 4150 */
381 PTR sys_munlock /* 4155 */
384 PTR sys_sched_setparam
385 PTR sys_sched_getparam
386 PTR sys_sched_setscheduler /* 4160 */
387 PTR sys_sched_getscheduler
389 PTR sys_sched_get_priority_max
390 PTR sys_sched_get_priority_min
391 PTR sys32_sched_rr_get_interval /* 4165 */
392 PTR compat_sys_nanosleep
396 PTR sys_connect /* 4170 */
401 PTR sys_recv /* 4175 */
403 PTR compat_sys_recvmsg
405 PTR compat_sys_sendmsg
406 PTR sys_sendto /* 4180 */
407 PTR compat_sys_setsockopt
411 PTR sys_setresuid /* 4185 */
413 PTR sys_ni_syscall /* was query_module */
416 PTR sys_setresgid /* 4190 */
419 PTR sys32_rt_sigreturn
420 PTR sys32_rt_sigaction
421 PTR sys32_rt_sigprocmask /* 4195 */
422 PTR sys32_rt_sigpending
423 PTR sys32_rt_sigtimedwait
424 PTR sys32_rt_sigqueueinfo
425 PTR sys32_rt_sigsuspend
426 PTR sys32_pread /* 4200 */
431 PTR sys_capset /* 4205 */
432 PTR sys32_sigaltstack
436 PTR sys32_mmap2 /* 4210 */
438 PTR sys32_ftruncate64
441 PTR sys_newfstat /* 4215 */
446 PTR compat_sys_fcntl64 /* 4220 */
451 PTR sys_lsetxattr /* 4225 */
456 PTR sys_listxattr /* 4230 */
461 PTR sys_fremovexattr /* 4235 */
465 PTR compat_sys_sched_setaffinity
466 PTR compat_sys_sched_getaffinity /* 4240 */
471 PTR sys_io_cancel /* 4245 */
473 PTR sys_lookup_dcookie
476 PTR sys_epoll_wait /* 4250 */
477 PTR sys_remap_file_pages
478 PTR sys_set_tid_address
479 PTR sys_restart_syscall
481 PTR compat_sys_statfs64 /* 4255 */
482 PTR compat_sys_fstatfs64
484 PTR compat_sys_timer_settime
485 PTR compat_sys_timer_gettime
486 PTR sys_timer_getoverrun /* 4260 */
488 PTR compat_sys_clock_settime
489 PTR compat_sys_clock_gettime
490 PTR compat_sys_clock_getres
491 PTR compat_sys_clock_nanosleep /* 4265 */
493 PTR compat_sys_utimes
494 PTR sys_ni_syscall /* sys_mbind */
495 PTR sys_ni_syscall /* sys_get_mempolicy */
496 PTR sys_ni_syscall /* 4270 sys_set_mempolicy */
497 PTR compat_sys_mq_open
499 PTR compat_sys_mq_timedsend
500 PTR compat_sys_mq_timedreceive
501 PTR compat_sys_mq_notify /* 4275 */
502 PTR compat_sys_mq_getsetattr
503 PTR sys_ni_syscall /* sys_vserver */
505 PTR sys_ni_syscall /* available, was setaltroot */
506 PTR sys_add_key /* 4280 */
509 .size sys_call_table,.-sys_call_table