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 beqz t2, illegal_syscall
49 sw a3, PT_R26(sp) # save a3 for syscall restarting
52 * More than four arguments. Try to deal with it by copying the
53 * stack arguments from the user stack to the kernel stack.
56 lw t0, PT_R29(sp) # get old user stack pointer
59 * We intentionally keep the kernel stack a little below the top of
60 * userspace so we don't have to do a slower byte accurate check here.
62 lw t5, TI_ADDR_LIMIT($28)
65 bltz t5, bad_stack # -> sp is bad
68 * Ok, copy the args from the luser stack to the kernel stack.
69 * t3 is the precomputed number of instruction bytes needed to
70 * load or store arguments 6-8.
77 1: lw t5, 16(t0) # argument #5 from usp
78 4: lw t6, 20(t0) # argument #6 from usp
79 3: lw t7, 24(t0) # argument #7 from usp
80 2: 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"
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 /* ------------------------------------------------------------------------ */
121 jal syscall_trace_enter
125 lw a0, PT_R4(sp) # Restore argument registers
131 li t0, -EMAXERRNO - 1 # error?
133 sw t0, PT_R7(sp) # set error flag
136 lw t1, PT_R2(sp) # syscall number
138 sw t1, PT_R0(sp) # save it for syscall restarting
139 1: sw v0, PT_R2(sp) # result
143 /* ------------------------------------------------------------------------ */
146 * The stackpointer for a call with more than 4 arguments is bad.
147 * We probably should handle this case a bit more drastic.
152 li t0, 1 # set error flag
157 * The system call does not exist in this kernel
160 li v0, ENOSYS # error
162 li t0, 1 # set error flag
168 subu t0, a0, __NR_O32_Linux # check syscall number
169 sltiu v0, t0, __NR_O32_Linux_syscalls + 1
170 beqz t0, einval # do not recurse
173 lw t2, sys_call_table(t1) # syscall routine
175 /* Some syscalls like execve get their arguments from struct pt_regs
176 and claim zero arguments in the syscall table. Thus we have to
177 assume the worst case and shuffle around all potential arguments.
178 If you want performance, don't use indirect syscalls. */
180 move a0, a1 # shift argument registers
190 sw a0, PT_R4(sp) # .. and push back a0 - a3, some
191 sw a1, PT_R5(sp) # syscalls expect them there
194 sw a3, PT_R26(sp) # update a3 for syscall restarting
198 einval: li v0, -ENOSYS
203 .type sys_call_table, @object
204 EXPORT(sys_call_table)
205 PTR sys_syscall /* 4000 */
210 PTR sys_open /* 4005 */
215 PTR sys_unlink /* 4010 */
220 PTR sys_chmod /* 4015 */
223 PTR sys_ni_syscall /* was sys_stat */
225 PTR sys_getpid /* 4020 */
230 PTR sys_stime /* 4025 */
233 PTR sys_ni_syscall /* was sys_fstat */
235 PTR sys_utime /* 4030 */
240 PTR sys_ni_syscall /* 4035 */
245 PTR sys_rmdir /* 4040 */
250 PTR sys_brk /* 4045 */
253 PTR sys_ni_syscall /* was signal(2) */
255 PTR sys_getegid /* 4050 */
260 PTR sys_fcntl /* 4055 */
265 PTR sys_umask /* 4060 */
270 PTR sys_getpgrp /* 4065 */
275 PTR sys_setreuid /* 4070 */
280 PTR sys_setrlimit /* 4075 */
285 PTR sys_getgroups /* 4080 */
287 PTR sys_ni_syscall /* old_select */
289 PTR sys_ni_syscall /* was sys_lstat */
290 PTR sys_readlink /* 4085 */
295 PTR sys_mips_mmap /* 4090 */
300 PTR sys_fchown /* 4095 */
305 PTR sys_fstatfs /* 4100 */
306 PTR sys_ni_syscall /* was ioperm(2) */
310 PTR sys_getitimer /* 4105 */
315 PTR sys_ni_syscall /* 4110 was iopl(2) */
317 PTR sys_ni_syscall /* was sys_idle() */
318 PTR sys_ni_syscall /* was sys_vm86 */
320 PTR sys_swapoff /* 4115 */
325 PTR __sys_clone /* 4120 */
326 PTR sys_setdomainname
328 PTR sys_ni_syscall /* sys_modify_ldt */
330 PTR sys_mprotect /* 4125 */
332 PTR sys_ni_syscall /* was create_module */
334 PTR sys_delete_module
335 PTR sys_ni_syscall /* 4130 was get_kernel_syms */
340 PTR sys_sysfs /* 4135 */
342 PTR sys_ni_syscall /* for afs_syscall */
345 PTR sys_llseek /* 4140 */
350 PTR sys_readv /* 4145 */
355 PTR sys_ni_syscall /* 4150 */
360 PTR sys_munlock /* 4155 */
363 PTR sys_sched_setparam
364 PTR sys_sched_getparam
365 PTR sys_sched_setscheduler /* 4160 */
366 PTR sys_sched_getscheduler
368 PTR sys_sched_get_priority_max
369 PTR sys_sched_get_priority_min
370 PTR sys_sched_rr_get_interval /* 4165 */
375 PTR sys_connect /* 4170 */
380 PTR sys_recv /* 4175 */
385 PTR sys_sendto /* 4180 */
390 PTR sys_setresuid /* 4185 */
392 PTR sys_ni_syscall /* was sys_query_module */
394 PTR sys_ni_syscall /* was nfsservctl */
395 PTR sys_setresgid /* 4190 */
400 PTR sys_rt_sigprocmask /* 4195 */
401 PTR sys_rt_sigpending
402 PTR sys_rt_sigtimedwait
403 PTR sys_rt_sigqueueinfo
404 PTR sys_rt_sigsuspend
405 PTR sys_pread64 /* 4200 */
410 PTR sys_capset /* 4205 */
415 PTR sys_mips_mmap2 /* 4210 */
420 PTR sys_fstat64 /* 4215 */
425 PTR sys_fcntl64 /* 4220 */
430 PTR sys_lsetxattr /* 4225 */
435 PTR sys_listxattr /* 4230 */
440 PTR sys_fremovexattr /* 4235 */
444 #ifdef CONFIG_MIPS_MT_FPAFF
446 * For FPU affinity scheduling on MIPS MT processors, we need to
447 * intercept sys_sched_xxxaffinity() calls until we get a proper hook
448 * in kernel/sched/core.c. Considered only temporary we only support
449 * these hooks for the 32-bit kernel - there is no MIPS64 MT processor
452 PTR mipsmt_sys_sched_setaffinity
453 PTR mipsmt_sys_sched_getaffinity
455 PTR sys_sched_setaffinity
456 PTR sys_sched_getaffinity /* 4240 */
457 #endif /* CONFIG_MIPS_MT_FPAFF */
462 PTR sys_io_cancel /* 4245 */
464 PTR sys_lookup_dcookie
467 PTR sys_epoll_wait /* 4250 */
468 PTR sys_remap_file_pages
469 PTR sys_set_tid_address
470 PTR sys_restart_syscall
472 PTR sys_statfs64 /* 4255 */
475 PTR sys_timer_settime
476 PTR sys_timer_gettime
477 PTR sys_timer_getoverrun /* 4260 */
479 PTR sys_clock_settime
480 PTR sys_clock_gettime
482 PTR sys_clock_nanosleep /* 4265 */
486 PTR sys_ni_syscall /* sys_get_mempolicy */
487 PTR sys_ni_syscall /* 4270 sys_set_mempolicy */
491 PTR sys_mq_timedreceive
492 PTR sys_mq_notify /* 4275 */
493 PTR sys_mq_getsetattr
494 PTR sys_ni_syscall /* sys_vserver */
496 PTR sys_ni_syscall /* available, was setaltroot */
497 PTR sys_add_key /* 4280 */
500 PTR sys_set_thread_area
502 PTR sys_inotify_add_watch /* 4285 */
503 PTR sys_inotify_rm_watch
504 PTR sys_migrate_pages
507 PTR sys_mknodat /* 4290 */
512 PTR sys_renameat /* 4295 */
517 PTR sys_faccessat /* 4300 */
522 PTR sys_sync_file_range /* 4305 */
526 PTR sys_set_robust_list
527 PTR sys_get_robust_list /* 4310 */
532 PTR sys_ioprio_get /* 4315 */
535 PTR sys_ni_syscall /* was timerfd */
537 PTR sys_fallocate /* 4320 */
538 PTR sys_timerfd_create
539 PTR sys_timerfd_gettime
540 PTR sys_timerfd_settime
542 PTR sys_eventfd2 /* 4325 */
543 PTR sys_epoll_create1
546 PTR sys_inotify_init1
547 PTR sys_preadv /* 4330 */
549 PTR sys_rt_tgsigqueueinfo
550 PTR sys_perf_event_open
552 PTR sys_recvmmsg /* 4335 */
553 PTR sys_fanotify_init
554 PTR sys_fanotify_mark
556 PTR sys_name_to_handle_at
557 PTR sys_open_by_handle_at /* 4340 */
558 PTR sys_clock_adjtime
562 PTR sys_process_vm_readv /* 4345 */
563 PTR sys_process_vm_writev
566 PTR sys_sched_setattr
567 PTR sys_sched_getattr /* 4350 */