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-99, 2000- 02, 06 Ralf Baechle <ralf@linux-mips.org>
7 * Copyright (C) 2001 MIPS Technologies, Inc.
8 * Copyright (C) 2004 Thiemo Seufer
10 #include <linux/errno.h>
12 #include <asm/asmmacro.h>
13 #include <asm/irqflags.h>
14 #include <asm/mipsregs.h>
15 #include <asm/regdef.h>
16 #include <asm/stackframe.h>
17 #include <asm/isadep.h>
18 #include <asm/sysmips.h>
19 #include <asm/thread_info.h>
20 #include <asm/unistd.h>
22 #include <asm/asm-offsets.h>
24 /* Highest syscall used of any syscall flavour */
25 #define MAX_SYSCALL_NO __NR_O32_Linux + __NR_O32_Linux_syscalls
28 NESTED(handle_sys, PT_SIZE, sp)
35 lw t1, PT_EPC(sp) # skip syscall on return
37 subu v0, v0, __NR_O32_Linux # check syscall number
38 sltiu t0, v0, __NR_O32_Linux_syscalls + 1
39 addiu t1, 4 # skip to next instruction
41 beqz t0, illegal_syscall
46 lw t2, (t1) # syscall routine
47 lw t3, 4(t1) # >= 0 if we need stack arguments
48 beqz t2, illegal_syscall
50 sw a3, PT_R26(sp) # save a3 for syscall restarting
54 lw t0, TI_FLAGS($28) # syscall tracing enabled?
55 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
57 bnez t0, syscall_trace_entry # -> yes
59 jalr t2 # Do The Real Thing (TM)
61 li t0, -EMAXERRNO - 1 # error?
63 sw t0, PT_R7(sp) # set error flag
66 lw t1, PT_R2(sp) # syscall number
68 sw t1, PT_R0(sp) # save it for syscall restarting
69 1: sw v0, PT_R2(sp) # result
72 j syscall_exit_partial
74 /* ------------------------------------------------------------------------ */
80 jal syscall_trace_enter
84 lw a0, PT_R4(sp) # Restore argument registers
90 li t0, -EMAXERRNO - 1 # error?
92 sw t0, PT_R7(sp) # set error flag
95 lw t1, PT_R2(sp) # syscall number
97 sw t1, PT_R0(sp) # save it for syscall restarting
98 1: sw v0, PT_R2(sp) # result
102 /* ------------------------------------------------------------------------ */
105 * More than four arguments. Try to deal with it by copying the
106 * stack arguments from the user stack to the kernel stack.
110 lw t0, PT_R29(sp) # get old user stack pointer
113 * We intentionally keep the kernel stack a little below the top of
114 * userspace so we don't have to do a slower byte accurate check here.
116 lw t5, TI_ADDR_LIMIT($28)
119 bltz t5, bad_stack # -> sp is bad
121 /* Ok, copy the args from the luser stack to the kernel stack.
122 * t3 is the precomputed number of instruction bytes needed to
123 * load or store arguments 6-8.
126 la t1, 5f # load up to 3 arguments
128 1: lw t5, 16(t0) # argument #5 from usp
135 2: lw t8, 28(t0) # argument #8 from usp
136 3: lw t7, 24(t0) # argument #7 from usp
137 4: lw t6, 20(t0) # argument #6 from usp
139 sw t5, 16(sp) # argument #5 to ksp
141 #ifdef CONFIG_CPU_MICROMIPS
142 sw t8, 28(sp) # argument #8 to ksp
144 sw t7, 24(sp) # argument #7 to ksp
146 sw t6, 20(sp) # argument #6 to ksp
149 sw t8, 28(sp) # argument #8 to ksp
150 sw t7, 24(sp) # argument #7 to ksp
151 sw t6, 20(sp) # argument #6 to ksp
153 6: j stack_done # go back
157 .section __ex_table,"a"
165 * The stackpointer for a call with more than 4 arguments is bad.
166 * We probably should handle this case a bit more drastic.
171 li t0, 1 # set error flag
176 * The system call does not exist in this kernel
179 li v0, ENOSYS # error
181 li t0, 1 # set error flag
187 subu t0, a0, __NR_O32_Linux # check syscall number
188 sltiu v0, t0, __NR_O32_Linux_syscalls + 1
189 beqz t0, einval # do not recurse
192 lw t2, sys_call_table(t1) # syscall routine
194 /* Some syscalls like execve get their arguments from struct pt_regs
195 and claim zero arguments in the syscall table. Thus we have to
196 assume the worst case and shuffle around all potential arguments.
197 If you want performance, don't use indirect syscalls. */
199 move a0, a1 # shift argument registers
209 sw a0, PT_R4(sp) # .. and push back a0 - a3, some
210 sw a1, PT_R5(sp) # syscalls expect them there
213 sw a3, PT_R26(sp) # update a3 for syscall restarting
217 einval: li v0, -ENOSYS
221 .macro fifty ptr, nargs, from=1, to=50
224 fifty \ptr,\nargs,"(\from+1)",\to
228 .macro mille ptr, nargs, from=1, to=20
231 mille \ptr,\nargs,"(\from+1)",\to
236 sys sys_syscall 8 /* 4000 */
241 sys sys_open 3 /* 4005 */
246 sys sys_unlink 1 /* 4010 */
251 sys sys_chmod 2 /* 4015 */
254 sys sys_ni_syscall 0 /* was sys_stat */
256 sys sys_getpid 0 /* 4020 */
261 sys sys_stime 1 /* 4025 */
264 sys sys_ni_syscall 0 /* was sys_fstat */
266 sys sys_utime 2 /* 4030 */
271 sys sys_ni_syscall 0 /* 4035 */
276 sys sys_rmdir 1 /* 4040 */
281 sys sys_brk 1 /* 4045 */
284 sys sys_ni_syscall 0 /* was signal(2) */
286 sys sys_getegid 0 /* 4050 */
291 sys sys_fcntl 3 /* 4055 */
296 sys sys_umask 1 /* 4060 */
301 sys sys_getpgrp 0 /* 4065 */
306 sys sys_setreuid 2 /* 4070 */
310 sys sys_sethostname 2
311 sys sys_setrlimit 2 /* 4075 */
314 sys sys_gettimeofday 2
315 sys sys_settimeofday 2
316 sys sys_getgroups 2 /* 4080 */
318 sys sys_ni_syscall 0 /* old_select */
320 sys sys_ni_syscall 0 /* was sys_lstat */
321 sys sys_readlink 3 /* 4085 */
325 sys sys_old_readdir 3
326 sys sys_mips_mmap 6 /* 4090 */
331 sys sys_fchown 3 /* 4095 */
332 sys sys_getpriority 2
333 sys sys_setpriority 3
336 sys sys_fstatfs 2 /* 4100 */
337 sys sys_ni_syscall 0 /* was ioperm(2) */
341 sys sys_getitimer 2 /* 4105 */
346 sys sys_ni_syscall 0 /* 4110 was iopl(2) */
348 sys sys_ni_syscall 0 /* was sys_idle() */
349 sys sys_ni_syscall 0 /* was sys_vm86 */
351 sys sys_swapoff 1 /* 4115 */
356 sys __sys_clone 6 /* 4120 */
357 sys sys_setdomainname 2
359 sys sys_ni_syscall 0 /* sys_modify_ldt */
361 sys sys_mprotect 3 /* 4125 */
362 sys sys_sigprocmask 3
363 sys sys_ni_syscall 0 /* was create_module */
364 sys sys_init_module 5
365 sys sys_delete_module 1
366 sys sys_ni_syscall 0 /* 4130 was get_kernel_syms */
371 sys sys_sysfs 3 /* 4135 */
372 sys sys_personality 1
373 sys sys_ni_syscall 0 /* for afs_syscall */
376 sys sys_llseek 5 /* 4140 */
381 sys sys_readv 3 /* 4145 */
386 sys sys_ni_syscall 0 /* 4150 */
391 sys sys_munlock 2 /* 4155 */
394 sys sys_sched_setparam 2
395 sys sys_sched_getparam 2
396 sys sys_sched_setscheduler 3 /* 4160 */
397 sys sys_sched_getscheduler 1
398 sys sys_sched_yield 0
399 sys sys_sched_get_priority_max 1
400 sys sys_sched_get_priority_min 1
401 sys sys_sched_rr_get_interval 2 /* 4165 */
406 sys sys_connect 3 /* 4170 */
407 sys sys_getpeername 3
408 sys sys_getsockname 3
411 sys sys_recv 4 /* 4175 */
416 sys sys_sendto 6 /* 4180 */
421 sys sys_setresuid 3 /* 4185 */
423 sys sys_ni_syscall 0 /* was sys_query_module */
425 sys sys_ni_syscall 0 /* was nfsservctl */
426 sys sys_setresgid 3 /* 4190 */
429 sys sys_rt_sigreturn 0
430 sys sys_rt_sigaction 4
431 sys sys_rt_sigprocmask 4 /* 4195 */
432 sys sys_rt_sigpending 2
433 sys sys_rt_sigtimedwait 4
434 sys sys_rt_sigqueueinfo 3
435 sys sys_rt_sigsuspend 0
436 sys sys_pread64 6 /* 4200 */
441 sys sys_capset 2 /* 4205 */
442 sys sys_sigaltstack 0
446 sys sys_mips_mmap2 6 /* 4210 */
448 sys sys_ftruncate64 4
451 sys sys_fstat64 2 /* 4215 */
456 sys sys_fcntl64 3 /* 4220 */
461 sys sys_lsetxattr 5 /* 4225 */
466 sys sys_listxattr 3 /* 4230 */
469 sys sys_removexattr 2
470 sys sys_lremovexattr 2
471 sys sys_fremovexattr 2 /* 4235 */
475 #ifdef CONFIG_MIPS_MT_FPAFF
477 * For FPU affinity scheduling on MIPS MT processors, we need to
478 * intercept sys_sched_xxxaffinity() calls until we get a proper hook
479 * in kernel/sched.c. Considered only temporary we only support these
480 * hooks for the 32-bit kernel - there is no MIPS64 MT processor atm.
482 sys mipsmt_sys_sched_setaffinity 3
483 sys mipsmt_sys_sched_getaffinity 3
485 sys sys_sched_setaffinity 3
486 sys sys_sched_getaffinity 3 /* 4240 */
487 #endif /* CONFIG_MIPS_MT_FPAFF */
490 sys sys_io_getevents 5
492 sys sys_io_cancel 3 /* 4245 */
494 sys sys_lookup_dcookie 4
495 sys sys_epoll_create 1
497 sys sys_epoll_wait 4 /* 4250 */
498 sys sys_remap_file_pages 5
499 sys sys_set_tid_address 1
500 sys sys_restart_syscall 0
501 sys sys_fadvise64_64 7
502 sys sys_statfs64 3 /* 4255 */
504 sys sys_timer_create 3
505 sys sys_timer_settime 4
506 sys sys_timer_gettime 2
507 sys sys_timer_getoverrun 1 /* 4260 */
508 sys sys_timer_delete 1
509 sys sys_clock_settime 2
510 sys sys_clock_gettime 2
511 sys sys_clock_getres 2
512 sys sys_clock_nanosleep 4 /* 4265 */
516 sys sys_ni_syscall 0 /* sys_get_mempolicy */
517 sys sys_ni_syscall 0 /* 4270 sys_set_mempolicy */
520 sys sys_mq_timedsend 5
521 sys sys_mq_timedreceive 5
522 sys sys_mq_notify 2 /* 4275 */
523 sys sys_mq_getsetattr 3
524 sys sys_ni_syscall 0 /* sys_vserver */
526 sys sys_ni_syscall 0 /* available, was setaltroot */
527 sys sys_add_key 5 /* 4280 */
528 sys sys_request_key 4
530 sys sys_set_thread_area 1
531 sys sys_inotify_init 0
532 sys sys_inotify_add_watch 3 /* 4285 */
533 sys sys_inotify_rm_watch 2
534 sys sys_migrate_pages 4
537 sys sys_mknodat 4 /* 4290 */
542 sys sys_renameat 4 /* 4295 */
547 sys sys_faccessat 3 /* 4300 */
552 sys sys_sync_file_range 7 /* 4305 */
556 sys sys_set_robust_list 2
557 sys sys_get_robust_list 3 /* 4310 */
560 sys sys_epoll_pwait 6
562 sys sys_ioprio_get 2 /* 4315 */
565 sys sys_ni_syscall 0 /* was timerfd */
567 sys sys_fallocate 6 /* 4320 */
568 sys sys_timerfd_create 2
569 sys sys_timerfd_gettime 2
570 sys sys_timerfd_settime 4
572 sys sys_eventfd2 2 /* 4325 */
573 sys sys_epoll_create1 1
576 sys sys_inotify_init1 1
577 sys sys_preadv 6 /* 4330 */
579 sys sys_rt_tgsigqueueinfo 4
580 sys sys_perf_event_open 5
582 sys sys_recvmmsg 5 /* 4335 */
583 sys sys_fanotify_init 2
584 sys sys_fanotify_mark 6
586 sys sys_name_to_handle_at 5
587 sys sys_open_by_handle_at 3 /* 4340 */
588 sys sys_clock_adjtime 2
592 sys sys_process_vm_readv 6 /* 4345 */
593 sys sys_process_vm_writev 6
595 sys sys_finit_module 3
598 /* We pre-compute the number of _instruction_ bytes needed to
599 load or store the arguments 6-8. Negative values are ignored. */
601 .macro sys function, nargs
603 LONG (\nargs << 2) - (5 << 2)
607 .type sys_call_table,@object
608 EXPORT(sys_call_table)
610 .size sys_call_table, . - sys_call_table