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