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