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