Merge branch 'acpi-ec'
[linux-drm-fsl-dcu.git] / arch / mips / kernel / scall64-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 - 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>
26
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
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, (sys32_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
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)
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_WORK_SYSCALL_ENTRY
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         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
100
101 o32_syscall_exit:
102         j       syscall_exit_partial
103
104 /* ------------------------------------------------------------------------ */
105
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
112
113         move    s0, t2                  # Save syscall pointer
114         move    a0, sp
115         /*
116          * absolute 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         .set    push
123         .set    reorder
124         subu    t1, v0,  __NR_O32_Linux
125         move    a1, v0
126         bnez    t1, 1f /* __NR_syscall at offset 0 */
127         lw      a1, PT_R4(sp) /* Arg1 for __NR_syscall case */
128         .set    pop
129
130 1:      jal     syscall_trace_enter
131
132         bltz    v0, 2f                  # seccomp failed? Skip syscall
133
134         move    t0, s0
135         RESTORE_STATIC
136         ld      a0, PT_R4(sp)           # Restore argument registers
137         ld      a1, PT_R5(sp)
138         ld      a2, PT_R6(sp)
139         ld      a3, PT_R7(sp)
140         ld      a4, PT_R8(sp)
141         ld      a5, PT_R9(sp)
142         ld      a6, PT_R10(sp)
143         ld      a7, PT_R11(sp)          # For indirect syscalls
144         jalr    t0
145
146         li      t0, -EMAXERRNO - 1      # error?
147         sltu    t0, t0, v0
148         sd      t0, PT_R7(sp)           # set error flag
149         beqz    t0, 1f
150
151         ld      t1, PT_R2(sp)           # syscall number
152         dnegu   v0                      # error
153         sd      t1, PT_R0(sp)           # save it for syscall restarting
154 1:      sd      v0, PT_R2(sp)           # result
155
156 2:      j       syscall_exit
157
158 /* ------------------------------------------------------------------------ */
159
160         /*
161          * The stackpointer for a call with more than 4 arguments is bad.
162          */
163 bad_stack:
164         li      v0, EFAULT
165         sd      v0, PT_R2(sp)
166         li      t0, 1                   # set error flag
167         sd      t0, PT_R7(sp)
168         j       o32_syscall_exit
169
170 not_o32_scall:
171         /*
172          * This is not an o32 compatibility syscall, pass it on
173          * to the 64-bit syscall handlers.
174          */
175 #ifdef CONFIG_MIPS32_N32
176         j       handle_sysn32
177 #else
178         j       handle_sys64
179 #endif
180         END(handle_sys)
181
182 LEAF(sys32_syscall)
183         subu    t0, a0, __NR_O32_Linux  # check syscall number
184         sltiu   v0, t0, __NR_O32_Linux_syscalls + 1
185         beqz    t0, einval              # do not recurse
186         dsll    t1, t0, 3
187         beqz    v0, einval
188         ld      t2, sys32_call_table(t1)                # syscall routine
189         sd      a0, PT_R2(sp)           # call routine directly on restart
190
191         move    a0, a1                  # shift argument registers
192         move    a1, a2
193         move    a2, a3
194         move    a3, a4
195         move    a4, a5
196         move    a5, a6
197         move    a6, a7
198         sd      a0, PT_R4(sp)           # ... and push back a0 - a3, some
199         sd      a1, PT_R5(sp)           # syscalls expect them there
200         sd      a2, PT_R6(sp)
201         sd      a3, PT_R7(sp)
202         sd      a3, PT_R26(sp)          # update a3 for syscall restarting
203         jr      t2
204         /* Unreached */
205
206 einval: li      v0, -ENOSYS
207         jr      ra
208         END(sys32_syscall)
209
210         .align  3
211         .type   sys32_call_table,@object
212 EXPORT(sys32_call_table)
213         PTR     sys32_syscall                   /* 4000 */
214         PTR     sys_exit
215         PTR     __sys_fork
216         PTR     sys_read
217         PTR     sys_write
218         PTR     compat_sys_open                 /* 4005 */
219         PTR     sys_close
220         PTR     sys_waitpid
221         PTR     sys_creat
222         PTR     sys_link
223         PTR     sys_unlink                      /* 4010 */
224         PTR     compat_sys_execve
225         PTR     sys_chdir
226         PTR     compat_sys_time
227         PTR     sys_mknod
228         PTR     sys_chmod                       /* 4015 */
229         PTR     sys_lchown
230         PTR     sys_ni_syscall
231         PTR     sys_ni_syscall                  /* was sys_stat */
232         PTR     sys_lseek
233         PTR     sys_getpid                      /* 4020 */
234         PTR     compat_sys_mount
235         PTR     sys_oldumount
236         PTR     sys_setuid
237         PTR     sys_getuid
238         PTR     compat_sys_stime                /* 4025 */
239         PTR     compat_sys_ptrace
240         PTR     sys_alarm
241         PTR     sys_ni_syscall                  /* was sys_fstat */
242         PTR     sys_pause
243         PTR     compat_sys_utime                /* 4030 */
244         PTR     sys_ni_syscall
245         PTR     sys_ni_syscall
246         PTR     sys_access
247         PTR     sys_nice
248         PTR     sys_ni_syscall                  /* 4035 */
249         PTR     sys_sync
250         PTR     sys_kill
251         PTR     sys_rename
252         PTR     sys_mkdir
253         PTR     sys_rmdir                       /* 4040 */
254         PTR     sys_dup
255         PTR     sysm_pipe
256         PTR     compat_sys_times
257         PTR     sys_ni_syscall
258         PTR     sys_brk                         /* 4045 */
259         PTR     sys_setgid
260         PTR     sys_getgid
261         PTR     sys_ni_syscall                  /* was signal   2 */
262         PTR     sys_geteuid
263         PTR     sys_getegid                     /* 4050 */
264         PTR     sys_acct
265         PTR     sys_umount
266         PTR     sys_ni_syscall
267         PTR     compat_sys_ioctl
268         PTR     compat_sys_fcntl                /* 4055 */
269         PTR     sys_ni_syscall
270         PTR     sys_setpgid
271         PTR     sys_ni_syscall
272         PTR     sys_olduname
273         PTR     sys_umask                       /* 4060 */
274         PTR     sys_chroot
275         PTR     compat_sys_ustat
276         PTR     sys_dup2
277         PTR     sys_getppid
278         PTR     sys_getpgrp                     /* 4065 */
279         PTR     sys_setsid
280         PTR     sys_32_sigaction
281         PTR     sys_sgetmask
282         PTR     sys_ssetmask
283         PTR     sys_setreuid                    /* 4070 */
284         PTR     sys_setregid
285         PTR     sys32_sigsuspend
286         PTR     compat_sys_sigpending
287         PTR     sys_sethostname
288         PTR     compat_sys_setrlimit            /* 4075 */
289         PTR     compat_sys_getrlimit
290         PTR     compat_sys_getrusage
291         PTR     compat_sys_gettimeofday
292         PTR     compat_sys_settimeofday
293         PTR     sys_getgroups                   /* 4080 */
294         PTR     sys_setgroups
295         PTR     sys_ni_syscall                  /* old_select */
296         PTR     sys_symlink
297         PTR     sys_ni_syscall                  /* was sys_lstat */
298         PTR     sys_readlink                    /* 4085 */
299         PTR     sys_uselib
300         PTR     sys_swapon
301         PTR     sys_reboot
302         PTR     compat_sys_old_readdir
303         PTR     sys_mips_mmap                   /* 4090 */
304         PTR     sys_munmap
305         PTR     compat_sys_truncate
306         PTR     compat_sys_ftruncate
307         PTR     sys_fchmod
308         PTR     sys_fchown                      /* 4095 */
309         PTR     sys_getpriority
310         PTR     sys_setpriority
311         PTR     sys_ni_syscall
312         PTR     compat_sys_statfs
313         PTR     compat_sys_fstatfs              /* 4100 */
314         PTR     sys_ni_syscall                  /* sys_ioperm */
315         PTR     compat_sys_socketcall
316         PTR     sys_syslog
317         PTR     compat_sys_setitimer
318         PTR     compat_sys_getitimer            /* 4105 */
319         PTR     compat_sys_newstat
320         PTR     compat_sys_newlstat
321         PTR     compat_sys_newfstat
322         PTR     sys_uname
323         PTR     sys_ni_syscall                  /* sys_ioperm  *//* 4110 */
324         PTR     sys_vhangup
325         PTR     sys_ni_syscall                  /* was sys_idle  */
326         PTR     sys_ni_syscall                  /* sys_vm86 */
327         PTR     compat_sys_wait4
328         PTR     sys_swapoff                     /* 4115 */
329         PTR     compat_sys_sysinfo
330         PTR     compat_sys_ipc
331         PTR     sys_fsync
332         PTR     sys32_sigreturn
333         PTR     __sys_clone                     /* 4120 */
334         PTR     sys_setdomainname
335         PTR     sys_newuname
336         PTR     sys_ni_syscall                  /* sys_modify_ldt */
337         PTR     compat_sys_adjtimex
338         PTR     sys_mprotect                    /* 4125 */
339         PTR     compat_sys_sigprocmask
340         PTR     sys_ni_syscall                  /* was creat_module */
341         PTR     sys_init_module
342         PTR     sys_delete_module
343         PTR     sys_ni_syscall                  /* 4130, get_kernel_syms */
344         PTR     sys_quotactl
345         PTR     sys_getpgid
346         PTR     sys_fchdir
347         PTR     sys_bdflush
348         PTR     sys_sysfs                       /* 4135 */
349         PTR     sys_32_personality
350         PTR     sys_ni_syscall                  /* for afs_syscall */
351         PTR     sys_setfsuid
352         PTR     sys_setfsgid
353         PTR     sys_32_llseek                   /* 4140 */
354         PTR     compat_sys_getdents
355         PTR     compat_sys_select
356         PTR     sys_flock
357         PTR     sys_msync
358         PTR     compat_sys_readv                /* 4145 */
359         PTR     compat_sys_writev
360         PTR     sys_cacheflush
361         PTR     sys_cachectl
362         PTR     sys_sysmips
363         PTR     sys_ni_syscall                  /* 4150 */
364         PTR     sys_getsid
365         PTR     sys_fdatasync
366         PTR     compat_sys_sysctl
367         PTR     sys_mlock
368         PTR     sys_munlock                     /* 4155 */
369         PTR     sys_mlockall
370         PTR     sys_munlockall
371         PTR     sys_sched_setparam
372         PTR     sys_sched_getparam
373         PTR     sys_sched_setscheduler          /* 4160 */
374         PTR     sys_sched_getscheduler
375         PTR     sys_sched_yield
376         PTR     sys_sched_get_priority_max
377         PTR     sys_sched_get_priority_min
378         PTR     compat_sys_sched_rr_get_interval        /* 4165 */
379         PTR     compat_sys_nanosleep
380         PTR     sys_mremap
381         PTR     sys_accept
382         PTR     sys_bind
383         PTR     sys_connect                     /* 4170 */
384         PTR     sys_getpeername
385         PTR     sys_getsockname
386         PTR     sys_getsockopt
387         PTR     sys_listen
388         PTR     compat_sys_recv                 /* 4175 */
389         PTR     compat_sys_recvfrom
390         PTR     compat_sys_recvmsg
391         PTR     sys_send
392         PTR     compat_sys_sendmsg
393         PTR     sys_sendto                      /* 4180 */
394         PTR     compat_sys_setsockopt
395         PTR     sys_shutdown
396         PTR     sys_socket
397         PTR     sys_socketpair
398         PTR     sys_setresuid                   /* 4185 */
399         PTR     sys_getresuid
400         PTR     sys_ni_syscall                  /* was query_module */
401         PTR     sys_poll
402         PTR     sys_ni_syscall                  /* was nfsservctl */
403         PTR     sys_setresgid                   /* 4190 */
404         PTR     sys_getresgid
405         PTR     sys_prctl
406         PTR     sys32_rt_sigreturn
407         PTR     compat_sys_rt_sigaction
408         PTR     compat_sys_rt_sigprocmask       /* 4195 */
409         PTR     compat_sys_rt_sigpending
410         PTR     compat_sys_rt_sigtimedwait
411         PTR     compat_sys_rt_sigqueueinfo
412         PTR     compat_sys_rt_sigsuspend
413         PTR     sys_32_pread                    /* 4200 */
414         PTR     sys_32_pwrite
415         PTR     sys_chown
416         PTR     sys_getcwd
417         PTR     sys_capget
418         PTR     sys_capset                      /* 4205 */
419         PTR     compat_sys_sigaltstack
420         PTR     compat_sys_sendfile
421         PTR     sys_ni_syscall
422         PTR     sys_ni_syscall
423         PTR     sys_mips_mmap2                  /* 4210 */
424         PTR     sys_32_truncate64
425         PTR     sys_32_ftruncate64
426         PTR     sys_newstat
427         PTR     sys_newlstat
428         PTR     sys_newfstat                    /* 4215 */
429         PTR     sys_pivot_root
430         PTR     sys_mincore
431         PTR     sys_madvise
432         PTR     sys_getdents64
433         PTR     compat_sys_fcntl64              /* 4220 */
434         PTR     sys_ni_syscall
435         PTR     sys_gettid
436         PTR     sys32_readahead
437         PTR     sys_setxattr
438         PTR     sys_lsetxattr                   /* 4225 */
439         PTR     sys_fsetxattr
440         PTR     sys_getxattr
441         PTR     sys_lgetxattr
442         PTR     sys_fgetxattr
443         PTR     sys_listxattr                   /* 4230 */
444         PTR     sys_llistxattr
445         PTR     sys_flistxattr
446         PTR     sys_removexattr
447         PTR     sys_lremovexattr
448         PTR     sys_fremovexattr                /* 4235 */
449         PTR     sys_tkill
450         PTR     sys_sendfile64
451         PTR     compat_sys_futex
452         PTR     compat_sys_sched_setaffinity
453         PTR     compat_sys_sched_getaffinity    /* 4240 */
454         PTR     compat_sys_io_setup
455         PTR     sys_io_destroy
456         PTR     compat_sys_io_getevents
457         PTR     compat_sys_io_submit
458         PTR     sys_io_cancel                   /* 4245 */
459         PTR     sys_exit_group
460         PTR     compat_sys_lookup_dcookie
461         PTR     sys_epoll_create
462         PTR     sys_epoll_ctl
463         PTR     sys_epoll_wait                  /* 4250 */
464         PTR     sys_remap_file_pages
465         PTR     sys_set_tid_address
466         PTR     sys_restart_syscall
467         PTR     sys32_fadvise64_64
468         PTR     compat_sys_statfs64             /* 4255 */
469         PTR     compat_sys_fstatfs64
470         PTR     compat_sys_timer_create
471         PTR     compat_sys_timer_settime
472         PTR     compat_sys_timer_gettime
473         PTR     sys_timer_getoverrun            /* 4260 */
474         PTR     sys_timer_delete
475         PTR     compat_sys_clock_settime
476         PTR     compat_sys_clock_gettime
477         PTR     compat_sys_clock_getres
478         PTR     compat_sys_clock_nanosleep      /* 4265 */
479         PTR     sys_tgkill
480         PTR     compat_sys_utimes
481         PTR     compat_sys_mbind
482         PTR     compat_sys_get_mempolicy
483         PTR     compat_sys_set_mempolicy        /* 4270 */
484         PTR     compat_sys_mq_open
485         PTR     sys_mq_unlink
486         PTR     compat_sys_mq_timedsend
487         PTR     compat_sys_mq_timedreceive
488         PTR     compat_sys_mq_notify            /* 4275 */
489         PTR     compat_sys_mq_getsetattr
490         PTR     sys_ni_syscall                  /* sys_vserver */
491         PTR     compat_sys_waitid
492         PTR     sys_ni_syscall                  /* available, was setaltroot */
493         PTR     sys_add_key                     /* 4280 */
494         PTR     sys_request_key
495         PTR     sys_keyctl
496         PTR     sys_set_thread_area
497         PTR     sys_inotify_init
498         PTR     sys_inotify_add_watch           /* 4285 */
499         PTR     sys_inotify_rm_watch
500         PTR     compat_sys_migrate_pages
501         PTR     compat_sys_openat
502         PTR     sys_mkdirat
503         PTR     sys_mknodat                     /* 4290 */
504         PTR     sys_fchownat
505         PTR     compat_sys_futimesat
506         PTR     sys_newfstatat
507         PTR     sys_unlinkat
508         PTR     sys_renameat                    /* 4295 */
509         PTR     sys_linkat
510         PTR     sys_symlinkat
511         PTR     sys_readlinkat
512         PTR     sys_fchmodat
513         PTR     sys_faccessat                   /* 4300 */
514         PTR     compat_sys_pselect6
515         PTR     compat_sys_ppoll
516         PTR     sys_unshare
517         PTR     sys_splice
518         PTR     sys32_sync_file_range           /* 4305 */
519         PTR     sys_tee
520         PTR     compat_sys_vmsplice
521         PTR     compat_sys_move_pages
522         PTR     compat_sys_set_robust_list
523         PTR     compat_sys_get_robust_list      /* 4310 */
524         PTR     compat_sys_kexec_load
525         PTR     sys_getcpu
526         PTR     compat_sys_epoll_pwait
527         PTR     sys_ioprio_set
528         PTR     sys_ioprio_get                  /* 4315 */
529         PTR     compat_sys_utimensat
530         PTR     compat_sys_signalfd
531         PTR     sys_ni_syscall                  /* was timerfd */
532         PTR     sys_eventfd
533         PTR     sys32_fallocate                 /* 4320 */
534         PTR     sys_timerfd_create
535         PTR     compat_sys_timerfd_gettime
536         PTR     compat_sys_timerfd_settime
537         PTR     compat_sys_signalfd4
538         PTR     sys_eventfd2                    /* 4325 */
539         PTR     sys_epoll_create1
540         PTR     sys_dup3
541         PTR     sys_pipe2
542         PTR     sys_inotify_init1
543         PTR     compat_sys_preadv               /* 4330 */
544         PTR     compat_sys_pwritev
545         PTR     compat_sys_rt_tgsigqueueinfo
546         PTR     sys_perf_event_open
547         PTR     sys_accept4
548         PTR     compat_sys_recvmmsg             /* 4335 */
549         PTR     sys_fanotify_init
550         PTR     compat_sys_fanotify_mark
551         PTR     sys_prlimit64
552         PTR     sys_name_to_handle_at
553         PTR     compat_sys_open_by_handle_at    /* 4340 */
554         PTR     compat_sys_clock_adjtime
555         PTR     sys_syncfs
556         PTR     compat_sys_sendmmsg
557         PTR     sys_setns
558         PTR     compat_sys_process_vm_readv     /* 4345 */
559         PTR     compat_sys_process_vm_writev
560         PTR     sys_kcmp
561         PTR     sys_finit_module
562         PTR     sys_sched_setattr
563         PTR     sys_sched_getattr               /* 4350 */
564         PTR     sys_renameat2
565         PTR     sys_seccomp
566         PTR     sys_getrandom
567         PTR     sys_memfd_create
568         PTR     sys_bpf                         /* 4355 */
569         PTR     compat_sys_execveat
570         .size   sys32_call_table,.-sys32_call_table