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