Linux Audio

Check our new training course

Loading...
v3.5.6
  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 - 2000, 2001 by Ralf Baechle
  7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  8 * Copyright (C) 2001 MIPS Technologies, Inc.
  9 * Copyright (C) 2004 Thiemo Seufer
 10 *
 11 * Hairy, the userspace application uses a different argument passing
 12 * convention than the kernel, so we have to translate things from o32
 13 * to ABI64 calling convention.  64-bit syscalls are also processed
 14 * here for now.
 15 */
 16#include <linux/errno.h>
 17#include <asm/asm.h>
 18#include <asm/asmmacro.h>
 19#include <asm/irqflags.h>
 20#include <asm/mipsregs.h>
 21#include <asm/regdef.h>
 22#include <asm/stackframe.h>
 23#include <asm/thread_info.h>
 24#include <asm/unistd.h>
 25#include <asm/sysmips.h>
 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	ld	t1, PT_EPC(sp)		# skip syscall on return
 35
 36	dsubu	t0, v0, __NR_O32_Linux	# check syscall number
 37	sltiu	t0, t0, __NR_O32_Linux_syscalls + 1
 38	daddiu	t1, 4			# skip to next instruction
 39	sd	t1, PT_EPC(sp)
 40	beqz	t0, not_o32_scall
 41#if 0
 42 SAVE_ALL
 43 move a1, v0
 44 PRINT("Scall %ld\n")
 45 RESTORE_ALL
 46#endif
 47
 48	/* We don't want to stumble over broken sign extensions from
 49	   userland. O32 does never use the upper half. */
 50	sll	a0, a0, 0
 51	sll	a1, a1, 0
 52	sll	a2, a2, 0
 53	sll	a3, a3, 0
 54
 55	dsll	t0, v0, 3		# offset into table
 56	ld	t2, (sys_call_table - (__NR_O32_Linux * 8))(t0)
 57
 58	sd	a3, PT_R26(sp)		# save a3 for syscall restarting
 59
 60	/*
 61	 * More than four arguments.  Try to deal with it by copying the
 62	 * stack arguments from the user stack to the kernel stack.
 63	 * This Sucks (TM).
 64	 *
 65	 * We intentionally keep the kernel stack a little below the top of
 66	 * userspace so we don't have to do a slower byte accurate check here.
 67	 */
 68	ld	t0, PT_R29(sp)		# get old user stack pointer
 69	daddu	t1, t0, 32
 70	bltz	t1, bad_stack
 71
 721:	lw	a4, 16(t0)		# argument #5 from usp
 732:	lw	a5, 20(t0)		# argument #6 from usp
 743:	lw	a6, 24(t0)		# argument #7 from usp
 754:	lw	a7, 28(t0)		# argument #8 from usp (for indirect syscalls)
 76
 77	.section __ex_table,"a"
 78	PTR	1b, bad_stack
 79	PTR	2b, bad_stack
 80	PTR	3b, bad_stack
 81	PTR	4b, bad_stack
 82	.previous
 83
 84	li	t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
 85	LONG_L	t0, TI_FLAGS($28)	# syscall tracing enabled?
 86	and	t0, t1, t0
 87	bnez	t0, trace_a_syscall
 88
 89	jalr	t2			# Do The Real Thing (TM)
 90
 91	li	t0, -EMAXERRNO - 1	# error?
 92	sltu	t0, t0, v0
 93	sd	t0, PT_R7(sp)		# set error flag
 94	beqz	t0, 1f
 95
 96	ld	t1, PT_R2(sp)		# syscall number
 97	dnegu	v0			# error
 98	sd	t1, PT_R0(sp)		# save it for syscall restarting
 991:	sd	v0, PT_R2(sp)		# result
100
101o32_syscall_exit:
102	local_irq_disable		# make need_resched and
103					# signals dont change between
104					# sampling and return
105	LONG_L	a2, TI_FLAGS($28)
106	li	t0, _TIF_ALLWORK_MASK
107	and	t0, a2, t0
108	bnez	t0, o32_syscall_exit_work
109
110	j	restore_partial
111
112o32_syscall_exit_work:
113	j	syscall_exit_work_partial
114
115/* ------------------------------------------------------------------------ */
116
117trace_a_syscall:
118	SAVE_STATIC
119	sd	a4, PT_R8(sp)		# Save argument registers
120	sd	a5, PT_R9(sp)
121	sd	a6, PT_R10(sp)
122	sd	a7, PT_R11(sp)		# For indirect syscalls
123
124	move	s0, t2			# Save syscall pointer
125	move	a0, sp
126	jal	syscall_trace_enter
 
 
 
 
 
 
 
 
 
 
 
 
 
127
128	move	t0, s0
129	RESTORE_STATIC
130	ld	a0, PT_R4(sp)		# Restore argument registers
131	ld	a1, PT_R5(sp)
132	ld	a2, PT_R6(sp)
133	ld	a3, PT_R7(sp)
134	ld	a4, PT_R8(sp)
135	ld	a5, PT_R9(sp)
136	ld	a6, PT_R10(sp)
137	ld	a7, PT_R11(sp)		# For indirect syscalls
138	jalr	t0
139
140	li	t0, -EMAXERRNO - 1	# error?
141	sltu	t0, t0, v0
142	sd	t0, PT_R7(sp)		# set error flag
143	beqz	t0, 1f
144
145	ld	t1, PT_R2(sp)		# syscall number
146	dnegu	v0			# error
147	sd	t1, PT_R0(sp)		# save it for syscall restarting
1481:	sd	v0, PT_R2(sp)		# result
149
150	j	syscall_exit
151
152/* ------------------------------------------------------------------------ */
153
154	/*
155	 * The stackpointer for a call with more than 4 arguments is bad.
156	 */
157bad_stack:
158	li	v0, EFAULT
159	sd	v0, PT_R2(sp)
160	li	t0, 1			# set error flag
161	sd	t0, PT_R7(sp)
162	j	o32_syscall_exit
163
164not_o32_scall:
165	/*
166	 * This is not an o32 compatibility syscall, pass it on
167	 * to the 64-bit syscall handlers.
168	 */
169#ifdef CONFIG_MIPS32_N32
170	j	handle_sysn32
171#else
172	j	handle_sys64
173#endif
174	END(handle_sys)
175
176LEAF(sys32_syscall)
177	subu	t0, a0, __NR_O32_Linux	# check syscall number
178	sltiu	v0, t0, __NR_O32_Linux_syscalls + 1
179	beqz	t0, einval		# do not recurse
180	dsll	t1, t0, 3
181	beqz	v0, einval
182	ld	t2, sys_call_table(t1)		# syscall routine
183
184	move	a0, a1			# shift argument registers
185	move	a1, a2
186	move	a2, a3
187	move	a3, a4
188	move	a4, a5
189	move	a5, a6
190	move	a6, a7
191	sd	a0, PT_R4(sp)		# ... and push back a0 - a3, some
192	sd	a1, PT_R5(sp)		# syscalls expect them there
193	sd	a2, PT_R6(sp)
194	sd	a3, PT_R7(sp)
195	sd	a3, PT_R26(sp)		# update a3 for syscall restarting
196	jr	t2
197	/* Unreached */
198
199einval:	li	v0, -ENOSYS
200	jr	ra
201	END(sys32_syscall)
202
203	.align	3
204	.type	sys_call_table,@object
205sys_call_table:
206	PTR	sys32_syscall			/* 4000 */
207	PTR	sys_exit
208	PTR	sys_fork
209	PTR	sys_read
210	PTR	sys_write
211	PTR	compat_sys_open			/* 4005 */
212	PTR	sys_close
213	PTR	sys_waitpid
214	PTR	sys_creat
215	PTR	sys_link
216	PTR	sys_unlink			/* 4010 */
217	PTR	sys32_execve
218	PTR	sys_chdir
219	PTR	compat_sys_time
220	PTR	sys_mknod
221	PTR	sys_chmod			/* 4015 */
222	PTR	sys_lchown
223	PTR	sys_ni_syscall
224	PTR	sys_ni_syscall			/* was sys_stat */
225	PTR	sys_lseek
226	PTR	sys_getpid			/* 4020 */
227	PTR	compat_sys_mount
228	PTR	sys_oldumount
229	PTR	sys_setuid
230	PTR	sys_getuid
231	PTR	compat_sys_stime		/* 4025 */
232	PTR	compat_sys_ptrace
233	PTR	sys_alarm
234	PTR	sys_ni_syscall			/* was sys_fstat */
235	PTR	sys_pause
236	PTR	compat_sys_utime		/* 4030 */
237	PTR	sys_ni_syscall
238	PTR	sys_ni_syscall
239	PTR	sys_access
240	PTR	sys_nice
241	PTR	sys_ni_syscall			/* 4035 */
242	PTR	sys_sync
243	PTR	sys_kill
244	PTR	sys_rename
245	PTR	sys_mkdir
246	PTR	sys_rmdir			/* 4040 */
247	PTR	sys_dup
248	PTR	sysm_pipe
249	PTR	compat_sys_times
250	PTR	sys_ni_syscall
251	PTR	sys_brk				/* 4045 */
252	PTR	sys_setgid
253	PTR	sys_getgid
254	PTR	sys_ni_syscall			/* was signal	2 */
255	PTR	sys_geteuid
256	PTR	sys_getegid			/* 4050 */
257	PTR	sys_acct
258	PTR	sys_umount
259	PTR	sys_ni_syscall
260	PTR	compat_sys_ioctl
261	PTR	compat_sys_fcntl		/* 4055 */
262	PTR	sys_ni_syscall
263	PTR	sys_setpgid
264	PTR	sys_ni_syscall
265	PTR	sys_olduname
266	PTR	sys_umask			/* 4060 */
267	PTR	sys_chroot
268	PTR	compat_sys_ustat
269	PTR	sys_dup2
270	PTR	sys_getppid
271	PTR	sys_getpgrp			/* 4065 */
272	PTR	sys_setsid
273	PTR	sys_32_sigaction
274	PTR	sys_sgetmask
275	PTR	sys_ssetmask
276	PTR	sys_setreuid			/* 4070 */
277	PTR	sys_setregid
278	PTR	sys32_sigsuspend
279	PTR	compat_sys_sigpending
280	PTR	sys_sethostname
281	PTR	compat_sys_setrlimit		/* 4075 */
282	PTR	compat_sys_getrlimit
283	PTR	compat_sys_getrusage
284	PTR	compat_sys_gettimeofday
285	PTR	compat_sys_settimeofday
286	PTR	sys_getgroups			/* 4080 */
287	PTR	sys_setgroups
288	PTR	sys_ni_syscall			/* old_select */
289	PTR	sys_symlink
290	PTR	sys_ni_syscall			/* was sys_lstat */
291	PTR	sys_readlink			/* 4085 */
292	PTR	sys_uselib
293	PTR	sys_swapon
294	PTR	sys_reboot
295	PTR	compat_sys_old_readdir
296	PTR	sys_mips_mmap			/* 4090 */
297	PTR	sys_munmap
298	PTR	sys_truncate
299	PTR	sys_ftruncate
300	PTR	sys_fchmod
301	PTR	sys_fchown			/* 4095 */
302	PTR	sys_getpriority
303	PTR	sys_setpriority
304	PTR	sys_ni_syscall
305	PTR	compat_sys_statfs
306	PTR	compat_sys_fstatfs		/* 4100 */
307	PTR	sys_ni_syscall			/* sys_ioperm */
308	PTR	compat_sys_socketcall
309	PTR	sys_syslog
310	PTR	compat_sys_setitimer
311	PTR	compat_sys_getitimer		/* 4105 */
312	PTR	compat_sys_newstat
313	PTR	compat_sys_newlstat
314	PTR	compat_sys_newfstat
315	PTR	sys_uname
316	PTR	sys_ni_syscall			/* sys_ioperm  *//* 4110 */
317	PTR	sys_vhangup
318	PTR	sys_ni_syscall			/* was sys_idle	 */
319	PTR	sys_ni_syscall			/* sys_vm86 */
320	PTR	compat_sys_wait4
321	PTR	sys_swapoff			/* 4115 */
322	PTR	compat_sys_sysinfo
323	PTR	sys_32_ipc
324	PTR	sys_fsync
325	PTR	sys32_sigreturn
326	PTR	sys32_clone			/* 4120 */
327	PTR	sys_setdomainname
328	PTR	sys_newuname
329	PTR	sys_ni_syscall			/* sys_modify_ldt */
330	PTR	compat_sys_adjtimex
331	PTR	sys_mprotect			/* 4125 */
332	PTR	compat_sys_sigprocmask
333	PTR	sys_ni_syscall			/* was creat_module */
334	PTR	sys_init_module
335	PTR	sys_delete_module
336	PTR	sys_ni_syscall			/* 4130, get_kernel_syms */
337	PTR	sys_quotactl
338	PTR	sys_getpgid
339	PTR	sys_fchdir
340	PTR	sys_bdflush
341	PTR	sys_sysfs			/* 4135 */
342	PTR	sys_32_personality
343	PTR	sys_ni_syscall	 		/* for afs_syscall */
344	PTR	sys_setfsuid
345	PTR	sys_setfsgid
346	PTR	sys_32_llseek			/* 4140 */
347	PTR	compat_sys_getdents
348	PTR	compat_sys_select
349	PTR	sys_flock
350	PTR	sys_msync
351	PTR	compat_sys_readv		/* 4145 */
352	PTR	compat_sys_writev
353	PTR	sys_cacheflush
354	PTR	sys_cachectl
355	PTR	sys_sysmips
356	PTR	sys_ni_syscall			/* 4150 */
357	PTR	sys_getsid
358	PTR	sys_fdatasync
359	PTR	compat_sys_sysctl
360	PTR	sys_mlock
361	PTR	sys_munlock			/* 4155 */
362	PTR	sys_mlockall
363	PTR	sys_munlockall
364	PTR	sys_sched_setparam
365	PTR	sys_sched_getparam
366	PTR	sys_sched_setscheduler 		/* 4160 */
367	PTR	sys_sched_getscheduler
368	PTR	sys_sched_yield
369	PTR	sys_sched_get_priority_max
370	PTR	sys_sched_get_priority_min
371	PTR	sys_32_sched_rr_get_interval 	/* 4165 */
372	PTR	compat_sys_nanosleep
373	PTR	sys_mremap
374	PTR	sys_accept
375	PTR	sys_bind
376	PTR	sys_connect			/* 4170 */
377	PTR	sys_getpeername
378	PTR	sys_getsockname
379	PTR	sys_getsockopt
380	PTR	sys_listen
381	PTR	compat_sys_recv			/* 4175 */
382	PTR	compat_sys_recvfrom
383	PTR	compat_sys_recvmsg
384	PTR	sys_send
385	PTR	compat_sys_sendmsg
386	PTR	sys_sendto			/* 4180 */
387	PTR	compat_sys_setsockopt
388	PTR	sys_shutdown
389	PTR	sys_socket
390	PTR	sys_socketpair
391	PTR	sys_setresuid			/* 4185 */
392	PTR	sys_getresuid
393	PTR	sys_ni_syscall			/* was query_module */
394	PTR	sys_poll
395	PTR	sys_ni_syscall			/* was nfsservctl */
396	PTR	sys_setresgid			/* 4190 */
397	PTR	sys_getresgid
398	PTR	sys_prctl
399	PTR	sys32_rt_sigreturn
400	PTR	sys_32_rt_sigaction
401	PTR	sys_32_rt_sigprocmask 		/* 4195 */
402	PTR	sys_32_rt_sigpending
403	PTR	compat_sys_rt_sigtimedwait
404	PTR	sys_32_rt_sigqueueinfo
405	PTR	sys32_rt_sigsuspend
406	PTR	sys_32_pread			/* 4200 */
407	PTR	sys_32_pwrite
408	PTR	sys_chown
409	PTR	sys_getcwd
410	PTR	sys_capget
411	PTR	sys_capset			/* 4205 */
412	PTR	sys32_sigaltstack
413	PTR	sys_32_sendfile
414	PTR	sys_ni_syscall
415	PTR	sys_ni_syscall
416	PTR	sys_mips_mmap2			/* 4210 */
417	PTR	sys_32_truncate64
418	PTR	sys_32_ftruncate64
419	PTR	sys_newstat
420	PTR	sys_newlstat
421	PTR	sys_newfstat			/* 4215 */
422	PTR	sys_pivot_root
423	PTR	sys_mincore
424	PTR	sys_madvise
425	PTR	sys_getdents64
426	PTR	compat_sys_fcntl64		/* 4220 */
427	PTR	sys_ni_syscall
428	PTR	sys_gettid
429	PTR	sys32_readahead
430	PTR	sys_setxattr
431	PTR	sys_lsetxattr			/* 4225 */
432	PTR	sys_fsetxattr
433	PTR	sys_getxattr
434	PTR	sys_lgetxattr
435	PTR	sys_fgetxattr
436	PTR	sys_listxattr			/* 4230 */
437	PTR	sys_llistxattr
438	PTR	sys_flistxattr
439	PTR	sys_removexattr
440	PTR	sys_lremovexattr
441	PTR	sys_fremovexattr		/* 4235 */
442	PTR	sys_tkill
443	PTR	sys_sendfile64
444	PTR	sys_32_futex
445	PTR	compat_sys_sched_setaffinity
446	PTR	compat_sys_sched_getaffinity	/* 4240 */
447	PTR	compat_sys_io_setup
448	PTR	sys_io_destroy
449	PTR	compat_sys_io_getevents
450	PTR	compat_sys_io_submit
451	PTR	sys_io_cancel			/* 4245 */
452	PTR	sys_exit_group
453	PTR	sys32_lookup_dcookie
454	PTR	sys_epoll_create
455	PTR	sys_epoll_ctl
456	PTR	sys_epoll_wait			/* 4250 */
457	PTR	sys_remap_file_pages
458	PTR	sys_set_tid_address
459	PTR	sys_restart_syscall
460	PTR	sys32_fadvise64_64
461	PTR	compat_sys_statfs64		/* 4255 */
462	PTR	compat_sys_fstatfs64
463	PTR	compat_sys_timer_create
464	PTR	compat_sys_timer_settime
465	PTR	compat_sys_timer_gettime
466	PTR	sys_timer_getoverrun		/* 4260 */
467	PTR	sys_timer_delete
468	PTR	compat_sys_clock_settime
469	PTR	compat_sys_clock_gettime
470	PTR	compat_sys_clock_getres
471	PTR	compat_sys_clock_nanosleep	/* 4265 */
472	PTR	sys_tgkill
473	PTR	compat_sys_utimes
474	PTR	sys_ni_syscall			/* sys_mbind */
475	PTR	sys_ni_syscall			/* sys_get_mempolicy */
476	PTR	sys_ni_syscall			/* 4270 sys_set_mempolicy */
477	PTR	compat_sys_mq_open
478	PTR	sys_mq_unlink
479	PTR	compat_sys_mq_timedsend
480	PTR	compat_sys_mq_timedreceive
481	PTR	compat_sys_mq_notify		/* 4275 */
482	PTR	compat_sys_mq_getsetattr
483	PTR	sys_ni_syscall			/* sys_vserver */
484	PTR	sys_32_waitid
485	PTR	sys_ni_syscall			/* available, was setaltroot */
486	PTR	sys_add_key			/* 4280 */
487	PTR	sys_request_key
488	PTR	sys_keyctl
489	PTR	sys_set_thread_area
490	PTR	sys_inotify_init
491	PTR	sys_inotify_add_watch		/* 4285 */
492	PTR	sys_inotify_rm_watch
493	PTR	sys_migrate_pages
494	PTR	compat_sys_openat
495	PTR	sys_mkdirat
496	PTR	sys_mknodat			/* 4290 */
497	PTR	sys_fchownat
498	PTR	compat_sys_futimesat
499	PTR	sys_newfstatat
500	PTR	sys_unlinkat
501	PTR	sys_renameat			/* 4295 */
502	PTR	sys_linkat
503	PTR	sys_symlinkat
504	PTR	sys_readlinkat
505	PTR	sys_fchmodat
506	PTR	sys_faccessat			/* 4300 */
507	PTR	compat_sys_pselect6
508	PTR	compat_sys_ppoll
509	PTR	sys_unshare
510	PTR	sys_splice
511	PTR	sys32_sync_file_range		/* 4305 */
512	PTR	sys_tee
513	PTR	compat_sys_vmsplice
514	PTR	compat_sys_move_pages
515	PTR	compat_sys_set_robust_list
516	PTR	compat_sys_get_robust_list	/* 4310 */
517	PTR	compat_sys_kexec_load
518	PTR	sys_getcpu
519	PTR	compat_sys_epoll_pwait
520	PTR	sys_ioprio_set
521	PTR	sys_ioprio_get			/* 4315 */
522	PTR	compat_sys_utimensat
523	PTR	compat_sys_signalfd
524	PTR	sys_ni_syscall			/* was timerfd */
525	PTR	sys_eventfd
526	PTR	sys32_fallocate			/* 4320 */
527	PTR	sys_timerfd_create
528	PTR	compat_sys_timerfd_gettime
529	PTR	compat_sys_timerfd_settime
530	PTR	compat_sys_signalfd4
531	PTR	sys_eventfd2			/* 4325 */
532	PTR	sys_epoll_create1
533	PTR	sys_dup3
534	PTR	sys_pipe2
535	PTR	sys_inotify_init1
536	PTR	compat_sys_preadv		/* 4330 */
537	PTR	compat_sys_pwritev
538	PTR	compat_sys_rt_tgsigqueueinfo
539	PTR	sys_perf_event_open
540	PTR	sys_accept4
541	PTR	compat_sys_recvmmsg		/* 4335 */
542	PTR	sys_fanotify_init
543	PTR	sys_32_fanotify_mark
544	PTR	sys_prlimit64
545	PTR	sys_name_to_handle_at
546	PTR	compat_sys_open_by_handle_at	/* 4340 */
547	PTR	compat_sys_clock_adjtime
548	PTR	sys_syncfs
549	PTR	compat_sys_sendmmsg
550	PTR	sys_setns
551	PTR	compat_sys_process_vm_readv	/* 4345 */
552	PTR	compat_sys_process_vm_writev
553	.size	sys_call_table,.-sys_call_table
 
 
 
 
 
v3.15
  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 - 2000, 2001 by Ralf Baechle
  7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  8 * Copyright (C) 2001 MIPS Technologies, Inc.
  9 * Copyright (C) 2004 Thiemo Seufer
 10 *
 11 * Hairy, the userspace application uses a different argument passing
 12 * convention than the kernel, so we have to translate things from o32
 13 * to ABI64 calling convention.	 64-bit syscalls are also processed
 14 * here for now.
 15 */
 16#include <linux/errno.h>
 17#include <asm/asm.h>
 18#include <asm/asmmacro.h>
 19#include <asm/irqflags.h>
 20#include <asm/mipsregs.h>
 21#include <asm/regdef.h>
 22#include <asm/stackframe.h>
 23#include <asm/thread_info.h>
 24#include <asm/unistd.h>
 25#include <asm/sysmips.h>
 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	ld	t1, PT_EPC(sp)		# skip syscall on return
 35
 36	dsubu	t0, v0, __NR_O32_Linux	# check syscall number
 37	sltiu	t0, t0, __NR_O32_Linux_syscalls + 1
 38	daddiu	t1, 4			# skip to next instruction
 39	sd	t1, PT_EPC(sp)
 40	beqz	t0, not_o32_scall
 41#if 0
 42 SAVE_ALL
 43 move a1, v0
 44 PRINT("Scall %ld\n")
 45 RESTORE_ALL
 46#endif
 47
 48	/* We don't want to stumble over broken sign extensions from
 49	   userland. O32 does never use the upper half. */
 50	sll	a0, a0, 0
 51	sll	a1, a1, 0
 52	sll	a2, a2, 0
 53	sll	a3, a3, 0
 54
 55	dsll	t0, v0, 3		# offset into table
 56	ld	t2, (sys32_call_table - (__NR_O32_Linux * 8))(t0)
 57
 58	sd	a3, PT_R26(sp)		# save a3 for syscall restarting
 59
 60	/*
 61	 * More than four arguments.  Try to deal with it by copying the
 62	 * stack arguments from the user stack to the kernel stack.
 63	 * This Sucks (TM).
 64	 *
 65	 * We intentionally keep the kernel stack a little below the top of
 66	 * userspace so we don't have to do a slower byte accurate check here.
 67	 */
 68	ld	t0, PT_R29(sp)		# get old user stack pointer
 69	daddu	t1, t0, 32
 70	bltz	t1, bad_stack
 71
 721:	lw	a4, 16(t0)		# argument #5 from usp
 732:	lw	a5, 20(t0)		# argument #6 from usp
 743:	lw	a6, 24(t0)		# argument #7 from usp
 754:	lw	a7, 28(t0)		# argument #8 from usp (for indirect syscalls)
 76
 77	.section __ex_table,"a"
 78	PTR	1b, bad_stack
 79	PTR	2b, bad_stack
 80	PTR	3b, bad_stack
 81	PTR	4b, bad_stack
 82	.previous
 83
 84	li	t1, _TIF_WORK_SYSCALL_ENTRY
 85	LONG_L	t0, TI_FLAGS($28)	# syscall tracing enabled?
 86	and	t0, t1, t0
 87	bnez	t0, trace_a_syscall
 88
 89	jalr	t2			# Do The Real Thing (TM)
 90
 91	li	t0, -EMAXERRNO - 1	# error?
 92	sltu	t0, t0, v0
 93	sd	t0, PT_R7(sp)		# set error flag
 94	beqz	t0, 1f
 95
 96	ld	t1, PT_R2(sp)		# syscall number
 97	dnegu	v0			# error
 98	sd	t1, PT_R0(sp)		# save it for syscall restarting
 991:	sd	v0, PT_R2(sp)		# result
100
101o32_syscall_exit:
102	j	syscall_exit_partial
 
 
 
 
 
 
 
 
 
 
 
103
104/* ------------------------------------------------------------------------ */
105
106trace_a_syscall:
107	SAVE_STATIC
108	sd	a4, PT_R8(sp)		# Save argument registers
109	sd	a5, PT_R9(sp)
110	sd	a6, PT_R10(sp)
111	sd	a7, PT_R11(sp)		# For indirect syscalls
112
113	move	s0, t2			# Save syscall pointer
114	move	a0, sp
115	/*
116	 * syscall number is in v0 unless we called syscall(__NR_###)
117	 * where the real syscall number is in a0
118	 * note: NR_syscall is the first O32 syscall but the macro is
119	 * only defined when compiling with -mabi=32 (CONFIG_32BIT)
120	 * therefore __NR_O32_Linux is used (4000)
121	 */
122	addiu	a1, v0,  __NR_O32_Linux
123	bnez	v0, 1f /* __NR_syscall at offset 0 */
124	lw	a1, PT_R4(sp)
125
1261:	jal	syscall_trace_enter
127
128	bltz	v0, 2f			# seccomp failed? Skip syscall
129
130	move	t0, s0
131	RESTORE_STATIC
132	ld	a0, PT_R4(sp)		# Restore argument registers
133	ld	a1, PT_R5(sp)
134	ld	a2, PT_R6(sp)
135	ld	a3, PT_R7(sp)
136	ld	a4, PT_R8(sp)
137	ld	a5, PT_R9(sp)
138	ld	a6, PT_R10(sp)
139	ld	a7, PT_R11(sp)		# For indirect syscalls
140	jalr	t0
141
142	li	t0, -EMAXERRNO - 1	# error?
143	sltu	t0, t0, v0
144	sd	t0, PT_R7(sp)		# set error flag
145	beqz	t0, 1f
146
147	ld	t1, PT_R2(sp)		# syscall number
148	dnegu	v0			# error
149	sd	t1, PT_R0(sp)		# save it for syscall restarting
1501:	sd	v0, PT_R2(sp)		# result
151
1522:	j	syscall_exit
153
154/* ------------------------------------------------------------------------ */
155
156	/*
157	 * The stackpointer for a call with more than 4 arguments is bad.
158	 */
159bad_stack:
160	li	v0, EFAULT
161	sd	v0, PT_R2(sp)
162	li	t0, 1			# set error flag
163	sd	t0, PT_R7(sp)
164	j	o32_syscall_exit
165
166not_o32_scall:
167	/*
168	 * This is not an o32 compatibility syscall, pass it on
169	 * to the 64-bit syscall handlers.
170	 */
171#ifdef CONFIG_MIPS32_N32
172	j	handle_sysn32
173#else
174	j	handle_sys64
175#endif
176	END(handle_sys)
177
178LEAF(sys32_syscall)
179	subu	t0, a0, __NR_O32_Linux	# check syscall number
180	sltiu	v0, t0, __NR_O32_Linux_syscalls + 1
181	beqz	t0, einval		# do not recurse
182	dsll	t1, t0, 3
183	beqz	v0, einval
184	ld	t2, sys32_call_table(t1)		# syscall routine
185
186	move	a0, a1			# shift argument registers
187	move	a1, a2
188	move	a2, a3
189	move	a3, a4
190	move	a4, a5
191	move	a5, a6
192	move	a6, a7
193	sd	a0, PT_R4(sp)		# ... and push back a0 - a3, some
194	sd	a1, PT_R5(sp)		# syscalls expect them there
195	sd	a2, PT_R6(sp)
196	sd	a3, PT_R7(sp)
197	sd	a3, PT_R26(sp)		# update a3 for syscall restarting
198	jr	t2
199	/* Unreached */
200
201einval: li	v0, -ENOSYS
202	jr	ra
203	END(sys32_syscall)
204
205	.align	3
206	.type	sys32_call_table,@object
207EXPORT(sys32_call_table)
208	PTR	sys32_syscall			/* 4000 */
209	PTR	sys_exit
210	PTR	__sys_fork
211	PTR	sys_read
212	PTR	sys_write
213	PTR	compat_sys_open			/* 4005 */
214	PTR	sys_close
215	PTR	sys_waitpid
216	PTR	sys_creat
217	PTR	sys_link
218	PTR	sys_unlink			/* 4010 */
219	PTR	compat_sys_execve
220	PTR	sys_chdir
221	PTR	compat_sys_time
222	PTR	sys_mknod
223	PTR	sys_chmod			/* 4015 */
224	PTR	sys_lchown
225	PTR	sys_ni_syscall
226	PTR	sys_ni_syscall			/* was sys_stat */
227	PTR	sys_lseek
228	PTR	sys_getpid			/* 4020 */
229	PTR	compat_sys_mount
230	PTR	sys_oldumount
231	PTR	sys_setuid
232	PTR	sys_getuid
233	PTR	compat_sys_stime		/* 4025 */
234	PTR	compat_sys_ptrace
235	PTR	sys_alarm
236	PTR	sys_ni_syscall			/* was sys_fstat */
237	PTR	sys_pause
238	PTR	compat_sys_utime		/* 4030 */
239	PTR	sys_ni_syscall
240	PTR	sys_ni_syscall
241	PTR	sys_access
242	PTR	sys_nice
243	PTR	sys_ni_syscall			/* 4035 */
244	PTR	sys_sync
245	PTR	sys_kill
246	PTR	sys_rename
247	PTR	sys_mkdir
248	PTR	sys_rmdir			/* 4040 */
249	PTR	sys_dup
250	PTR	sysm_pipe
251	PTR	compat_sys_times
252	PTR	sys_ni_syscall
253	PTR	sys_brk				/* 4045 */
254	PTR	sys_setgid
255	PTR	sys_getgid
256	PTR	sys_ni_syscall			/* was signal	2 */
257	PTR	sys_geteuid
258	PTR	sys_getegid			/* 4050 */
259	PTR	sys_acct
260	PTR	sys_umount
261	PTR	sys_ni_syscall
262	PTR	compat_sys_ioctl
263	PTR	compat_sys_fcntl		/* 4055 */
264	PTR	sys_ni_syscall
265	PTR	sys_setpgid
266	PTR	sys_ni_syscall
267	PTR	sys_olduname
268	PTR	sys_umask			/* 4060 */
269	PTR	sys_chroot
270	PTR	compat_sys_ustat
271	PTR	sys_dup2
272	PTR	sys_getppid
273	PTR	sys_getpgrp			/* 4065 */
274	PTR	sys_setsid
275	PTR	sys_32_sigaction
276	PTR	sys_sgetmask
277	PTR	sys_ssetmask
278	PTR	sys_setreuid			/* 4070 */
279	PTR	sys_setregid
280	PTR	sys32_sigsuspend
281	PTR	compat_sys_sigpending
282	PTR	sys_sethostname
283	PTR	compat_sys_setrlimit		/* 4075 */
284	PTR	compat_sys_getrlimit
285	PTR	compat_sys_getrusage
286	PTR	compat_sys_gettimeofday
287	PTR	compat_sys_settimeofday
288	PTR	sys_getgroups			/* 4080 */
289	PTR	sys_setgroups
290	PTR	sys_ni_syscall			/* old_select */
291	PTR	sys_symlink
292	PTR	sys_ni_syscall			/* was sys_lstat */
293	PTR	sys_readlink			/* 4085 */
294	PTR	sys_uselib
295	PTR	sys_swapon
296	PTR	sys_reboot
297	PTR	compat_sys_old_readdir
298	PTR	sys_mips_mmap			/* 4090 */
299	PTR	sys_munmap
300	PTR	compat_sys_truncate
301	PTR	compat_sys_ftruncate
302	PTR	sys_fchmod
303	PTR	sys_fchown			/* 4095 */
304	PTR	sys_getpriority
305	PTR	sys_setpriority
306	PTR	sys_ni_syscall
307	PTR	compat_sys_statfs
308	PTR	compat_sys_fstatfs		/* 4100 */
309	PTR	sys_ni_syscall			/* sys_ioperm */
310	PTR	compat_sys_socketcall
311	PTR	sys_syslog
312	PTR	compat_sys_setitimer
313	PTR	compat_sys_getitimer		/* 4105 */
314	PTR	compat_sys_newstat
315	PTR	compat_sys_newlstat
316	PTR	compat_sys_newfstat
317	PTR	sys_uname
318	PTR	sys_ni_syscall			/* sys_ioperm  *//* 4110 */
319	PTR	sys_vhangup
320	PTR	sys_ni_syscall			/* was sys_idle	 */
321	PTR	sys_ni_syscall			/* sys_vm86 */
322	PTR	compat_sys_wait4
323	PTR	sys_swapoff			/* 4115 */
324	PTR	compat_sys_sysinfo
325	PTR	compat_sys_ipc
326	PTR	sys_fsync
327	PTR	sys32_sigreturn
328	PTR	__sys_clone			/* 4120 */
329	PTR	sys_setdomainname
330	PTR	sys_newuname
331	PTR	sys_ni_syscall			/* sys_modify_ldt */
332	PTR	compat_sys_adjtimex
333	PTR	sys_mprotect			/* 4125 */
334	PTR	compat_sys_sigprocmask
335	PTR	sys_ni_syscall			/* was creat_module */
336	PTR	sys_init_module
337	PTR	sys_delete_module
338	PTR	sys_ni_syscall			/* 4130, get_kernel_syms */
339	PTR	sys_quotactl
340	PTR	sys_getpgid
341	PTR	sys_fchdir
342	PTR	sys_bdflush
343	PTR	sys_sysfs			/* 4135 */
344	PTR	sys_32_personality
345	PTR	sys_ni_syscall			/* for afs_syscall */
346	PTR	sys_setfsuid
347	PTR	sys_setfsgid
348	PTR	sys_32_llseek			/* 4140 */
349	PTR	compat_sys_getdents
350	PTR	compat_sys_select
351	PTR	sys_flock
352	PTR	sys_msync
353	PTR	compat_sys_readv		/* 4145 */
354	PTR	compat_sys_writev
355	PTR	sys_cacheflush
356	PTR	sys_cachectl
357	PTR	sys_sysmips
358	PTR	sys_ni_syscall			/* 4150 */
359	PTR	sys_getsid
360	PTR	sys_fdatasync
361	PTR	compat_sys_sysctl
362	PTR	sys_mlock
363	PTR	sys_munlock			/* 4155 */
364	PTR	sys_mlockall
365	PTR	sys_munlockall
366	PTR	sys_sched_setparam
367	PTR	sys_sched_getparam
368	PTR	sys_sched_setscheduler		/* 4160 */
369	PTR	sys_sched_getscheduler
370	PTR	sys_sched_yield
371	PTR	sys_sched_get_priority_max
372	PTR	sys_sched_get_priority_min
373	PTR	compat_sys_sched_rr_get_interval	/* 4165 */
374	PTR	compat_sys_nanosleep
375	PTR	sys_mremap
376	PTR	sys_accept
377	PTR	sys_bind
378	PTR	sys_connect			/* 4170 */
379	PTR	sys_getpeername
380	PTR	sys_getsockname
381	PTR	sys_getsockopt
382	PTR	sys_listen
383	PTR	compat_sys_recv			/* 4175 */
384	PTR	compat_sys_recvfrom
385	PTR	compat_sys_recvmsg
386	PTR	sys_send
387	PTR	compat_sys_sendmsg
388	PTR	sys_sendto			/* 4180 */
389	PTR	compat_sys_setsockopt
390	PTR	sys_shutdown
391	PTR	sys_socket
392	PTR	sys_socketpair
393	PTR	sys_setresuid			/* 4185 */
394	PTR	sys_getresuid
395	PTR	sys_ni_syscall			/* was query_module */
396	PTR	sys_poll
397	PTR	sys_ni_syscall			/* was nfsservctl */
398	PTR	sys_setresgid			/* 4190 */
399	PTR	sys_getresgid
400	PTR	sys_prctl
401	PTR	sys32_rt_sigreturn
402	PTR	compat_sys_rt_sigaction
403	PTR	compat_sys_rt_sigprocmask	/* 4195 */
404	PTR	compat_sys_rt_sigpending
405	PTR	compat_sys_rt_sigtimedwait
406	PTR	compat_sys_rt_sigqueueinfo
407	PTR	compat_sys_rt_sigsuspend
408	PTR	sys_32_pread			/* 4200 */
409	PTR	sys_32_pwrite
410	PTR	sys_chown
411	PTR	sys_getcwd
412	PTR	sys_capget
413	PTR	sys_capset			/* 4205 */
414	PTR	compat_sys_sigaltstack
415	PTR	compat_sys_sendfile
416	PTR	sys_ni_syscall
417	PTR	sys_ni_syscall
418	PTR	sys_mips_mmap2			/* 4210 */
419	PTR	sys_32_truncate64
420	PTR	sys_32_ftruncate64
421	PTR	sys_newstat
422	PTR	sys_newlstat
423	PTR	sys_newfstat			/* 4215 */
424	PTR	sys_pivot_root
425	PTR	sys_mincore
426	PTR	sys_madvise
427	PTR	sys_getdents64
428	PTR	compat_sys_fcntl64		/* 4220 */
429	PTR	sys_ni_syscall
430	PTR	sys_gettid
431	PTR	sys32_readahead
432	PTR	sys_setxattr
433	PTR	sys_lsetxattr			/* 4225 */
434	PTR	sys_fsetxattr
435	PTR	sys_getxattr
436	PTR	sys_lgetxattr
437	PTR	sys_fgetxattr
438	PTR	sys_listxattr			/* 4230 */
439	PTR	sys_llistxattr
440	PTR	sys_flistxattr
441	PTR	sys_removexattr
442	PTR	sys_lremovexattr
443	PTR	sys_fremovexattr		/* 4235 */
444	PTR	sys_tkill
445	PTR	sys_sendfile64
446	PTR	compat_sys_futex
447	PTR	compat_sys_sched_setaffinity
448	PTR	compat_sys_sched_getaffinity	/* 4240 */
449	PTR	compat_sys_io_setup
450	PTR	sys_io_destroy
451	PTR	compat_sys_io_getevents
452	PTR	compat_sys_io_submit
453	PTR	sys_io_cancel			/* 4245 */
454	PTR	sys_exit_group
455	PTR	compat_sys_lookup_dcookie
456	PTR	sys_epoll_create
457	PTR	sys_epoll_ctl
458	PTR	sys_epoll_wait			/* 4250 */
459	PTR	sys_remap_file_pages
460	PTR	sys_set_tid_address
461	PTR	sys_restart_syscall
462	PTR	sys32_fadvise64_64
463	PTR	compat_sys_statfs64		/* 4255 */
464	PTR	compat_sys_fstatfs64
465	PTR	compat_sys_timer_create
466	PTR	compat_sys_timer_settime
467	PTR	compat_sys_timer_gettime
468	PTR	sys_timer_getoverrun		/* 4260 */
469	PTR	sys_timer_delete
470	PTR	compat_sys_clock_settime
471	PTR	compat_sys_clock_gettime
472	PTR	compat_sys_clock_getres
473	PTR	compat_sys_clock_nanosleep	/* 4265 */
474	PTR	sys_tgkill
475	PTR	compat_sys_utimes
476	PTR	sys_ni_syscall			/* sys_mbind */
477	PTR	sys_ni_syscall			/* sys_get_mempolicy */
478	PTR	sys_ni_syscall			/* 4270 sys_set_mempolicy */
479	PTR	compat_sys_mq_open
480	PTR	sys_mq_unlink
481	PTR	compat_sys_mq_timedsend
482	PTR	compat_sys_mq_timedreceive
483	PTR	compat_sys_mq_notify		/* 4275 */
484	PTR	compat_sys_mq_getsetattr
485	PTR	sys_ni_syscall			/* sys_vserver */
486	PTR	compat_sys_waitid
487	PTR	sys_ni_syscall			/* available, was setaltroot */
488	PTR	sys_add_key			/* 4280 */
489	PTR	sys_request_key
490	PTR	sys_keyctl
491	PTR	sys_set_thread_area
492	PTR	sys_inotify_init
493	PTR	sys_inotify_add_watch		/* 4285 */
494	PTR	sys_inotify_rm_watch
495	PTR	sys_migrate_pages
496	PTR	compat_sys_openat
497	PTR	sys_mkdirat
498	PTR	sys_mknodat			/* 4290 */
499	PTR	sys_fchownat
500	PTR	compat_sys_futimesat
501	PTR	sys_newfstatat
502	PTR	sys_unlinkat
503	PTR	sys_renameat			/* 4295 */
504	PTR	sys_linkat
505	PTR	sys_symlinkat
506	PTR	sys_readlinkat
507	PTR	sys_fchmodat
508	PTR	sys_faccessat			/* 4300 */
509	PTR	compat_sys_pselect6
510	PTR	compat_sys_ppoll
511	PTR	sys_unshare
512	PTR	sys_splice
513	PTR	sys32_sync_file_range		/* 4305 */
514	PTR	sys_tee
515	PTR	compat_sys_vmsplice
516	PTR	compat_sys_move_pages
517	PTR	compat_sys_set_robust_list
518	PTR	compat_sys_get_robust_list	/* 4310 */
519	PTR	compat_sys_kexec_load
520	PTR	sys_getcpu
521	PTR	compat_sys_epoll_pwait
522	PTR	sys_ioprio_set
523	PTR	sys_ioprio_get			/* 4315 */
524	PTR	compat_sys_utimensat
525	PTR	compat_sys_signalfd
526	PTR	sys_ni_syscall			/* was timerfd */
527	PTR	sys_eventfd
528	PTR	sys32_fallocate			/* 4320 */
529	PTR	sys_timerfd_create
530	PTR	compat_sys_timerfd_gettime
531	PTR	compat_sys_timerfd_settime
532	PTR	compat_sys_signalfd4
533	PTR	sys_eventfd2			/* 4325 */
534	PTR	sys_epoll_create1
535	PTR	sys_dup3
536	PTR	sys_pipe2
537	PTR	sys_inotify_init1
538	PTR	compat_sys_preadv		/* 4330 */
539	PTR	compat_sys_pwritev
540	PTR	compat_sys_rt_tgsigqueueinfo
541	PTR	sys_perf_event_open
542	PTR	sys_accept4
543	PTR	compat_sys_recvmmsg		/* 4335 */
544	PTR	sys_fanotify_init
545	PTR	compat_sys_fanotify_mark
546	PTR	sys_prlimit64
547	PTR	sys_name_to_handle_at
548	PTR	compat_sys_open_by_handle_at	/* 4340 */
549	PTR	compat_sys_clock_adjtime
550	PTR	sys_syncfs
551	PTR	compat_sys_sendmmsg
552	PTR	sys_setns
553	PTR	compat_sys_process_vm_readv	/* 4345 */
554	PTR	compat_sys_process_vm_writev
555	PTR	sys_kcmp
556	PTR	sys_finit_module
557	PTR	sys_sched_setattr
558	PTR	sys_sched_getattr		/* 4350 */
559	PTR	sys_renameat2
560	.size	sys32_call_table,.-sys32_call_table