Linux 3.15-rc1
[linux/fpc-iii.git] / arch / mips / kernel / scall64-o32.S
blob70f6acecd928896c54b586b3470c27eb703721be
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  */
16 #include <linux/errno.h>
17 #include <asm/asm.h>
18 #include <asm/asmmacro.h>
19 #include <asm/irqflags.h>
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>
27         .align  5
28 NESTED(handle_sys, PT_SIZE, sp)
29         .set    noat
30         SAVE_SOME
31         TRACE_IRQS_ON_RELOAD
32         STI
33         .set    at
34         ld      t1, PT_EPC(sp)          # skip syscall on return
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
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
55         dsll    t0, v0, 3               # offset into table
56         ld      t2, (sys32_call_table - (__NR_O32_Linux * 8))(t0)
58         sd      a3, PT_R26(sp)          # save a3 for syscall restarting
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
72 1:      lw      a4, 16(t0)              # argument #5 from usp
73 2:      lw      a5, 20(t0)              # argument #6 from usp
74 3:      lw      a6, 24(t0)              # argument #7 from usp
75 4:      lw      a7, 28(t0)              # argument #8 from usp (for indirect syscalls)
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
84         li      t1, _TIF_WORK_SYSCALL_ENTRY
85         LONG_L  t0, TI_FLAGS($28)       # syscall tracing enabled?
86         and     t0, t1, t0
87         bnez    t0, trace_a_syscall
89         jalr    t2                      # Do The Real Thing (TM)
91         li      t0, -EMAXERRNO - 1      # error?
92         sltu    t0, t0, v0
93         sd      t0, PT_R7(sp)           # set error flag
94         beqz    t0, 1f
96         ld      t1, PT_R2(sp)           # syscall number
97         dnegu   v0                      # error
98         sd      t1, PT_R0(sp)           # save it for syscall restarting
99 1:      sd      v0, PT_R2(sp)           # result
101 o32_syscall_exit:
102         j       syscall_exit_partial
104 /* ------------------------------------------------------------------------ */
106 trace_a_syscall:
107         SAVE_STATIC
108         sd      a4, PT_R8(sp)           # Save argument registers
109         sd      a5, PT_R9(sp)
110         sd      a6, PT_R10(sp)
111         sd      a7, PT_R11(sp)          # For indirect syscalls
113         move    s0, t2                  # Save syscall pointer
114         move    a0, sp
115         /*
116          * syscall number is in v0 unless we called syscall(__NR_###)
117          * where the real syscall number is in a0
118          * note: NR_syscall is the first O32 syscall but the macro is
119          * only defined when compiling with -mabi=32 (CONFIG_32BIT)
120          * therefore __NR_O32_Linux is used (4000)
121          */
122         addiu   a1, v0,  __NR_O32_Linux
123         bnez    v0, 1f /* __NR_syscall at offset 0 */
124         lw      a1, PT_R4(sp)
126 1:      jal     syscall_trace_enter
128         bltz    v0, 2f                  # seccomp failed? Skip syscall
130         move    t0, s0
131         RESTORE_STATIC
132         ld      a0, PT_R4(sp)           # Restore argument registers
133         ld      a1, PT_R5(sp)
134         ld      a2, PT_R6(sp)
135         ld      a3, PT_R7(sp)
136         ld      a4, PT_R8(sp)
137         ld      a5, PT_R9(sp)
138         ld      a6, PT_R10(sp)
139         ld      a7, PT_R11(sp)          # For indirect syscalls
140         jalr    t0
142         li      t0, -EMAXERRNO - 1      # error?
143         sltu    t0, t0, v0
144         sd      t0, PT_R7(sp)           # set error flag
145         beqz    t0, 1f
147         ld      t1, PT_R2(sp)           # syscall number
148         dnegu   v0                      # error
149         sd      t1, PT_R0(sp)           # save it for syscall restarting
150 1:      sd      v0, PT_R2(sp)           # result
152 2:      j       syscall_exit
154 /* ------------------------------------------------------------------------ */
156         /*
157          * The stackpointer for a call with more than 4 arguments is bad.
158          */
159 bad_stack:
160         li      v0, EFAULT
161         sd      v0, PT_R2(sp)
162         li      t0, 1                   # set error flag
163         sd      t0, PT_R7(sp)
164         j       o32_syscall_exit
166 not_o32_scall:
167         /*
168          * This is not an o32 compatibility syscall, pass it on
169          * to the 64-bit syscall handlers.
170          */
171 #ifdef CONFIG_MIPS32_N32
172         j       handle_sysn32
173 #else
174         j       handle_sys64
175 #endif
176         END(handle_sys)
178 LEAF(sys32_syscall)
179         subu    t0, a0, __NR_O32_Linux  # check syscall number
180         sltiu   v0, t0, __NR_O32_Linux_syscalls + 1
181         beqz    t0, einval              # do not recurse
182         dsll    t1, t0, 3
183         beqz    v0, einval
184         ld      t2, sys32_call_table(t1)                # syscall routine
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 */
201 einval: li      v0, -ENOSYS
202         jr      ra
203         END(sys32_syscall)
205         .align  3
206         .type   sys32_call_table,@object
207 EXPORT(sys32_call_table)
208         PTR     sys32_syscall                   /* 4000 */
209         PTR     sys_exit
210         PTR     __sys_fork
211         PTR     sys_read
212         PTR     sys_write
213         PTR     compat_sys_open                 /* 4005 */
214         PTR     sys_close
215         PTR     sys_waitpid
216         PTR     sys_creat
217         PTR     sys_link
218         PTR     sys_unlink                      /* 4010 */
219         PTR     compat_sys_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 */
229         PTR     compat_sys_mount
230         PTR     sys_oldumount
231         PTR     sys_setuid
232         PTR     sys_getuid
233         PTR     compat_sys_stime                /* 4025 */
234         PTR     compat_sys_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     sysm_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     compat_sys_ustat
271         PTR     sys_dup2
272         PTR     sys_getppid
273         PTR     sys_getpgrp                     /* 4065 */
274         PTR     sys_setsid
275         PTR     sys_32_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     compat_sys_gettimeofday
287         PTR     compat_sys_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
297         PTR     compat_sys_old_readdir
298         PTR     sys_mips_mmap                   /* 4090 */
299         PTR     sys_munmap
300         PTR     compat_sys_truncate
301         PTR     compat_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     compat_sys_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 */
322         PTR     compat_sys_wait4
323         PTR     sys_swapoff                     /* 4115 */
324         PTR     compat_sys_sysinfo
325         PTR     compat_sys_ipc
326         PTR     sys_fsync
327         PTR     sys32_sigreturn
328         PTR     __sys_clone                     /* 4120 */
329         PTR     sys_setdomainname
330         PTR     sys_newuname
331         PTR     sys_ni_syscall                  /* sys_modify_ldt */
332         PTR     compat_sys_adjtimex
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     sys_32_personality
345         PTR     sys_ni_syscall                  /* for afs_syscall */
346         PTR     sys_setfsuid
347         PTR     sys_setfsgid
348         PTR     sys_32_llseek                   /* 4140 */
349         PTR     compat_sys_getdents
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     compat_sys_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     compat_sys_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     compat_sys_recv                 /* 4175 */
384         PTR     compat_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
397         PTR     sys_ni_syscall                  /* was nfsservctl */
398         PTR     sys_setresgid                   /* 4190 */
399         PTR     sys_getresgid
400         PTR     sys_prctl
401         PTR     sys32_rt_sigreturn
402         PTR     compat_sys_rt_sigaction
403         PTR     compat_sys_rt_sigprocmask       /* 4195 */
404         PTR     compat_sys_rt_sigpending
405         PTR     compat_sys_rt_sigtimedwait
406         PTR     compat_sys_rt_sigqueueinfo
407         PTR     compat_sys_rt_sigsuspend
408         PTR     sys_32_pread                    /* 4200 */
409         PTR     sys_32_pwrite
410         PTR     sys_chown
411         PTR     sys_getcwd
412         PTR     sys_capget
413         PTR     sys_capset                      /* 4205 */
414         PTR     compat_sys_sigaltstack
415         PTR     compat_sys_sendfile
416         PTR     sys_ni_syscall
417         PTR     sys_ni_syscall
418         PTR     sys_mips_mmap2                  /* 4210 */
419         PTR     sys_32_truncate64
420         PTR     sys_32_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     compat_sys_io_setup
450         PTR     sys_io_destroy
451         PTR     compat_sys_io_getevents
452         PTR     compat_sys_io_submit
453         PTR     sys_io_cancel                   /* 4245 */
454         PTR     sys_exit_group
455         PTR     compat_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     sys32_fadvise64_64
463         PTR     compat_sys_statfs64             /* 4255 */
464         PTR     compat_sys_fstatfs64
465         PTR     compat_sys_timer_create
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 */
486         PTR     compat_sys_waitid
487         PTR     sys_ni_syscall                  /* available, was setaltroot */
488         PTR     sys_add_key                     /* 4280 */
489         PTR     sys_request_key
490         PTR     sys_keyctl
491         PTR     sys_set_thread_area
492         PTR     sys_inotify_init
493         PTR     sys_inotify_add_watch           /* 4285 */
494         PTR     sys_inotify_rm_watch
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
501         PTR     sys_newfstatat
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     compat_sys_pselect6
510         PTR     compat_sys_ppoll
511         PTR     sys_unshare
512         PTR     sys_splice
513         PTR     sys32_sync_file_range           /* 4305 */
514         PTR     sys_tee
515         PTR     compat_sys_vmsplice
516         PTR     compat_sys_move_pages
517         PTR     compat_sys_set_robust_list
518         PTR     compat_sys_get_robust_list      /* 4310 */
519         PTR     compat_sys_kexec_load
520         PTR     sys_getcpu
521         PTR     compat_sys_epoll_pwait
522         PTR     sys_ioprio_set
523         PTR     sys_ioprio_get                  /* 4315 */
524         PTR     compat_sys_utimensat
525         PTR     compat_sys_signalfd
526         PTR     sys_ni_syscall                  /* was timerfd */
527         PTR     sys_eventfd
528         PTR     sys32_fallocate                 /* 4320 */
529         PTR     sys_timerfd_create
530         PTR     compat_sys_timerfd_gettime
531         PTR     compat_sys_timerfd_settime
532         PTR     compat_sys_signalfd4
533         PTR     sys_eventfd2                    /* 4325 */
534         PTR     sys_epoll_create1
535         PTR     sys_dup3
536         PTR     sys_pipe2
537         PTR     sys_inotify_init1
538         PTR     compat_sys_preadv               /* 4330 */
539         PTR     compat_sys_pwritev
540         PTR     compat_sys_rt_tgsigqueueinfo
541         PTR     sys_perf_event_open
542         PTR     sys_accept4
543         PTR     compat_sys_recvmmsg             /* 4335 */
544         PTR     sys_fanotify_init
545         PTR     compat_sys_fanotify_mark
546         PTR     sys_prlimit64
547         PTR     sys_name_to_handle_at
548         PTR     compat_sys_open_by_handle_at    /* 4340 */
549         PTR     compat_sys_clock_adjtime
550         PTR     sys_syncfs
551         PTR     compat_sys_sendmmsg
552         PTR     sys_setns
553         PTR     compat_sys_process_vm_readv     /* 4345 */
554         PTR     compat_sys_process_vm_writev
555         PTR     sys_kcmp
556         PTR     sys_finit_module
557         PTR     sys_sched_setattr
558         PTR     sys_sched_getattr               /* 4350 */
559         .size   sys32_call_table,.-sys32_call_table