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 local_irq_disable # make sure need_resched and
73 # signals dont change between
75 lw a2, TI_FLAGS($28) # current->work
76 li t0, _TIF_ALLWORK_MASK
78 bnez t0, o32_syscall_exit_work
82 o32_syscall_exit_work:
83 j syscall_exit_work_partial
85 /* ------------------------------------------------------------------------ */
96 lw a0, PT_R4(sp) # Restore argument registers
102 li t0, -EMAXERRNO - 1 # error?
104 sw t0, PT_R7(sp) # set error flag
107 lw t1, PT_R2(sp) # syscall number
109 sw t1, PT_R0(sp) # save it for syscall restarting
110 1: sw v0, PT_R2(sp) # result
114 /* ------------------------------------------------------------------------ */
117 * More than four arguments. Try to deal with it by copying the
118 * stack arguments from the user stack to the kernel stack.
122 lw t0, PT_R29(sp) # get old user stack pointer
125 * We intentionally keep the kernel stack a little below the top of
126 * userspace so we don't have to do a slower byte accurate check here.
128 lw t5, TI_ADDR_LIMIT($28)
131 bltz t5, bad_stack # -> sp is bad
133 /* Ok, copy the args from the luser stack to the kernel stack.
134 * t3 is the precomputed number of instruction bytes needed to
135 * load or store arguments 6-8.
138 la t1, 5f # load up to 3 arguments
140 1: lw t5, 16(t0) # argument #5 from usp
148 lw t8, 28(t0) # argument #8 from usp
150 lw t7, 24(t0) # argument #7 from usp
152 lw t6, 20(t0) # argument #6 from usp
155 sw t5, 16(sp) # argument #5 to ksp
157 #ifdef CONFIG_CPU_MICROMIPS
159 sw t8, 28(sp) # argument #8 to ksp
161 sw t7, 24(sp) # argument #7 to ksp
163 sw t6, 20(sp) # argument #6 to ksp
166 sw t8, 28(sp) # argument #8 to ksp
167 sw t7, 24(sp) # argument #7 to ksp
168 sw t6, 20(sp) # argument #6 to ksp
170 6: j stack_done # go back
174 .section __ex_table,"a"
182 * The stackpointer for a call with more than 4 arguments is bad.
183 * We probably should handle this case a bit more drastic.
188 li t0, 1 # set error flag
193 * The system call does not exist in this kernel
196 li v0, ENOSYS # error
198 li t0, 1 # set error flag
204 subu t0, a0, __NR_O32_Linux # check syscall number
205 sltiu v0, t0, __NR_O32_Linux_syscalls + 1
206 beqz t0, einval # do not recurse
209 lw t2, sys_call_table(t1) # syscall routine
211 /* Some syscalls like execve get their arguments from struct pt_regs
212 and claim zero arguments in the syscall table. Thus we have to
213 assume the worst case and shuffle around all potential arguments.
214 If you want performance, don't use indirect syscalls. */
216 move a0, a1 # shift argument registers
226 sw a0, PT_R4(sp) # .. and push back a0 - a3, some
227 sw a1, PT_R5(sp) # syscalls expect them there
230 sw a3, PT_R26(sp) # update a3 for syscall restarting
234 einval: li v0, -ENOSYS
238 .macro fifty ptr, nargs, from=1, to=50
241 fifty \ptr,\nargs,"(\from+1)",\to
245 .macro mille ptr, nargs, from=1, to=20
248 mille \ptr,\nargs,"(\from+1)",\to
253 sys sys_syscall 8 /* 4000 */
258 sys sys_open 3 /* 4005 */
263 sys sys_unlink 1 /* 4010 */
268 sys sys_chmod 2 /* 4015 */
271 sys sys_ni_syscall 0 /* was sys_stat */
273 sys sys_getpid 0 /* 4020 */
278 sys sys_stime 1 /* 4025 */
281 sys sys_ni_syscall 0 /* was sys_fstat */
283 sys sys_utime 2 /* 4030 */
288 sys sys_ni_syscall 0 /* 4035 */
293 sys sys_rmdir 1 /* 4040 */
298 sys sys_brk 1 /* 4045 */
301 sys sys_ni_syscall 0 /* was signal(2) */
303 sys sys_getegid 0 /* 4050 */
308 sys sys_fcntl 3 /* 4055 */
313 sys sys_umask 1 /* 4060 */
318 sys sys_getpgrp 0 /* 4065 */
323 sys sys_setreuid 2 /* 4070 */
327 sys sys_sethostname 2
328 sys sys_setrlimit 2 /* 4075 */
331 sys sys_gettimeofday 2
332 sys sys_settimeofday 2
333 sys sys_getgroups 2 /* 4080 */
335 sys sys_ni_syscall 0 /* old_select */
337 sys sys_ni_syscall 0 /* was sys_lstat */
338 sys sys_readlink 3 /* 4085 */
342 sys sys_old_readdir 3
343 sys sys_mips_mmap 6 /* 4090 */
348 sys sys_fchown 3 /* 4095 */
349 sys sys_getpriority 2
350 sys sys_setpriority 3
353 sys sys_fstatfs 2 /* 4100 */
354 sys sys_ni_syscall 0 /* was ioperm(2) */
358 sys sys_getitimer 2 /* 4105 */
363 sys sys_ni_syscall 0 /* 4110 was iopl(2) */
365 sys sys_ni_syscall 0 /* was sys_idle() */
366 sys sys_ni_syscall 0 /* was sys_vm86 */
368 sys sys_swapoff 1 /* 4115 */
373 sys sys_clone 0 /* 4120 */
374 sys sys_setdomainname 2
376 sys sys_ni_syscall 0 /* sys_modify_ldt */
378 sys sys_mprotect 3 /* 4125 */
379 sys sys_sigprocmask 3
380 sys sys_ni_syscall 0 /* was create_module */
381 sys sys_init_module 5
382 sys sys_delete_module 1
383 sys sys_ni_syscall 0 /* 4130 was get_kernel_syms */
388 sys sys_sysfs 3 /* 4135 */
389 sys sys_personality 1
390 sys sys_ni_syscall 0 /* for afs_syscall */
393 sys sys_llseek 5 /* 4140 */
398 sys sys_readv 3 /* 4145 */
403 sys sys_ni_syscall 0 /* 4150 */
408 sys sys_munlock 2 /* 4155 */
411 sys sys_sched_setparam 2
412 sys sys_sched_getparam 2
413 sys sys_sched_setscheduler 3 /* 4160 */
414 sys sys_sched_getscheduler 1
415 sys sys_sched_yield 0
416 sys sys_sched_get_priority_max 1
417 sys sys_sched_get_priority_min 1
418 sys sys_sched_rr_get_interval 2 /* 4165 */
423 sys sys_connect 3 /* 4170 */
424 sys sys_getpeername 3
425 sys sys_getsockname 3
428 sys sys_recv 4 /* 4175 */
433 sys sys_sendto 6 /* 4180 */
438 sys sys_setresuid 3 /* 4185 */
440 sys sys_ni_syscall 0 /* was sys_query_module */
443 sys sys_setresgid 3 /* 4190 */
446 sys sys_rt_sigreturn 0
447 sys sys_rt_sigaction 4
448 sys sys_rt_sigprocmask 4 /* 4195 */
449 sys sys_rt_sigpending 2
450 sys sys_rt_sigtimedwait 4
451 sys sys_rt_sigqueueinfo 3
452 sys sys_rt_sigsuspend 0
453 sys sys_pread64 6 /* 4200 */
458 sys sys_capset 2 /* 4205 */
459 sys sys_sigaltstack 0
463 sys sys_mips_mmap2 6 /* 4210 */
465 sys sys_ftruncate64 4
468 sys sys_fstat64 2 /* 4215 */
473 sys sys_fcntl64 3 /* 4220 */
478 sys sys_lsetxattr 5 /* 4225 */
483 sys sys_listxattr 3 /* 4230 */
486 sys sys_removexattr 2
487 sys sys_lremovexattr 2
488 sys sys_fremovexattr 2 /* 4235 */
492 #ifdef CONFIG_MIPS_MT_FPAFF
494 * For FPU affinity scheduling on MIPS MT processors, we need to
495 * intercept sys_sched_xxxaffinity() calls until we get a proper hook
496 * in kernel/sched.c. Considered only temporary we only support these
497 * hooks for the 32-bit kernel - there is no MIPS64 MT processor atm.
499 sys mipsmt_sys_sched_setaffinity 3
500 sys mipsmt_sys_sched_getaffinity 3
502 sys sys_sched_setaffinity 3
503 sys sys_sched_getaffinity 3 /* 4240 */
504 #endif /* CONFIG_MIPS_MT_FPAFF */
507 sys sys_io_getevents 5
509 sys sys_io_cancel 3 /* 4245 */
511 sys sys_lookup_dcookie 4
512 sys sys_epoll_create 1
514 sys sys_epoll_wait 4 /* 4250 */
515 sys sys_remap_file_pages 5
516 sys sys_set_tid_address 1
517 sys sys_restart_syscall 0
518 sys sys_fadvise64_64 7
519 sys sys_statfs64 3 /* 4255 */
521 sys sys_timer_create 3
522 sys sys_timer_settime 4
523 sys sys_timer_gettime 2
524 sys sys_timer_getoverrun 1 /* 4260 */
525 sys sys_timer_delete 1
526 sys sys_clock_settime 2
527 sys sys_clock_gettime 2
528 sys sys_clock_getres 2
529 sys sys_clock_nanosleep 4 /* 4265 */
533 sys sys_ni_syscall 0 /* sys_get_mempolicy */
534 sys sys_ni_syscall 0 /* 4270 sys_set_mempolicy */
537 sys sys_mq_timedsend 5
538 sys sys_mq_timedreceive 5
539 sys sys_mq_notify 2 /* 4275 */
540 sys sys_mq_getsetattr 3
541 sys sys_ni_syscall 0 /* sys_vserver */
543 sys sys_ni_syscall 0 /* available, was setaltroot */
544 sys sys_add_key 5 /* 4280 */
545 sys sys_request_key 4
547 sys sys_set_thread_area 1
548 sys sys_inotify_init 0
549 sys sys_inotify_add_watch 3 /* 4285 */
550 sys sys_inotify_rm_watch 2
551 sys sys_migrate_pages 4
554 sys sys_mknodat 4 /* 4290 */
559 sys sys_renameat 4 /* 4295 */
564 sys sys_faccessat 3 /* 4300 */
569 sys sys_sync_file_range 7 /* 4305 */
573 sys sys_set_robust_list 2
574 sys sys_get_robust_list 3 /* 4310 */
577 sys sys_epoll_pwait 6
579 sys sys_ioprio_get 2 /* 4315 */
582 sys sys_ni_syscall 0 /* was timerfd */
584 sys sys_fallocate 6 /* 4320 */
585 sys sys_timerfd_create 2
586 sys sys_timerfd_gettime 2
587 sys sys_timerfd_settime 4
589 sys sys_eventfd2 2 /* 4325 */
590 sys sys_epoll_create1 1
593 sys sys_inotify_init1 1
594 sys sys_preadv 6 /* 4330 */
596 sys sys_rt_tgsigqueueinfo 4
597 sys sys_perf_event_open 5
599 sys sys_recvmmsg 5 /* 4335 */
600 sys sys_fanotify_init 2
601 sys sys_fanotify_mark 6
605 /* We pre-compute the number of _instruction_ bytes needed to
606 load or store the arguments 6-8. Negative values are ignored. */
608 .macro sys function, nargs
610 LONG (\nargs << 2) - (5 << 2)
614 .type sys_call_table,@object
615 EXPORT(sys_call_table)
617 .size sys_call_table, . - sys_call_table