Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  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
  4 * for more details.
  5 *
  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 */
 10#include <linux/errno.h>
 11#include <asm/asm.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>
 21#include <asm/war.h>
 22#include <asm/asm-offsets.h>
 23
 24/* Highest syscall used of any syscall flavour */
 25#define MAX_SYSCALL_NO	__NR_O32_Linux + __NR_O32_Linux_syscalls
 26
 27	.align  5
 28NESTED(handle_sys, PT_SIZE, sp)
 29	.set	noat
 30	SAVE_SOME
 31	TRACE_IRQS_ON_RELOAD
 32	STI
 33	.set	at
 34
 35	lw	t1, PT_EPC(sp)		# skip syscall on return
 36
 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
 40	sw	t1, PT_EPC(sp)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 41	beqz	t0, illegal_syscall
 42
 43	sll	t0, v0, 3
 44	la	t1, sys_call_table
 45	addu	t1, t0
 46	lw	t2, (t1)		# syscall routine
 47	lw	t3, 4(t1)		# >= 0 if we need stack arguments
 48	beqz	t2, illegal_syscall
 49
 50	sw	a3, PT_R26(sp)		# save a3 for syscall restarting
 51	bgez	t3, stackargs
 52
 53stack_done:
 54	lw	t0, TI_FLAGS($28)	# syscall tracing enabled?
 55	li	t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
 56	and	t0, t1
 57	bnez	t0, syscall_trace_entry	# -> yes
 58
 59	jalr	t2			# Do The Real Thing (TM)
 60
 61	li	t0, -EMAXERRNO - 1	# error?
 62	sltu	t0, t0, v0
 63	sw	t0, PT_R7(sp)		# set error flag
 64	beqz	t0, 1f
 65
 66	lw	t1, PT_R2(sp)		# syscall number
 67	negu	v0			# error
 68	sw	t1, PT_R0(sp)		# save it for syscall restarting
 691:	sw	v0, PT_R2(sp)		# result
 70
 71o32_syscall_exit:
 72	local_irq_disable		# make sure need_resched and
 73					# signals dont change between
 74					# sampling and return
 75	lw	a2, TI_FLAGS($28)	# current->work
 76	li	t0, _TIF_ALLWORK_MASK
 77	and	t0, a2
 78	bnez	t0, o32_syscall_exit_work
 79
 80	j	restore_partial
 81
 82o32_syscall_exit_work:
 83	j	syscall_exit_work_partial
 84
 85/* ------------------------------------------------------------------------ */
 86
 87syscall_trace_entry:
 88	SAVE_STATIC
 89	move	s0, t2
 90	move	a0, sp
 91	jal	syscall_trace_enter
 92
 93	move	t0, s0
 
 
 
 
 
 
 
 
 
 
 
 
 94	RESTORE_STATIC
 
 95	lw	a0, PT_R4(sp)		# Restore argument registers
 96	lw	a1, PT_R5(sp)
 97	lw	a2, PT_R6(sp)
 98	lw	a3, PT_R7(sp)
 99	jalr	t0
100
101	li	t0, -EMAXERRNO - 1	# error?
102	sltu	t0, t0, v0
103	sw	t0, PT_R7(sp)		# set error flag
104	beqz	t0, 1f
105
106	lw	t1, PT_R2(sp)		# syscall number
107	negu	v0			# error
108	sw	t1, PT_R0(sp)		# save it for syscall restarting
1091:	sw	v0, PT_R2(sp)		# result
110
111	j	syscall_exit
112
113/* ------------------------------------------------------------------------ */
114
115	/*
116	 * More than four arguments.  Try to deal with it by copying the
117	 * stack arguments from the user stack to the kernel stack.
118	 * This Sucks (TM).
119	 */
120stackargs:
121	lw	t0, PT_R29(sp)		# get old user stack pointer
122
123	/*
124	 * We intentionally keep the kernel stack a little below the top of
125	 * userspace so we don't have to do a slower byte accurate check here.
126	 */
127	lw	t5, TI_ADDR_LIMIT($28)
128	addu	t4, t0, 32
129	and	t5, t4
130	bltz	t5, bad_stack		# -> sp is bad
131
132	/* Ok, copy the args from the luser stack to the kernel stack.
133	 * t3 is the precomputed number of instruction bytes needed to
134	 * load or store arguments 6-8.
135	 */
136
137	la	t1, 5f			# load up to 3 arguments
138	subu	t1, t3
1391:	lw	t5, 16(t0)		# argument #5 from usp
140	.set    push
141	.set    noreorder
142	.set	nomacro
143	jr	t1
144	 addiu	t1, 6f - 5f
145
1462:	lw	t8, 28(t0)		# argument #8 from usp
1473:	lw	t7, 24(t0)		# argument #7 from usp
1484:	lw	t6, 20(t0)		# argument #6 from usp
1495:	jr	t1
150	 sw	t5, 16(sp)		# argument #5 to ksp
151
152	sw	t8, 28(sp)		# argument #8 to ksp
153	sw	t7, 24(sp)		# argument #7 to ksp
154	sw	t6, 20(sp)		# argument #6 to ksp
1556:	j	stack_done		# go back
156	 nop
157	.set	pop
158
159	.section __ex_table,"a"
160	PTR	1b,bad_stack
161	PTR	2b,bad_stack
162	PTR	3b,bad_stack
163	PTR	4b,bad_stack
164	.previous
165
166	/*
167	 * The stackpointer for a call with more than 4 arguments is bad.
168	 * We probably should handle this case a bit more drastic.
169	 */
170bad_stack:
171	li	v0, EFAULT
172	sw	v0, PT_R2(sp)
173	li	t0, 1				# set error flag
174	sw	t0, PT_R7(sp)
175	j	o32_syscall_exit
176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177	/*
178	 * The system call does not exist in this kernel
179	 */
180illegal_syscall:
181	li	v0, ENOSYS			# error
182	sw	v0, PT_R2(sp)
183	li	t0, 1				# set error flag
184	sw	t0, PT_R7(sp)
185	j	o32_syscall_exit
186	END(handle_sys)
187
188	LEAF(sys_syscall)
189	subu	t0, a0, __NR_O32_Linux	# check syscall number
190	sltiu	v0, t0, __NR_O32_Linux_syscalls + 1
191	beqz	t0, einval		# do not recurse
192	sll	t1, t0, 3
193	beqz	v0, einval
194	lw	t2, sys_call_table(t1)		# syscall routine
195
196	/* Some syscalls like execve get their arguments from struct pt_regs
197	   and claim zero arguments in the syscall table. Thus we have to
198	   assume the worst case and shuffle around all potential arguments.
199	   If you want performance, don't use indirect syscalls. */
200
201	move	a0, a1				# shift argument registers
202	move	a1, a2
203	move	a2, a3
204	lw	a3, 16(sp)
205	lw	t4, 20(sp)
206	lw	t5, 24(sp)
207	lw	t6, 28(sp)
208	sw	t4, 16(sp)
209	sw	t5, 20(sp)
210	sw	t6, 24(sp)
211	sw	a0, PT_R4(sp)			# .. and push back a0 - a3, some
212	sw	a1, PT_R5(sp)			# syscalls expect them there
213	sw	a2, PT_R6(sp)
214	sw	a3, PT_R7(sp)
215	sw	a3, PT_R26(sp)			# update a3 for syscall restarting
216	jr	t2
217	/* Unreached */
218
219einval:	li	v0, -ENOSYS
220	jr	ra
221	END(sys_syscall)
222
223	.macro	fifty ptr, nargs, from=1, to=50
224	sys	\ptr		\nargs
225	.if	\to-\from
226	fifty	\ptr,\nargs,"(\from+1)",\to
227	.endif
228	.endm
229
230	.macro	mille ptr, nargs, from=1, to=20
231	fifty	\ptr,\nargs
232	.if	\to-\from
233	mille	\ptr,\nargs,"(\from+1)",\to
234	.endif
235	.endm
236
237	.macro	syscalltable
238	sys	sys_syscall		8	/* 4000 */
239	sys	sys_exit		1
240	sys	sys_fork		0
241	sys	sys_read		3
242	sys	sys_write		3
243	sys	sys_open		3	/* 4005 */
244	sys	sys_close		1
245	sys	sys_waitpid		3
246	sys	sys_creat		2
247	sys	sys_link		2
248	sys	sys_unlink		1	/* 4010 */
249	sys	sys_execve		0
250	sys	sys_chdir		1
251	sys	sys_time		1
252	sys	sys_mknod		3
253	sys	sys_chmod		2	/* 4015 */
254	sys	sys_lchown		3
255	sys	sys_ni_syscall		0
256	sys	sys_ni_syscall		0	/* was sys_stat */
257	sys	sys_lseek		3
258	sys	sys_getpid		0	/* 4020 */
259	sys	sys_mount		5
260	sys	sys_oldumount		1
261	sys	sys_setuid		1
262	sys	sys_getuid		0
263	sys	sys_stime		1	/* 4025 */
264	sys	sys_ptrace		4
265	sys	sys_alarm		1
266	sys	sys_ni_syscall		0	/* was sys_fstat */
267	sys	sys_pause		0
268	sys	sys_utime		2	/* 4030 */
269	sys	sys_ni_syscall		0
270	sys	sys_ni_syscall		0
271	sys	sys_access		2
272	sys	sys_nice		1
273	sys	sys_ni_syscall		0	/* 4035 */
274	sys	sys_sync		0
275	sys	sys_kill		2
276	sys	sys_rename		2
277	sys	sys_mkdir		2
278	sys	sys_rmdir		1	/* 4040 */
279	sys	sys_dup			1
280	sys	sysm_pipe		0
281	sys	sys_times		1
282	sys	sys_ni_syscall		0
283	sys	sys_brk			1	/* 4045 */
284	sys	sys_setgid		1
285	sys	sys_getgid		0
286	sys	sys_ni_syscall		0	/* was signal(2) */
287	sys	sys_geteuid		0
288	sys	sys_getegid		0	/* 4050 */
289	sys	sys_acct		1
290	sys	sys_umount		2
291	sys	sys_ni_syscall		0
292	sys	sys_ioctl		3
293	sys	sys_fcntl		3	/* 4055 */
294	sys	sys_ni_syscall		2
295	sys	sys_setpgid		2
296	sys	sys_ni_syscall		0
297	sys	sys_olduname		1
298	sys	sys_umask		1	/* 4060 */
299	sys	sys_chroot		1
300	sys	sys_ustat		2
301	sys	sys_dup2		2
302	sys	sys_getppid		0
303	sys	sys_getpgrp		0	/* 4065 */
304	sys	sys_setsid		0
305	sys	sys_sigaction		3
306	sys	sys_sgetmask		0
307	sys	sys_ssetmask		1
308	sys	sys_setreuid		2	/* 4070 */
309	sys	sys_setregid		2
310	sys	sys_sigsuspend		0
311	sys	sys_sigpending		1
312	sys	sys_sethostname		2
313	sys	sys_setrlimit		2	/* 4075 */
314	sys	sys_getrlimit		2
315	sys	sys_getrusage		2
316	sys	sys_gettimeofday	2
317	sys	sys_settimeofday	2
318	sys	sys_getgroups		2	/* 4080 */
319	sys	sys_setgroups		2
320	sys	sys_ni_syscall		0	/* old_select */
321	sys	sys_symlink		2
322	sys	sys_ni_syscall		0	/* was sys_lstat */
323	sys	sys_readlink		3	/* 4085 */
324	sys	sys_uselib		1
325	sys	sys_swapon		2
326	sys	sys_reboot		3
327	sys	sys_old_readdir		3
328	sys	sys_mips_mmap		6	/* 4090 */
329	sys	sys_munmap		2
330	sys	sys_truncate		2
331	sys	sys_ftruncate		2
332	sys	sys_fchmod		2
333	sys	sys_fchown		3	/* 4095 */
334	sys	sys_getpriority		2
335	sys	sys_setpriority		3
336	sys	sys_ni_syscall		0
337	sys	sys_statfs		2
338	sys	sys_fstatfs		2	/* 4100 */
339	sys	sys_ni_syscall		0	/* was ioperm(2) */
340	sys	sys_socketcall		2
341	sys	sys_syslog		3
342	sys	sys_setitimer		3
343	sys	sys_getitimer		2	/* 4105 */
344	sys	sys_newstat		2
345	sys	sys_newlstat		2
346	sys	sys_newfstat		2
347	sys	sys_uname		1
348	sys	sys_ni_syscall		0	/* 4110 was iopl(2) */
349	sys	sys_vhangup		0
350	sys	sys_ni_syscall		0	/* was sys_idle() */
351	sys	sys_ni_syscall		0	/* was sys_vm86 */
352	sys	sys_wait4		4
353	sys	sys_swapoff		1	/* 4115 */
354	sys	sys_sysinfo		1
355	sys	sys_ipc			6
356	sys	sys_fsync		1
357	sys	sys_sigreturn		0
358	sys	sys_clone		0	/* 4120 */
359	sys	sys_setdomainname	2
360	sys	sys_newuname		1
361	sys	sys_ni_syscall		0	/* sys_modify_ldt */
362	sys	sys_adjtimex		1
363	sys	sys_mprotect		3	/* 4125 */
364	sys	sys_sigprocmask		3
365	sys	sys_ni_syscall		0	/* was create_module */
366	sys	sys_init_module		5
367	sys	sys_delete_module	1
368	sys	sys_ni_syscall		0	/* 4130	was get_kernel_syms */
369	sys	sys_quotactl		4
370	sys	sys_getpgid		1
371	sys	sys_fchdir		1
372	sys	sys_bdflush		2
373	sys	sys_sysfs		3	/* 4135 */
374	sys	sys_personality		1
375	sys	sys_ni_syscall		0	/* for afs_syscall */
376	sys	sys_setfsuid		1
377	sys	sys_setfsgid		1
378	sys	sys_llseek		5	/* 4140 */
379	sys	sys_getdents		3
380	sys	sys_select		5
381	sys	sys_flock		2
382	sys	sys_msync		3
383	sys	sys_readv		3	/* 4145 */
384	sys	sys_writev		3
385	sys	sys_cacheflush		3
386	sys	sys_cachectl		3
387	sys	sys_sysmips		4
388	sys	sys_ni_syscall		0	/* 4150 */
389	sys	sys_getsid		1
390	sys	sys_fdatasync		1
391	sys	sys_sysctl		1
392	sys	sys_mlock		2
393	sys	sys_munlock		2	/* 4155 */
394	sys	sys_mlockall		1
395	sys	sys_munlockall		0
396	sys	sys_sched_setparam	2
397	sys	sys_sched_getparam	2
398	sys	sys_sched_setscheduler	3	/* 4160 */
399	sys	sys_sched_getscheduler	1
400	sys	sys_sched_yield		0
401	sys	sys_sched_get_priority_max 1
402	sys	sys_sched_get_priority_min 1
403	sys	sys_sched_rr_get_interval 2	/* 4165 */
404	sys	sys_nanosleep,		2
405	sys	sys_mremap,		5
406	sys	sys_accept		3
407	sys	sys_bind		3
408	sys	sys_connect		3	/* 4170 */
409	sys	sys_getpeername		3
410	sys	sys_getsockname		3
411	sys	sys_getsockopt		5
412	sys	sys_listen		2
413	sys	sys_recv		4	/* 4175 */
414	sys	sys_recvfrom		6
415	sys	sys_recvmsg		3
416	sys	sys_send		4
417	sys	sys_sendmsg		3
418	sys	sys_sendto		6	/* 4180 */
419	sys	sys_setsockopt		5
420	sys	sys_shutdown		2
421	sys	sys_socket		3
422	sys	sys_socketpair		4
423	sys	sys_setresuid		3	/* 4185 */
424	sys	sys_getresuid		3
425	sys	sys_ni_syscall		0	/* was sys_query_module */
426	sys	sys_poll		3
427	sys	sys_ni_syscall		0	/* was nfsservctl */
428	sys	sys_setresgid		3	/* 4190 */
429	sys	sys_getresgid		3
430	sys	sys_prctl		5
431	sys	sys_rt_sigreturn	0
432	sys	sys_rt_sigaction	4
433	sys	sys_rt_sigprocmask	4	/* 4195 */
434	sys	sys_rt_sigpending	2
435	sys	sys_rt_sigtimedwait	4
436	sys	sys_rt_sigqueueinfo	3
437	sys	sys_rt_sigsuspend	0
438	sys	sys_pread64		6	/* 4200 */
439	sys	sys_pwrite64		6
440	sys	sys_chown		3
441	sys	sys_getcwd		2
442	sys	sys_capget		2
443	sys	sys_capset		2	/* 4205 */
444	sys	sys_sigaltstack		0
445	sys	sys_sendfile		4
446	sys	sys_ni_syscall		0
447	sys	sys_ni_syscall		0
448	sys	sys_mips_mmap2		6	/* 4210 */
449	sys	sys_truncate64		4
450	sys	sys_ftruncate64		4
451	sys	sys_stat64		2
452	sys	sys_lstat64		2
453	sys	sys_fstat64		2	/* 4215 */
454	sys	sys_pivot_root		2
455	sys	sys_mincore		3
456	sys	sys_madvise		3
457	sys	sys_getdents64		3
458	sys	sys_fcntl64		3	/* 4220 */
459	sys	sys_ni_syscall		0
460	sys	sys_gettid		0
461	sys	sys_readahead		5
462	sys	sys_setxattr		5
463	sys	sys_lsetxattr		5	/* 4225 */
464	sys	sys_fsetxattr		5
465	sys	sys_getxattr		4
466	sys	sys_lgetxattr		4
467	sys	sys_fgetxattr		4
468	sys	sys_listxattr		3	/* 4230 */
469	sys	sys_llistxattr		3
470	sys	sys_flistxattr		3
471	sys	sys_removexattr		2
472	sys	sys_lremovexattr	2
473	sys	sys_fremovexattr	2	/* 4235 */
474	sys	sys_tkill		2
475	sys	sys_sendfile64		5
476	sys	sys_futex		6
477#ifdef CONFIG_MIPS_MT_FPAFF
478	/*
479	 * For FPU affinity scheduling on MIPS MT processors, we need to
480	 * intercept sys_sched_xxxaffinity() calls until we get a proper hook
481	 * in kernel/sched.c.  Considered only temporary we only support these
482	 * hooks for the 32-bit kernel - there is no MIPS64 MT processor atm.
 
483	 */
484	sys	mipsmt_sys_sched_setaffinity	3
485	sys	mipsmt_sys_sched_getaffinity	3
486#else
487	sys	sys_sched_setaffinity	3
488	sys	sys_sched_getaffinity	3	/* 4240 */
489#endif /* CONFIG_MIPS_MT_FPAFF */
490	sys	sys_io_setup		2
491	sys	sys_io_destroy		1
492	sys	sys_io_getevents	5
493	sys	sys_io_submit		3
494	sys	sys_io_cancel		3	/* 4245 */
495	sys	sys_exit_group		1
496	sys	sys_lookup_dcookie	4
497	sys	sys_epoll_create	1
498	sys	sys_epoll_ctl		4
499	sys	sys_epoll_wait		3	/* 4250 */
500	sys	sys_remap_file_pages	5
501	sys	sys_set_tid_address	1
502	sys	sys_restart_syscall	0
503	sys	sys_fadvise64_64	7
504	sys	sys_statfs64		3	/* 4255 */
505	sys	sys_fstatfs64		2
506	sys	sys_timer_create	3
507	sys	sys_timer_settime	4
508	sys	sys_timer_gettime	2
509	sys	sys_timer_getoverrun	1	/* 4260 */
510	sys	sys_timer_delete	1
511	sys	sys_clock_settime	2
512	sys	sys_clock_gettime	2
513	sys	sys_clock_getres	2
514	sys	sys_clock_nanosleep	4	/* 4265 */
515	sys	sys_tgkill		3
516	sys	sys_utimes		2
517	sys	sys_mbind		4
518	sys	sys_ni_syscall		0	/* sys_get_mempolicy */
519	sys	sys_ni_syscall		0	/* 4270 sys_set_mempolicy */
520	sys	sys_mq_open		4
521	sys	sys_mq_unlink		1
522	sys	sys_mq_timedsend	5
523	sys	sys_mq_timedreceive	5
524	sys	sys_mq_notify		2	/* 4275 */
525	sys	sys_mq_getsetattr	3
526	sys	sys_ni_syscall		0	/* sys_vserver */
527	sys	sys_waitid		5
528	sys	sys_ni_syscall		0	/* available, was setaltroot */
529	sys	sys_add_key		5	/* 4280 */
530	sys	sys_request_key		4
531	sys	sys_keyctl		5
532	sys	sys_set_thread_area	1
533	sys	sys_inotify_init	0
534	sys	sys_inotify_add_watch	3	/* 4285 */
535	sys	sys_inotify_rm_watch	2
536	sys	sys_migrate_pages	4
537	sys	sys_openat		4
538	sys	sys_mkdirat		3
539	sys	sys_mknodat		4	/* 4290 */
540	sys	sys_fchownat		5
541	sys	sys_futimesat		3
542	sys	sys_fstatat64		4
543	sys	sys_unlinkat		3
544	sys	sys_renameat		4	/* 4295 */
545	sys	sys_linkat		5
546	sys	sys_symlinkat		3
547	sys	sys_readlinkat		4
548	sys	sys_fchmodat		3
549	sys	sys_faccessat		3	/* 4300 */
550	sys	sys_pselect6		6
551	sys	sys_ppoll		5
552	sys	sys_unshare		1
553	sys	sys_splice		6
554	sys	sys_sync_file_range	7	/* 4305 */
555	sys	sys_tee			4
556	sys	sys_vmsplice		4
557	sys	sys_move_pages		6
558	sys	sys_set_robust_list	2
559	sys	sys_get_robust_list	3	/* 4310 */
560	sys	sys_kexec_load		4
561	sys	sys_getcpu		3
562	sys	sys_epoll_pwait		6
563	sys	sys_ioprio_set		3
564	sys	sys_ioprio_get		2	/* 4315 */
565	sys	sys_utimensat		4
566	sys	sys_signalfd		3
567	sys	sys_ni_syscall		0	/* was timerfd */
568	sys	sys_eventfd		1
569	sys	sys_fallocate		6	/* 4320 */
570	sys	sys_timerfd_create	2
571	sys	sys_timerfd_gettime	2
572	sys	sys_timerfd_settime	4
573	sys	sys_signalfd4		4
574	sys	sys_eventfd2		2	/* 4325 */
575	sys	sys_epoll_create1	1
576	sys	sys_dup3		3
577	sys	sys_pipe2		2
578	sys	sys_inotify_init1	1
579	sys	sys_preadv		6	/* 4330 */
580	sys	sys_pwritev		6
581	sys	sys_rt_tgsigqueueinfo	4
582	sys	sys_perf_event_open	5
583	sys	sys_accept4		4
584	sys	sys_recvmmsg		5	/* 4335 */
585	sys	sys_fanotify_init	2
586	sys	sys_fanotify_mark	6
587	sys	sys_prlimit64		4
588	sys	sys_name_to_handle_at	5
589	sys	sys_open_by_handle_at	3	/* 4340 */
590	sys	sys_clock_adjtime	2
591	sys	sys_syncfs		1
592	sys	sys_sendmmsg		4
593	sys	sys_setns		2
594	.endm
595
596	/* We pre-compute the number of _instruction_ bytes needed to
597	   load or store the arguments 6-8. Negative values are ignored. */
598
599	.macro  sys function, nargs
600	PTR	\function
601	LONG	(\nargs << 2) - (5 << 2)
602	.endm
603
604	.align	3
605	.type	sys_call_table,@object
606EXPORT(sys_call_table)
607	syscalltable
608	.size	sys_call_table, . - sys_call_table
 
 
 
 
 
 
 
v4.17
  1/*
  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
  4 * for more details.
  5 *
  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.
 10 */
 11#include <linux/errno.h>
 12#include <asm/asm.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>
 22#include <asm/war.h>
 23#include <asm/asm-offsets.h>
 24
 25/* Highest syscall used of any syscall flavour */
 26#define MAX_SYSCALL_NO	__NR_O32_Linux + __NR_O32_Linux_syscalls
 27
 28	.align	5
 29NESTED(handle_sys, PT_SIZE, sp)
 30	.set	noat
 31	SAVE_SOME
 32	TRACE_IRQS_ON_RELOAD
 33	STI
 34	.set	at
 35
 36	lw	t1, PT_EPC(sp)		# skip syscall on return
 37
 
 
 38	addiu	t1, 4			# skip to next instruction
 39	sw	t1, PT_EPC(sp)
 40
 41	sw	a3, PT_R26(sp)		# save a3 for syscall restarting
 42
 43	/*
 44	 * More than four arguments.  Try to deal with it by copying the
 45	 * stack arguments from the user stack to the kernel stack.
 46	 * This Sucks (TM).
 47	 */
 48	lw	t0, PT_R29(sp)		# get old user stack pointer
 49
 50	/*
 51	 * We intentionally keep the kernel stack a little below the top of
 52	 * userspace so we don't have to do a slower byte accurate check here.
 53	 */
 54	lw	t5, TI_ADDR_LIMIT($28)
 55	addu	t4, t0, 32
 56	and	t5, t4
 57	bltz	t5, bad_stack		# -> sp is bad
 58
 59	/*
 60	 * Ok, copy the args from the luser stack to the kernel stack.
 61	 */
 62
 63	.set    push
 64	.set    noreorder
 65	.set	nomacro
 66
 67load_a4: user_lw(t5, 16(t0))		# argument #5 from usp
 68load_a5: user_lw(t6, 20(t0))		# argument #6 from usp
 69load_a6: user_lw(t7, 24(t0))		# argument #7 from usp
 70load_a7: user_lw(t8, 28(t0))		# argument #8 from usp
 71loads_done:
 72
 73	sw	t5, 16(sp)		# argument #5 to ksp
 74	sw	t6, 20(sp)		# argument #6 to ksp
 75	sw	t7, 24(sp)		# argument #7 to ksp
 76	sw	t8, 28(sp)		# argument #8 to ksp
 77	.set	pop
 78
 79	.section __ex_table,"a"
 80	PTR	load_a4, bad_stack_a4
 81	PTR	load_a5, bad_stack_a5
 82	PTR	load_a6, bad_stack_a6
 83	PTR	load_a7, bad_stack_a7
 84	.previous
 85
 86	lw	t0, TI_FLAGS($28)	# syscall tracing enabled?
 87	li	t1, _TIF_WORK_SYSCALL_ENTRY
 88	and	t0, t1
 89	bnez	t0, syscall_trace_entry # -> yes
 90syscall_common:
 91	subu	v0, v0, __NR_O32_Linux	# check syscall number
 92	sltiu	t0, v0, __NR_O32_Linux_syscalls + 1
 93	beqz	t0, illegal_syscall
 94
 95	sll	t0, v0, 2
 96	la	t1, sys_call_table
 97	addu	t1, t0
 98	lw	t2, (t1)		# syscall routine
 
 
 
 
 
 99
100	beqz	t2, illegal_syscall
 
 
 
 
101
102	jalr	t2			# Do The Real Thing (TM)
103
104	li	t0, -EMAXERRNO - 1	# error?
105	sltu	t0, t0, v0
106	sw	t0, PT_R7(sp)		# set error flag
107	beqz	t0, 1f
108
109	lw	t1, PT_R2(sp)		# syscall number
110	negu	v0			# error
111	sw	t1, PT_R0(sp)		# save it for syscall restarting
1121:	sw	v0, PT_R2(sp)		# result
113
114o32_syscall_exit:
115	j	syscall_exit_partial
 
 
 
 
 
 
 
 
 
 
 
116
117/* ------------------------------------------------------------------------ */
118
119syscall_trace_entry:
120	SAVE_STATIC
 
121	move	a0, sp
 
122
123	/*
124	 * syscall number is in v0 unless we called syscall(__NR_###)
125	 * where the real syscall number is in a0
126	 */
127	move	a1, v0
128	subu	t2, v0,  __NR_O32_Linux
129	bnez	t2, 1f /* __NR_syscall at offset 0 */
130	lw	a1, PT_R4(sp)
131
1321:	jal	syscall_trace_enter
133
134	bltz	v0, 1f			# seccomp failed? Skip syscall
135
136	RESTORE_STATIC
137	lw	v0, PT_R2(sp)		# Restore syscall (maybe modified)
138	lw	a0, PT_R4(sp)		# Restore argument registers
139	lw	a1, PT_R5(sp)
140	lw	a2, PT_R6(sp)
141	lw	a3, PT_R7(sp)
142	j	syscall_common
143
1441:	j	syscall_exit
 
 
 
 
 
 
 
 
 
 
145
146/* ------------------------------------------------------------------------ */
147
148	/*
149	 * Our open-coded access area sanity test for the stack pointer
150	 * failed. We probably should handle this case a bit more drastic.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151	 */
152bad_stack:
153	li	v0, EFAULT
154	sw	v0, PT_R2(sp)
155	li	t0, 1				# set error flag
156	sw	t0, PT_R7(sp)
157	j	o32_syscall_exit
158
159bad_stack_a4:
160	li	t5, 0
161	b	load_a5
162
163bad_stack_a5:
164	li	t6, 0
165	b	load_a6
166
167bad_stack_a6:
168	li	t7, 0
169	b	load_a7
170
171bad_stack_a7:
172	li	t8, 0
173	b	loads_done
174
175	/*
176	 * The system call does not exist in this kernel
177	 */
178illegal_syscall:
179	li	v0, ENOSYS			# error
180	sw	v0, PT_R2(sp)
181	li	t0, 1				# set error flag
182	sw	t0, PT_R7(sp)
183	j	o32_syscall_exit
184	END(handle_sys)
185
186	LEAF(sys_syscall)
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
190	sll	t1, t0, 2
191	beqz	v0, einval
192	lw	t2, sys_call_table(t1)		# syscall routine
193
 
 
 
 
 
194	move	a0, a1				# shift argument registers
195	move	a1, a2
196	move	a2, a3
197	lw	a3, 16(sp)
198	lw	t4, 20(sp)
199	lw	t5, 24(sp)
200	lw	t6, 28(sp)
201	sw	t4, 16(sp)
202	sw	t5, 20(sp)
203	sw	t6, 24(sp)
 
 
 
 
 
204	jr	t2
205	/* Unreached */
206
207einval: li	v0, -ENOSYS
208	jr	ra
209	END(sys_syscall)
210
211	.align	2
212	.type	sys_call_table, @object
213EXPORT(sys_call_table)
214	PTR	sys_syscall			/* 4000 */
215	PTR	sys_exit
216	PTR	__sys_fork
217	PTR	sys_read
218	PTR	sys_write
219	PTR	sys_open			/* 4005 */
220	PTR	sys_close
221	PTR	sys_waitpid
222	PTR	sys_creat
223	PTR	sys_link
224	PTR	sys_unlink			/* 4010 */
225	PTR	sys_execve
226	PTR	sys_chdir
227	PTR	sys_time
228	PTR	sys_mknod
229	PTR	sys_chmod			/* 4015 */
230	PTR	sys_lchown
231	PTR	sys_ni_syscall
232	PTR	sys_ni_syscall			/* was sys_stat */
233	PTR	sys_lseek
234	PTR	sys_getpid			/* 4020 */
235	PTR	sys_mount
236	PTR	sys_oldumount
237	PTR	sys_setuid
238	PTR	sys_getuid
239	PTR	sys_stime			/* 4025 */
240	PTR	sys_ptrace
241	PTR	sys_alarm
242	PTR	sys_ni_syscall			/* was sys_fstat */
243	PTR	sys_pause
244	PTR	sys_utime			/* 4030 */
245	PTR	sys_ni_syscall
246	PTR	sys_ni_syscall
247	PTR	sys_access
248	PTR	sys_nice
249	PTR	sys_ni_syscall			/* 4035 */
250	PTR	sys_sync
251	PTR	sys_kill
252	PTR	sys_rename
253	PTR	sys_mkdir
254	PTR	sys_rmdir			/* 4040 */
255	PTR	sys_dup
256	PTR	sysm_pipe
257	PTR	sys_times
258	PTR	sys_ni_syscall
259	PTR	sys_brk				/* 4045 */
260	PTR	sys_setgid
261	PTR	sys_getgid
262	PTR	sys_ni_syscall			/* was signal(2) */
263	PTR	sys_geteuid
264	PTR	sys_getegid			/* 4050 */
265	PTR	sys_acct
266	PTR	sys_umount
267	PTR	sys_ni_syscall
268	PTR	sys_ioctl
269	PTR	sys_fcntl			/* 4055 */
270	PTR	sys_ni_syscall
271	PTR	sys_setpgid
272	PTR	sys_ni_syscall
273	PTR	sys_olduname
274	PTR	sys_umask			/* 4060 */
275	PTR	sys_chroot
276	PTR	sys_ustat
277	PTR	sys_dup2
278	PTR	sys_getppid
279	PTR	sys_getpgrp			/* 4065 */
280	PTR	sys_setsid
281	PTR	sys_sigaction
282	PTR	sys_sgetmask
283	PTR	sys_ssetmask
284	PTR	sys_setreuid			/* 4070 */
285	PTR	sys_setregid
286	PTR	sys_sigsuspend
287	PTR	sys_sigpending
288	PTR	sys_sethostname
289	PTR	sys_setrlimit			/* 4075 */
290	PTR	sys_getrlimit
291	PTR	sys_getrusage
292	PTR	sys_gettimeofday
293	PTR	sys_settimeofday
294	PTR	sys_getgroups			/* 4080 */
295	PTR	sys_setgroups
296	PTR	sys_ni_syscall			/* old_select */
297	PTR	sys_symlink
298	PTR	sys_ni_syscall			/* was sys_lstat */
299	PTR	sys_readlink			/* 4085 */
300	PTR	sys_uselib
301	PTR	sys_swapon
302	PTR	sys_reboot
303	PTR	sys_old_readdir
304	PTR	sys_mips_mmap			/* 4090 */
305	PTR	sys_munmap
306	PTR	sys_truncate
307	PTR	sys_ftruncate
308	PTR	sys_fchmod
309	PTR	sys_fchown			/* 4095 */
310	PTR	sys_getpriority
311	PTR	sys_setpriority
312	PTR	sys_ni_syscall
313	PTR	sys_statfs
314	PTR	sys_fstatfs			/* 4100 */
315	PTR	sys_ni_syscall			/* was ioperm(2) */
316	PTR	sys_socketcall
317	PTR	sys_syslog
318	PTR	sys_setitimer
319	PTR	sys_getitimer			/* 4105 */
320	PTR	sys_newstat
321	PTR	sys_newlstat
322	PTR	sys_newfstat
323	PTR	sys_uname
324	PTR	sys_ni_syscall			/* 4110 was iopl(2) */
325	PTR	sys_vhangup
326	PTR	sys_ni_syscall			/* was sys_idle() */
327	PTR	sys_ni_syscall			/* was sys_vm86 */
328	PTR	sys_wait4
329	PTR	sys_swapoff			/* 4115 */
330	PTR	sys_sysinfo
331	PTR	sys_ipc
332	PTR	sys_fsync
333	PTR	sys_sigreturn
334	PTR	__sys_clone			/* 4120 */
335	PTR	sys_setdomainname
336	PTR	sys_newuname
337	PTR	sys_ni_syscall			/* sys_modify_ldt */
338	PTR	sys_adjtimex
339	PTR	sys_mprotect			/* 4125 */
340	PTR	sys_sigprocmask
341	PTR	sys_ni_syscall			/* was create_module */
342	PTR	sys_init_module
343	PTR	sys_delete_module
344	PTR	sys_ni_syscall			/* 4130 was get_kernel_syms */
345	PTR	sys_quotactl
346	PTR	sys_getpgid
347	PTR	sys_fchdir
348	PTR	sys_bdflush
349	PTR	sys_sysfs			/* 4135 */
350	PTR	sys_personality
351	PTR	sys_ni_syscall			/* for afs_syscall */
352	PTR	sys_setfsuid
353	PTR	sys_setfsgid
354	PTR	sys_llseek			/* 4140 */
355	PTR	sys_getdents
356	PTR	sys_select
357	PTR	sys_flock
358	PTR	sys_msync
359	PTR	sys_readv			/* 4145 */
360	PTR	sys_writev
361	PTR	sys_cacheflush
362	PTR	sys_cachectl
363	PTR	__sys_sysmips
364	PTR	sys_ni_syscall			/* 4150 */
365	PTR	sys_getsid
366	PTR	sys_fdatasync
367	PTR	sys_sysctl
368	PTR	sys_mlock
369	PTR	sys_munlock			/* 4155 */
370	PTR	sys_mlockall
371	PTR	sys_munlockall
372	PTR	sys_sched_setparam
373	PTR	sys_sched_getparam
374	PTR	sys_sched_setscheduler		/* 4160 */
375	PTR	sys_sched_getscheduler
376	PTR	sys_sched_yield
377	PTR	sys_sched_get_priority_max
378	PTR	sys_sched_get_priority_min
379	PTR	sys_sched_rr_get_interval	/* 4165 */
380	PTR	sys_nanosleep
381	PTR	sys_mremap
382	PTR	sys_accept
383	PTR	sys_bind
384	PTR	sys_connect			/* 4170 */
385	PTR	sys_getpeername
386	PTR	sys_getsockname
387	PTR	sys_getsockopt
388	PTR	sys_listen
389	PTR	sys_recv			/* 4175 */
390	PTR	sys_recvfrom
391	PTR	sys_recvmsg
392	PTR	sys_send
393	PTR	sys_sendmsg
394	PTR	sys_sendto			/* 4180 */
395	PTR	sys_setsockopt
396	PTR	sys_shutdown
397	PTR	sys_socket
398	PTR	sys_socketpair
399	PTR	sys_setresuid			/* 4185 */
400	PTR	sys_getresuid
401	PTR	sys_ni_syscall			/* was sys_query_module */
402	PTR	sys_poll
403	PTR	sys_ni_syscall			/* was nfsservctl */
404	PTR	sys_setresgid			/* 4190 */
405	PTR	sys_getresgid
406	PTR	sys_prctl
407	PTR	sys_rt_sigreturn
408	PTR	sys_rt_sigaction
409	PTR	sys_rt_sigprocmask		/* 4195 */
410	PTR	sys_rt_sigpending
411	PTR	sys_rt_sigtimedwait
412	PTR	sys_rt_sigqueueinfo
413	PTR	sys_rt_sigsuspend
414	PTR	sys_pread64			/* 4200 */
415	PTR	sys_pwrite64
416	PTR	sys_chown
417	PTR	sys_getcwd
418	PTR	sys_capget
419	PTR	sys_capset			/* 4205 */
420	PTR	sys_sigaltstack
421	PTR	sys_sendfile
422	PTR	sys_ni_syscall
423	PTR	sys_ni_syscall
424	PTR	sys_mips_mmap2			/* 4210 */
425	PTR	sys_truncate64
426	PTR	sys_ftruncate64
427	PTR	sys_stat64
428	PTR	sys_lstat64
429	PTR	sys_fstat64			/* 4215 */
430	PTR	sys_pivot_root
431	PTR	sys_mincore
432	PTR	sys_madvise
433	PTR	sys_getdents64
434	PTR	sys_fcntl64			/* 4220 */
435	PTR	sys_ni_syscall
436	PTR	sys_gettid
437	PTR	sys_readahead
438	PTR	sys_setxattr
439	PTR	sys_lsetxattr			/* 4225 */
440	PTR	sys_fsetxattr
441	PTR	sys_getxattr
442	PTR	sys_lgetxattr
443	PTR	sys_fgetxattr
444	PTR	sys_listxattr			/* 4230 */
445	PTR	sys_llistxattr
446	PTR	sys_flistxattr
447	PTR	sys_removexattr
448	PTR	sys_lremovexattr
449	PTR	sys_fremovexattr		/* 4235 */
450	PTR	sys_tkill
451	PTR	sys_sendfile64
452	PTR	sys_futex
 
 
 
 
 
 
 
 
 
 
 
 
453#ifdef CONFIG_MIPS_MT_FPAFF
454	/*
455	 * For FPU affinity scheduling on MIPS MT processors, we need to
456	 * intercept sys_sched_xxxaffinity() calls until we get a proper hook
457	 * in kernel/sched/core.c.  Considered only temporary we only support
458	 * these hooks for the 32-bit kernel - there is no MIPS64 MT processor
459	 * atm.
460	 */
461	PTR	mipsmt_sys_sched_setaffinity
462	PTR	mipsmt_sys_sched_getaffinity
463#else
464	PTR	sys_sched_setaffinity
465	PTR	sys_sched_getaffinity		/* 4240 */
466#endif /* CONFIG_MIPS_MT_FPAFF */
467	PTR	sys_io_setup
468	PTR	sys_io_destroy
469	PTR	sys_io_getevents
470	PTR	sys_io_submit
471	PTR	sys_io_cancel			/* 4245 */
472	PTR	sys_exit_group
473	PTR	sys_lookup_dcookie
474	PTR	sys_epoll_create
475	PTR	sys_epoll_ctl
476	PTR	sys_epoll_wait			/* 4250 */
477	PTR	sys_remap_file_pages
478	PTR	sys_set_tid_address
479	PTR	sys_restart_syscall
480	PTR	sys_fadvise64_64
481	PTR	sys_statfs64			/* 4255 */
482	PTR	sys_fstatfs64
483	PTR	sys_timer_create
484	PTR	sys_timer_settime
485	PTR	sys_timer_gettime
486	PTR	sys_timer_getoverrun		/* 4260 */
487	PTR	sys_timer_delete
488	PTR	sys_clock_settime
489	PTR	sys_clock_gettime
490	PTR	sys_clock_getres
491	PTR	sys_clock_nanosleep		/* 4265 */
492	PTR	sys_tgkill
493	PTR	sys_utimes
494	PTR	sys_mbind
495	PTR	sys_get_mempolicy
496	PTR	sys_set_mempolicy		/* 4270 */
497	PTR	sys_mq_open
498	PTR	sys_mq_unlink
499	PTR	sys_mq_timedsend
500	PTR	sys_mq_timedreceive
501	PTR	sys_mq_notify			/* 4275 */
502	PTR	sys_mq_getsetattr
503	PTR	sys_ni_syscall			/* sys_vserver */
504	PTR	sys_waitid
505	PTR	sys_ni_syscall			/* available, was setaltroot */
506	PTR	sys_add_key			/* 4280 */
507	PTR	sys_request_key
508	PTR	sys_keyctl
509	PTR	sys_set_thread_area
510	PTR	sys_inotify_init
511	PTR	sys_inotify_add_watch		/* 4285 */
512	PTR	sys_inotify_rm_watch
513	PTR	sys_migrate_pages
514	PTR	sys_openat
515	PTR	sys_mkdirat
516	PTR	sys_mknodat			/* 4290 */
517	PTR	sys_fchownat
518	PTR	sys_futimesat
519	PTR	sys_fstatat64
520	PTR	sys_unlinkat
521	PTR	sys_renameat			/* 4295 */
522	PTR	sys_linkat
523	PTR	sys_symlinkat
524	PTR	sys_readlinkat
525	PTR	sys_fchmodat
526	PTR	sys_faccessat			/* 4300 */
527	PTR	sys_pselect6
528	PTR	sys_ppoll
529	PTR	sys_unshare
530	PTR	sys_splice
531	PTR	sys_sync_file_range		/* 4305 */
532	PTR	sys_tee
533	PTR	sys_vmsplice
534	PTR	sys_move_pages
535	PTR	sys_set_robust_list
536	PTR	sys_get_robust_list		/* 4310 */
537	PTR	sys_kexec_load
538	PTR	sys_getcpu
539	PTR	sys_epoll_pwait
540	PTR	sys_ioprio_set
541	PTR	sys_ioprio_get			/* 4315 */
542	PTR	sys_utimensat
543	PTR	sys_signalfd
544	PTR	sys_ni_syscall			/* was timerfd */
545	PTR	sys_eventfd
546	PTR	sys_fallocate			/* 4320 */
547	PTR	sys_timerfd_create
548	PTR	sys_timerfd_gettime
549	PTR	sys_timerfd_settime
550	PTR	sys_signalfd4
551	PTR	sys_eventfd2			/* 4325 */
552	PTR	sys_epoll_create1
553	PTR	sys_dup3
554	PTR	sys_pipe2
555	PTR	sys_inotify_init1
556	PTR	sys_preadv			/* 4330 */
557	PTR	sys_pwritev
558	PTR	sys_rt_tgsigqueueinfo
559	PTR	sys_perf_event_open
560	PTR	sys_accept4
561	PTR	sys_recvmmsg			/* 4335 */
562	PTR	sys_fanotify_init
563	PTR	sys_fanotify_mark
564	PTR	sys_prlimit64
565	PTR	sys_name_to_handle_at
566	PTR	sys_open_by_handle_at		/* 4340 */
567	PTR	sys_clock_adjtime
568	PTR	sys_syncfs
569	PTR	sys_sendmmsg
570	PTR	sys_setns
571	PTR	sys_process_vm_readv		/* 4345 */
572	PTR	sys_process_vm_writev
573	PTR	sys_kcmp
574	PTR	sys_finit_module
575	PTR	sys_sched_setattr
576	PTR	sys_sched_getattr		/* 4350 */
577	PTR	sys_renameat2
578	PTR	sys_seccomp
579	PTR	sys_getrandom
580	PTR	sys_memfd_create
581	PTR	sys_bpf				/* 4355 */
582	PTR	sys_execveat
583	PTR	sys_userfaultfd
584	PTR	sys_membarrier
585	PTR	sys_mlock2
586	PTR	sys_copy_file_range		/* 4360 */
587	PTR	sys_preadv2
588	PTR	sys_pwritev2
589	PTR	sys_pkey_mprotect
590	PTR	sys_pkey_alloc
591	PTR	sys_pkey_free			/* 4365 */
592	PTR	sys_statx