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