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