[MIPS] Make SB1 cache flushes not to use on_each_cpu
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / mips / kernel / scall64-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 *
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 */
1da177e4
LT
16#include <linux/errno.h>
17#include <asm/asm.h>
18#include <asm/asmmacro.h>
192ef366 19#include <asm/irqflags.h>
1da177e4
LT
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
eae6c0da 31 TRACE_IRQS_ON_RELOAD
1da177e4
LT
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, (sys_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
721: lw a4, 16(t0) # argument #5 from usp
732: lw a5, 20(t0) # argument #6 from usp
743: lw a6, 24(t0) # argument #7 from usp
754: lw a7, 28(t0) # argument #8 from usp (for indirect syscalls)
76
77 .section __ex_table,"a"
78 PTR 1b, bad_stack
79 PTR 2b, bad_stack
80 PTR 3b, bad_stack
81 PTR 4b, bad_stack
82 .previous
83
84 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
85 LONG_L t0, TI_FLAGS($28) # syscall tracing enabled?
86 and t0, t1, t0
87 bnez t0, trace_a_syscall
88
89 jalr t2 # Do The Real Thing (TM)
90
91 li t0, -EMAXERRNO - 1 # error?
92 sltu t0, t0, v0
93 sd t0, PT_R7(sp) # set error flag
94 beqz t0, 1f
95
96 dnegu v0 # error
97 sd v0, PT_R0(sp) # flag for syscall restarting
981: sd v0, PT_R2(sp) # result
99
100o32_syscall_exit:
101 local_irq_disable # make need_resched and
102 # signals dont change between
103 # sampling and return
104 LONG_L a2, TI_FLAGS($28)
105 li t0, _TIF_ALLWORK_MASK
106 and t0, a2, t0
107 bnez t0, o32_syscall_exit_work
108
109 j restore_partial
110
111o32_syscall_exit_work:
112 j syscall_exit_work_partial
113
114/* ------------------------------------------------------------------------ */
115
116trace_a_syscall:
117 SAVE_STATIC
118 sd a4, PT_R8(sp) # Save argument registers
119 sd a5, PT_R9(sp)
120 sd a6, PT_R10(sp)
121 sd a7, PT_R11(sp) # For indirect syscalls
122
123 move s0, t2 # Save syscall pointer
124 move a0, sp
125 li a1, 0
126 jal do_syscall_trace
127
04a7052c
RB
128 move t0, s0
129 RESTORE_STATIC
1da177e4
LT
130 ld a0, PT_R4(sp) # Restore argument registers
131 ld a1, PT_R5(sp)
132 ld a2, PT_R6(sp)
133 ld a3, PT_R7(sp)
134 ld a4, PT_R8(sp)
135 ld a5, PT_R9(sp)
136 ld a6, PT_R10(sp)
137 ld a7, PT_R11(sp) # For indirect syscalls
04a7052c 138 jalr t0
1da177e4
LT
139
140 li t0, -EMAXERRNO - 1 # error?
141 sltu t0, t0, v0
142 sd t0, PT_R7(sp) # set error flag
143 beqz t0, 1f
144
145 dnegu v0 # error
146 sd v0, PT_R0(sp) # set flag for syscall restarting
1471: sd v0, PT_R2(sp) # result
148
149 j syscall_exit
150
151/* ------------------------------------------------------------------------ */
152
153 /*
154 * The stackpointer for a call with more than 4 arguments is bad.
155 */
156bad_stack:
157 dnegu v0 # error
158 sd v0, PT_R0(sp)
159 sd v0, PT_R2(sp)
160 li t0, 1 # set error flag
161 sd t0, PT_R7(sp)
162 j o32_syscall_exit
163
164not_o32_scall:
165 /*
166 * This is not an o32 compatibility syscall, pass it on
167 * to the 64-bit syscall handlers.
168 */
169#ifdef CONFIG_MIPS32_N32
170 j handle_sysn32
171#else
172 j handle_sys64
173#endif
174 END(handle_sys)
175
176LEAF(sys32_syscall)
177 sltu v0, a0, __NR_O32_Linux + __NR_O32_Linux_syscalls + 1
178 beqz v0, einval
179
180 dsll v0, a0, 3
181 ld t2, (sys_call_table - (__NR_O32_Linux * 8))(v0)
182
183 li v1, 4000 # indirect syscall number
184 beq a0, v1, einval # do not recurse
185
186 move a0, a1 # shift argument registers
187 move a1, a2
188 move a2, a3
189 move a3, a4
190 move a4, a5
191 move a5, a6
192 move a6, a7
193 sd a0, PT_R4(sp) # ... and push back a0 - a3, some
194 sd a1, PT_R5(sp) # syscalls expect them there
195 sd a2, PT_R6(sp)
196 sd a3, PT_R7(sp)
197 sd a3, PT_R26(sp) # update a3 for syscall restarting
198 jr t2
199 /* Unreached */
200
201einval: li v0, -EINVAL
202 jr ra
203 END(sys32_syscall)
204
205 .align 3
206 .type sys_call_table,@object
207sys_call_table:
208 PTR sys32_syscall /* 4000 */
209 PTR sys_exit
210 PTR sys_fork
211 PTR sys_read
212 PTR sys_write
7155262e 213 PTR compat_sys_open /* 4005 */
1da177e4
LT
214 PTR sys_close
215 PTR sys_waitpid
216 PTR sys_creat
217 PTR sys_link
218 PTR sys_unlink /* 4010 */
219 PTR sys32_execve
220 PTR sys_chdir
221 PTR compat_sys_time
222 PTR sys_mknod
223 PTR sys_chmod /* 4015 */
224 PTR sys_lchown
225 PTR sys_ni_syscall
226 PTR sys_ni_syscall /* was sys_stat */
227 PTR sys_lseek
228 PTR sys_getpid /* 4020 */
089c7e7f 229 PTR compat_sys_mount
1da177e4
LT
230 PTR sys_oldumount
231 PTR sys_setuid
232 PTR sys_getuid
233 PTR compat_sys_stime /* 4025 */
234 PTR sys32_ptrace
235 PTR sys_alarm
236 PTR sys_ni_syscall /* was sys_fstat */
237 PTR sys_pause
238 PTR compat_sys_utime /* 4030 */
239 PTR sys_ni_syscall
240 PTR sys_ni_syscall
241 PTR sys_access
242 PTR sys_nice
243 PTR sys_ni_syscall /* 4035 */
244 PTR sys_sync
245 PTR sys_kill
246 PTR sys_rename
247 PTR sys_mkdir
248 PTR sys_rmdir /* 4040 */
249 PTR sys_dup
250 PTR sys_pipe
251 PTR compat_sys_times
252 PTR sys_ni_syscall
253 PTR sys_brk /* 4045 */
254 PTR sys_setgid
255 PTR sys_getgid
256 PTR sys_ni_syscall /* was signal 2 */
257 PTR sys_geteuid
258 PTR sys_getegid /* 4050 */
259 PTR sys_acct
260 PTR sys_umount
261 PTR sys_ni_syscall
262 PTR compat_sys_ioctl
263 PTR compat_sys_fcntl /* 4055 */
264 PTR sys_ni_syscall
265 PTR sys_setpgid
266 PTR sys_ni_syscall
267 PTR sys_olduname
268 PTR sys_umask /* 4060 */
269 PTR sys_chroot
270 PTR sys32_ustat
271 PTR sys_dup2
272 PTR sys_getppid
273 PTR sys_getpgrp /* 4065 */
274 PTR sys_setsid
275 PTR sys32_sigaction
276 PTR sys_sgetmask
277 PTR sys_ssetmask
278 PTR sys_setreuid /* 4070 */
279 PTR sys_setregid
280 PTR sys32_sigsuspend
281 PTR compat_sys_sigpending
282 PTR sys_sethostname
283 PTR compat_sys_setrlimit /* 4075 */
284 PTR compat_sys_getrlimit
285 PTR compat_sys_getrusage
286 PTR sys32_gettimeofday
287 PTR sys32_settimeofday
288 PTR sys_getgroups /* 4080 */
289 PTR sys_setgroups
290 PTR sys_ni_syscall /* old_select */
291 PTR sys_symlink
292 PTR sys_ni_syscall /* was sys_lstat */
293 PTR sys_readlink /* 4085 */
294 PTR sys_uselib
295 PTR sys_swapon
296 PTR sys_reboot
2fd628fe 297 PTR compat_sys_old_readdir
1da177e4
LT
298 PTR old_mmap /* 4090 */
299 PTR sys_munmap
300 PTR sys_truncate
301 PTR sys_ftruncate
302 PTR sys_fchmod
303 PTR sys_fchown /* 4095 */
304 PTR sys_getpriority
305 PTR sys_setpriority
306 PTR sys_ni_syscall
307 PTR compat_sys_statfs
308 PTR compat_sys_fstatfs /* 4100 */
309 PTR sys_ni_syscall /* sys_ioperm */
310 PTR sys32_socketcall
311 PTR sys_syslog
312 PTR compat_sys_setitimer
313 PTR compat_sys_getitimer /* 4105 */
314 PTR compat_sys_newstat
315 PTR compat_sys_newlstat
316 PTR compat_sys_newfstat
317 PTR sys_uname
318 PTR sys_ni_syscall /* sys_ioperm *//* 4110 */
319 PTR sys_vhangup
320 PTR sys_ni_syscall /* was sys_idle */
321 PTR sys_ni_syscall /* sys_vm86 */
b6e203d8 322 PTR compat_sys_wait4
1da177e4
LT
323 PTR sys_swapoff /* 4115 */
324 PTR sys32_sysinfo
325 PTR sys32_ipc
326 PTR sys_fsync
327 PTR sys32_sigreturn
3c37026d 328 PTR sys32_clone /* 4120 */
1da177e4
LT
329 PTR sys_setdomainname
330 PTR sys32_newuname
331 PTR sys_ni_syscall /* sys_modify_ldt */
3158e941 332 PTR compat_sys_adjtimex
1da177e4
LT
333 PTR sys_mprotect /* 4125 */
334 PTR compat_sys_sigprocmask
335 PTR sys_ni_syscall /* was creat_module */
336 PTR sys_init_module
337 PTR sys_delete_module
338 PTR sys_ni_syscall /* 4130, get_kernel_syms */
339 PTR sys_quotactl
340 PTR sys_getpgid
341 PTR sys_fchdir
342 PTR sys_bdflush
343 PTR sys_sysfs /* 4135 */
344 PTR sys32_personality
345 PTR sys_ni_syscall /* for afs_syscall */
346 PTR sys_setfsuid
347 PTR sys_setfsgid
348 PTR sys32_llseek /* 4140 */
2fd628fe 349 PTR compat_sys_getdents
1da177e4
LT
350 PTR compat_sys_select
351 PTR sys_flock
352 PTR sys_msync
353 PTR compat_sys_readv /* 4145 */
354 PTR compat_sys_writev
355 PTR sys_cacheflush
356 PTR sys_cachectl
357 PTR sys_sysmips
358 PTR sys_ni_syscall /* 4150 */
359 PTR sys_getsid
360 PTR sys_fdatasync
361 PTR sys32_sysctl
362 PTR sys_mlock
363 PTR sys_munlock /* 4155 */
364 PTR sys_mlockall
365 PTR sys_munlockall
366 PTR sys_sched_setparam
367 PTR sys_sched_getparam
368 PTR sys_sched_setscheduler /* 4160 */
369 PTR sys_sched_getscheduler
370 PTR sys_sched_yield
371 PTR sys_sched_get_priority_max
372 PTR sys_sched_get_priority_min
373 PTR sys32_sched_rr_get_interval /* 4165 */
374 PTR compat_sys_nanosleep
375 PTR sys_mremap
376 PTR sys_accept
377 PTR sys_bind
378 PTR sys_connect /* 4170 */
379 PTR sys_getpeername
380 PTR sys_getsockname
381 PTR sys_getsockopt
382 PTR sys_listen
383 PTR sys_recv /* 4175 */
384 PTR sys_recvfrom
385 PTR compat_sys_recvmsg
386 PTR sys_send
387 PTR compat_sys_sendmsg
388 PTR sys_sendto /* 4180 */
389 PTR compat_sys_setsockopt
390 PTR sys_shutdown
391 PTR sys_socket
392 PTR sys_socketpair
393 PTR sys_setresuid /* 4185 */
394 PTR sys_getresuid
395 PTR sys_ni_syscall /* was query_module */
396 PTR sys_poll
d547c5cc 397 PTR compat_sys_nfsservctl
1da177e4
LT
398 PTR sys_setresgid /* 4190 */
399 PTR sys_getresgid
400 PTR sys_prctl
401 PTR sys32_rt_sigreturn
402 PTR sys32_rt_sigaction
403 PTR sys32_rt_sigprocmask /* 4195 */
404 PTR sys32_rt_sigpending
405 PTR compat_sys_rt_sigtimedwait
406 PTR sys32_rt_sigqueueinfo
407 PTR sys32_rt_sigsuspend
408 PTR sys32_pread /* 4200 */
409 PTR sys32_pwrite
410 PTR sys_chown
411 PTR sys_getcwd
412 PTR sys_capget
413 PTR sys_capset /* 4205 */
414 PTR sys32_sigaltstack
415 PTR sys32_sendfile
416 PTR sys_ni_syscall
417 PTR sys_ni_syscall
418 PTR sys32_mmap2 /* 4210 */
419 PTR sys32_truncate64
420 PTR sys32_ftruncate64
421 PTR sys_newstat
422 PTR sys_newlstat
423 PTR sys_newfstat /* 4215 */
424 PTR sys_pivot_root
425 PTR sys_mincore
426 PTR sys_madvise
427 PTR sys_getdents64
428 PTR compat_sys_fcntl64 /* 4220 */
429 PTR sys_ni_syscall
430 PTR sys_gettid
431 PTR sys32_readahead
432 PTR sys_setxattr
433 PTR sys_lsetxattr /* 4225 */
434 PTR sys_fsetxattr
435 PTR sys_getxattr
436 PTR sys_lgetxattr
437 PTR sys_fgetxattr
438 PTR sys_listxattr /* 4230 */
439 PTR sys_llistxattr
440 PTR sys_flistxattr
441 PTR sys_removexattr
442 PTR sys_lremovexattr
443 PTR sys_fremovexattr /* 4235 */
444 PTR sys_tkill
445 PTR sys_sendfile64
446 PTR compat_sys_futex
447 PTR compat_sys_sched_setaffinity
448 PTR compat_sys_sched_getaffinity /* 4240 */
449 PTR sys_io_setup
450 PTR sys_io_destroy
451 PTR sys_io_getevents
452 PTR sys_io_submit
453 PTR sys_io_cancel /* 4245 */
454 PTR sys_exit_group
455 PTR sys_lookup_dcookie
456 PTR sys_epoll_create
457 PTR sys_epoll_ctl
458 PTR sys_epoll_wait /* 4250 */
459 PTR sys_remap_file_pages
460 PTR sys_set_tid_address
461 PTR sys_restart_syscall
462 PTR sys_fadvise64_64
463 PTR compat_sys_statfs64 /* 4255 */
464 PTR compat_sys_fstatfs64
d1abb6a2 465 PTR sys32_timer_create
1da177e4
LT
466 PTR compat_sys_timer_settime
467 PTR compat_sys_timer_gettime
468 PTR sys_timer_getoverrun /* 4260 */
469 PTR sys_timer_delete
470 PTR compat_sys_clock_settime
471 PTR compat_sys_clock_gettime
472 PTR compat_sys_clock_getres
473 PTR compat_sys_clock_nanosleep /* 4265 */
474 PTR sys_tgkill
475 PTR compat_sys_utimes
476 PTR sys_ni_syscall /* sys_mbind */
477 PTR sys_ni_syscall /* sys_get_mempolicy */
478 PTR sys_ni_syscall /* 4270 sys_set_mempolicy */
479 PTR compat_sys_mq_open
480 PTR sys_mq_unlink
481 PTR compat_sys_mq_timedsend
482 PTR compat_sys_mq_timedreceive
483 PTR compat_sys_mq_notify /* 4275 */
484 PTR compat_sys_mq_getsetattr
485 PTR sys_ni_syscall /* sys_vserver */
54f2da75 486 PTR sys32_waitid
1da177e4
LT
487 PTR sys_ni_syscall /* available, was setaltroot */
488 PTR sys_add_key /* 4280 */
489 PTR sys_request_key
490 PTR sys_keyctl
3c37026d 491 PTR sys_set_thread_area
7db36c85
RB
492 PTR sys_inotify_init
493 PTR sys_inotify_add_watch /* 4285 */
494 PTR sys_inotify_rm_watch
72bf8914
RB
495 PTR sys_migrate_pages
496 PTR compat_sys_openat
497 PTR sys_mkdirat
498 PTR sys_mknodat /* 4290 */
499 PTR sys_fchownat
500 PTR compat_sys_futimesat
63415dbb 501 PTR sys_newfstatat
72bf8914
RB
502 PTR sys_unlinkat
503 PTR sys_renameat /* 4295 */
504 PTR sys_linkat
505 PTR sys_symlinkat
506 PTR sys_readlinkat
507 PTR sys_fchmodat
508 PTR sys_faccessat /* 4300 */
509 PTR sys_pselect6
510 PTR sys_ppoll
511 PTR sys_unshare
f115da9c 512 PTR sys_splice
a8d587a7 513 PTR sys32_sync_file_range /* 4305 */
136d47d3 514 PTR sys_tee
722cfd90
RB
515 PTR sys_vmsplice
516 PTR compat_sys_move_pages
7fdeb048
AN
517 PTR compat_sys_set_robust_list
518 PTR compat_sys_get_robust_list /* 4310 */
d2bcf87d 519 PTR sys_ni_syscall
1da177e4 520 .size sys_call_table,.-sys_call_table