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_WORK_SYSCALL_ENTRY
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/core.c. Considered only temporary we only support
480 * these hooks for the 32-bit kernel - there is no MIPS64 MT processor
483 sys mipsmt_sys_sched_setaffinity 3
484 sys mipsmt_sys_sched_getaffinity 3
486 sys sys_sched_setaffinity 3
487 sys sys_sched_getaffinity 3 /* 4240 */
488 #endif /* CONFIG_MIPS_MT_FPAFF */
491 sys sys_io_getevents 5
493 sys sys_io_cancel 3 /* 4245 */
495 sys sys_lookup_dcookie 4
496 sys sys_epoll_create 1
498 sys sys_epoll_wait 4 /* 4250 */
499 sys sys_remap_file_pages 5
500 sys sys_set_tid_address 1
501 sys sys_restart_syscall 0
502 sys sys_fadvise64_64 7
503 sys sys_statfs64 3 /* 4255 */
505 sys sys_timer_create 3
506 sys sys_timer_settime 4
507 sys sys_timer_gettime 2
508 sys sys_timer_getoverrun 1 /* 4260 */
509 sys sys_timer_delete 1
510 sys sys_clock_settime 2
511 sys sys_clock_gettime 2
512 sys sys_clock_getres 2
513 sys sys_clock_nanosleep 4 /* 4265 */
517 sys sys_ni_syscall 0 /* sys_get_mempolicy */
518 sys sys_ni_syscall 0 /* 4270 sys_set_mempolicy */
521 sys sys_mq_timedsend 5
522 sys sys_mq_timedreceive 5
523 sys sys_mq_notify 2 /* 4275 */
524 sys sys_mq_getsetattr 3
525 sys sys_ni_syscall 0 /* sys_vserver */
527 sys sys_ni_syscall 0 /* available, was setaltroot */
528 sys sys_add_key 5 /* 4280 */
529 sys sys_request_key 4
531 sys sys_set_thread_area 1
532 sys sys_inotify_init 0
533 sys sys_inotify_add_watch 3 /* 4285 */
534 sys sys_inotify_rm_watch 2
535 sys sys_migrate_pages 4
538 sys sys_mknodat 4 /* 4290 */
543 sys sys_renameat 4 /* 4295 */
548 sys sys_faccessat 3 /* 4300 */
553 sys sys_sync_file_range 7 /* 4305 */
557 sys sys_set_robust_list 2
558 sys sys_get_robust_list 3 /* 4310 */
561 sys sys_epoll_pwait 6
563 sys sys_ioprio_get 2 /* 4315 */
566 sys sys_ni_syscall 0 /* was timerfd */
568 sys sys_fallocate 6 /* 4320 */
569 sys sys_timerfd_create 2
570 sys sys_timerfd_gettime 2
571 sys sys_timerfd_settime 4
573 sys sys_eventfd2 2 /* 4325 */
574 sys sys_epoll_create1 1
577 sys sys_inotify_init1 1
578 sys sys_preadv 6 /* 4330 */
580 sys sys_rt_tgsigqueueinfo 4
581 sys sys_perf_event_open 5
583 sys sys_recvmmsg 5 /* 4335 */
584 sys sys_fanotify_init 2
585 sys sys_fanotify_mark 6
587 sys sys_name_to_handle_at 5
588 sys sys_open_by_handle_at 3 /* 4340 */
589 sys sys_clock_adjtime 2
593 sys sys_process_vm_readv 6 /* 4345 */
594 sys sys_process_vm_writev 6
596 sys sys_finit_module 3
599 /* We pre-compute the number of _instruction_ bytes needed to
600 load or store the arguments 6-8. Negative values are ignored. */
602 .macro sys function, nargs
604 LONG (\nargs << 2) - (5 << 2)
608 .type sys_call_table,@object
609 EXPORT(sys_call_table)
611 .size sys_call_table, . - sys_call_table