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
9 * Copyright (C) 2014 Imagination Technologies Ltd.
11 #include <linux/errno.h>
13 #include <asm/asmmacro.h>
14 #include <asm/irqflags.h>
15 #include <asm/mipsregs.h>
16 #include <asm/regdef.h>
17 #include <asm/stackframe.h>
18 #include <asm/isadep.h>
19 #include <asm/sysmips.h>
20 #include <asm/thread_info.h>
21 #include <asm/unistd.h>
23 #include <asm/asm-offsets.h>
25 /* Highest syscall used of any syscall flavour */
26 #define MAX_SYSCALL_NO __NR_O32_Linux + __NR_O32_Linux_syscalls
29 NESTED(handle_sys, PT_SIZE, sp)
36 lw t1, PT_EPC(sp) # skip syscall on return
38 subu v0, v0, __NR_O32_Linux # check syscall number
39 sltiu t0, v0, __NR_O32_Linux_syscalls + 1
40 addiu t1, 4 # skip to next instruction
42 beqz t0, illegal_syscall
47 lw t2, (t1) # syscall routine
48 beqz t2, illegal_syscall
50 sw a3, PT_R26(sp) # save a3 for syscall restarting
53 * More than four arguments. Try to deal with it by copying the
54 * stack arguments from the user stack to the kernel stack.
57 lw t0, PT_R29(sp) # get old user stack pointer
60 * We intentionally keep the kernel stack a little below the top of
61 * userspace so we don't have to do a slower byte accurate check here.
63 lw t5, TI_ADDR_LIMIT($28)
66 bltz t5, bad_stack # -> sp is bad
69 * Ok, copy the args from the luser stack to the kernel stack.
76 load_a4: user_lw(t5, 16(t0)) # argument #5 from usp
77 load_a5: user_lw(t6, 20(t0)) # argument #6 from usp
78 load_a6: user_lw(t7, 24(t0)) # argument #7 from usp
79 load_a7: user_lw(t8, 28(t0)) # argument #8 from usp
82 sw t5, 16(sp) # argument #5 to ksp
83 sw t6, 20(sp) # argument #6 to ksp
84 sw t7, 24(sp) # argument #7 to ksp
85 sw t8, 28(sp) # argument #8 to ksp
88 .section __ex_table,"a"
89 PTR load_a4, bad_stack_a4
90 PTR load_a5, bad_stack_a5
91 PTR load_a6, bad_stack_a6
92 PTR load_a7, bad_stack_a7
95 lw t0, TI_FLAGS($28) # syscall tracing enabled?
96 li t1, _TIF_WORK_SYSCALL_ENTRY
98 bnez t0, syscall_trace_entry # -> yes
100 jalr t2 # Do The Real Thing (TM)
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
113 j syscall_exit_partial
115 /* ------------------------------------------------------------------------ */
123 * syscall number is in v0 unless we called syscall(__NR_###)
124 * where the real syscall number is in a0
126 addiu a1, v0, __NR_O32_Linux
127 bnez v0, 1f /* __NR_syscall at offset 0 */
130 1: jal syscall_trace_enter
132 bltz v0, 2f # seccomp failed? Skip syscall
136 lw a0, PT_R4(sp) # Restore argument registers
142 li t0, -EMAXERRNO - 1 # error?
144 sw t0, PT_R7(sp) # set error flag
147 lw t1, PT_R2(sp) # syscall number
149 sw t1, PT_R0(sp) # save it for syscall restarting
150 1: sw v0, PT_R2(sp) # result
154 /* ------------------------------------------------------------------------ */
157 * Our open-coded access area sanity test for the stack pointer
158 * failed. We probably should handle this case a bit more drastic.
163 li t0, 1 # set error flag
184 * The system call does not exist in this kernel
187 li v0, ENOSYS # error
189 li t0, 1 # set error flag
195 subu t0, a0, __NR_O32_Linux # check syscall number
196 sltiu v0, t0, __NR_O32_Linux_syscalls + 1
197 beqz t0, einval # do not recurse
200 lw t2, sys_call_table(t1) # syscall routine
201 sw a0, PT_R2(sp) # call routine directly on restart
203 /* Some syscalls like execve get their arguments from struct pt_regs
204 and claim zero arguments in the syscall table. Thus we have to
205 assume the worst case and shuffle around all potential arguments.
206 If you want performance, don't use indirect syscalls. */
208 move a0, a1 # shift argument registers
218 sw a0, PT_R4(sp) # .. and push back a0 - a3, some
219 sw a1, PT_R5(sp) # syscalls expect them there
222 sw a3, PT_R26(sp) # update a3 for syscall restarting
226 einval: li v0, -ENOSYS
231 .type sys_call_table, @object
232 EXPORT(sys_call_table)
233 PTR sys_syscall /* 4000 */
238 PTR sys_open /* 4005 */
243 PTR sys_unlink /* 4010 */
248 PTR sys_chmod /* 4015 */
251 PTR sys_ni_syscall /* was sys_stat */
253 PTR sys_getpid /* 4020 */
258 PTR sys_stime /* 4025 */
261 PTR sys_ni_syscall /* was sys_fstat */
263 PTR sys_utime /* 4030 */
268 PTR sys_ni_syscall /* 4035 */
273 PTR sys_rmdir /* 4040 */
278 PTR sys_brk /* 4045 */
281 PTR sys_ni_syscall /* was signal(2) */
283 PTR sys_getegid /* 4050 */
288 PTR sys_fcntl /* 4055 */
293 PTR sys_umask /* 4060 */
298 PTR sys_getpgrp /* 4065 */
303 PTR sys_setreuid /* 4070 */
308 PTR sys_setrlimit /* 4075 */
313 PTR sys_getgroups /* 4080 */
315 PTR sys_ni_syscall /* old_select */
317 PTR sys_ni_syscall /* was sys_lstat */
318 PTR sys_readlink /* 4085 */
323 PTR sys_mips_mmap /* 4090 */
328 PTR sys_fchown /* 4095 */
333 PTR sys_fstatfs /* 4100 */
334 PTR sys_ni_syscall /* was ioperm(2) */
338 PTR sys_getitimer /* 4105 */
343 PTR sys_ni_syscall /* 4110 was iopl(2) */
345 PTR sys_ni_syscall /* was sys_idle() */
346 PTR sys_ni_syscall /* was sys_vm86 */
348 PTR sys_swapoff /* 4115 */
353 PTR __sys_clone /* 4120 */
354 PTR sys_setdomainname
356 PTR sys_ni_syscall /* sys_modify_ldt */
358 PTR sys_mprotect /* 4125 */
360 PTR sys_ni_syscall /* was create_module */
362 PTR sys_delete_module
363 PTR sys_ni_syscall /* 4130 was get_kernel_syms */
368 PTR sys_sysfs /* 4135 */
370 PTR sys_ni_syscall /* for afs_syscall */
373 PTR sys_llseek /* 4140 */
378 PTR sys_readv /* 4145 */
383 PTR sys_ni_syscall /* 4150 */
388 PTR sys_munlock /* 4155 */
391 PTR sys_sched_setparam
392 PTR sys_sched_getparam
393 PTR sys_sched_setscheduler /* 4160 */
394 PTR sys_sched_getscheduler
396 PTR sys_sched_get_priority_max
397 PTR sys_sched_get_priority_min
398 PTR sys_sched_rr_get_interval /* 4165 */
403 PTR sys_connect /* 4170 */
408 PTR sys_recv /* 4175 */
413 PTR sys_sendto /* 4180 */
418 PTR sys_setresuid /* 4185 */
420 PTR sys_ni_syscall /* was sys_query_module */
422 PTR sys_ni_syscall /* was nfsservctl */
423 PTR sys_setresgid /* 4190 */
428 PTR sys_rt_sigprocmask /* 4195 */
429 PTR sys_rt_sigpending
430 PTR sys_rt_sigtimedwait
431 PTR sys_rt_sigqueueinfo
432 PTR sys_rt_sigsuspend
433 PTR sys_pread64 /* 4200 */
438 PTR sys_capset /* 4205 */
443 PTR sys_mips_mmap2 /* 4210 */
448 PTR sys_fstat64 /* 4215 */
453 PTR sys_fcntl64 /* 4220 */
458 PTR sys_lsetxattr /* 4225 */
463 PTR sys_listxattr /* 4230 */
468 PTR sys_fremovexattr /* 4235 */
472 #ifdef CONFIG_MIPS_MT_FPAFF
474 * For FPU affinity scheduling on MIPS MT processors, we need to
475 * intercept sys_sched_xxxaffinity() calls until we get a proper hook
476 * in kernel/sched/core.c. Considered only temporary we only support
477 * these hooks for the 32-bit kernel - there is no MIPS64 MT processor
480 PTR mipsmt_sys_sched_setaffinity
481 PTR mipsmt_sys_sched_getaffinity
483 PTR sys_sched_setaffinity
484 PTR sys_sched_getaffinity /* 4240 */
485 #endif /* CONFIG_MIPS_MT_FPAFF */
490 PTR sys_io_cancel /* 4245 */
492 PTR sys_lookup_dcookie
495 PTR sys_epoll_wait /* 4250 */
496 PTR sys_remap_file_pages
497 PTR sys_set_tid_address
498 PTR sys_restart_syscall
500 PTR sys_statfs64 /* 4255 */
503 PTR sys_timer_settime
504 PTR sys_timer_gettime
505 PTR sys_timer_getoverrun /* 4260 */
507 PTR sys_clock_settime
508 PTR sys_clock_gettime
510 PTR sys_clock_nanosleep /* 4265 */
514 PTR sys_get_mempolicy
515 PTR sys_set_mempolicy /* 4270 */
519 PTR sys_mq_timedreceive
520 PTR sys_mq_notify /* 4275 */
521 PTR sys_mq_getsetattr
522 PTR sys_ni_syscall /* sys_vserver */
524 PTR sys_ni_syscall /* available, was setaltroot */
525 PTR sys_add_key /* 4280 */
528 PTR sys_set_thread_area
530 PTR sys_inotify_add_watch /* 4285 */
531 PTR sys_inotify_rm_watch
532 PTR sys_migrate_pages
535 PTR sys_mknodat /* 4290 */
540 PTR sys_renameat /* 4295 */
545 PTR sys_faccessat /* 4300 */
550 PTR sys_sync_file_range /* 4305 */
554 PTR sys_set_robust_list
555 PTR sys_get_robust_list /* 4310 */
560 PTR sys_ioprio_get /* 4315 */
563 PTR sys_ni_syscall /* was timerfd */
565 PTR sys_fallocate /* 4320 */
566 PTR sys_timerfd_create
567 PTR sys_timerfd_gettime
568 PTR sys_timerfd_settime
570 PTR sys_eventfd2 /* 4325 */
571 PTR sys_epoll_create1
574 PTR sys_inotify_init1
575 PTR sys_preadv /* 4330 */
577 PTR sys_rt_tgsigqueueinfo
578 PTR sys_perf_event_open
580 PTR sys_recvmmsg /* 4335 */
581 PTR sys_fanotify_init
582 PTR sys_fanotify_mark
584 PTR sys_name_to_handle_at
585 PTR sys_open_by_handle_at /* 4340 */
586 PTR sys_clock_adjtime
590 PTR sys_process_vm_readv /* 4345 */
591 PTR sys_process_vm_writev
594 PTR sys_sched_setattr
595 PTR sys_sched_getattr /* 4350 */
600 PTR sys_bpf /* 4355 */