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