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