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