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