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