]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/mips/kernel/scall32-o32.S
iommu/exynos: Fix checkpatch warning
[karo-tx-linux.git] / arch / mips / kernel / scall32-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-99, 2000- 02, 06 Ralf Baechle <ralf@linux-mips.org>
7  * Copyright (C) 2001 MIPS Technologies, Inc.
8  * Copyright (C) 2004 Thiemo Seufer
9  * Copyright (C) 2014 Imagination Technologies Ltd.
10  */
11 #include <linux/errno.h>
12 #include <asm/asm.h>
13 #include <asm/asmmacro.h>
14 #include <asm/irqflags.h>
15 #include <asm/mipsregs.h>
16 #include <asm/regdef.h>
17 #include <asm/stackframe.h>
18 #include <asm/isadep.h>
19 #include <asm/sysmips.h>
20 #include <asm/thread_info.h>
21 #include <asm/unistd.h>
22 #include <asm/war.h>
23 #include <asm/asm-offsets.h>
24
25 /* Highest syscall used of any syscall flavour */
26 #define MAX_SYSCALL_NO  __NR_O32_Linux + __NR_O32_Linux_syscalls
27
28         .align  5
29 NESTED(handle_sys, PT_SIZE, sp)
30         .set    noat
31         SAVE_SOME
32         TRACE_IRQS_ON_RELOAD
33         STI
34         .set    at
35
36         lw      t1, PT_EPC(sp)          # skip syscall on return
37
38         subu    v0, v0, __NR_O32_Linux  # check syscall number
39         sltiu   t0, v0, __NR_O32_Linux_syscalls + 1
40         addiu   t1, 4                   # skip to next instruction
41         sw      t1, PT_EPC(sp)
42         beqz    t0, illegal_syscall
43
44         sll     t0, v0, 2
45         la      t1, sys_call_table
46         addu    t1, t0
47         lw      t2, (t1)                # syscall routine
48         beqz    t2, illegal_syscall
49
50         sw      a3, PT_R26(sp)          # save a3 for syscall restarting
51
52         /*
53          * More than four arguments.  Try to deal with it by copying the
54          * stack arguments from the user stack to the kernel stack.
55          * This Sucks (TM).
56          */
57         lw      t0, PT_R29(sp)          # get old user stack pointer
58
59         /*
60          * We intentionally keep the kernel stack a little below the top of
61          * userspace so we don't have to do a slower byte accurate check here.
62          */
63         lw      t5, TI_ADDR_LIMIT($28)
64         addu    t4, t0, 32
65         and     t5, t4
66         bltz    t5, bad_stack           # -> sp is bad
67
68         /*
69          * Ok, copy the args from the luser stack to the kernel stack.
70          * t3 is the precomputed number of instruction bytes needed to
71          * load or store arguments 6-8.
72          */
73
74         .set    push
75         .set    noreorder
76         .set    nomacro
77
78 1:      user_lw(t5, 16(t0))             # argument #5 from usp
79 4:      user_lw(t6, 20(t0))             # argument #6 from usp
80 3:      user_lw(t7, 24(t0))             # argument #7 from usp
81 2:      user_lw(t8, 28(t0))             # argument #8 from usp
82
83         sw      t5, 16(sp)              # argument #5 to ksp
84         sw      t6, 20(sp)              # argument #6 to ksp
85         sw      t7, 24(sp)              # argument #7 to ksp
86         sw      t8, 28(sp)              # argument #8 to ksp
87         .set    pop
88
89         .section __ex_table,"a"
90         PTR     1b,bad_stack
91         PTR     2b,bad_stack
92         PTR     3b,bad_stack
93         PTR     4b,bad_stack
94         .previous
95
96         lw      t0, TI_FLAGS($28)       # syscall tracing enabled?
97         li      t1, _TIF_WORK_SYSCALL_ENTRY
98         and     t0, t1
99         bnez    t0, syscall_trace_entry # -> yes
100
101         jalr    t2                      # Do The Real Thing (TM)
102
103         li      t0, -EMAXERRNO - 1      # error?
104         sltu    t0, t0, v0
105         sw      t0, PT_R7(sp)           # set error flag
106         beqz    t0, 1f
107
108         lw      t1, PT_R2(sp)           # syscall number
109         negu    v0                      # error
110         sw      t1, PT_R0(sp)           # save it for syscall restarting
111 1:      sw      v0, PT_R2(sp)           # result
112
113 o32_syscall_exit:
114         j       syscall_exit_partial
115
116 /* ------------------------------------------------------------------------ */
117
118 syscall_trace_entry:
119         SAVE_STATIC
120         move    s0, t2
121         move    a0, sp
122
123         /*
124          * syscall number is in v0 unless we called syscall(__NR_###)
125          * where the real syscall number is in a0
126          */
127         addiu   a1, v0,  __NR_O32_Linux
128         bnez    v0, 1f /* __NR_syscall at offset 0 */
129         lw      a1, PT_R4(sp)
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         lw      a0, PT_R4(sp)           # Restore argument registers
138         lw      a1, PT_R5(sp)
139         lw      a2, PT_R6(sp)
140         lw      a3, PT_R7(sp)
141         jalr    t0
142
143         li      t0, -EMAXERRNO - 1      # error?
144         sltu    t0, t0, v0
145         sw      t0, PT_R7(sp)           # set error flag
146         beqz    t0, 1f
147
148         lw      t1, PT_R2(sp)           # syscall number
149         negu    v0                      # error
150         sw      t1, PT_R0(sp)           # save it for syscall restarting
151 1:      sw      v0, PT_R2(sp)           # result
152
153 2:      j       syscall_exit
154
155 /* ------------------------------------------------------------------------ */
156
157         /*
158          * The stackpointer for a call with more than 4 arguments is bad.
159          * We probably should handle this case a bit more drastic.
160          */
161 bad_stack:
162         li      v0, EFAULT
163         sw      v0, PT_R2(sp)
164         li      t0, 1                           # set error flag
165         sw      t0, PT_R7(sp)
166         j       o32_syscall_exit
167
168         /*
169          * The system call does not exist in this kernel
170          */
171 illegal_syscall:
172         li      v0, ENOSYS                      # error
173         sw      v0, PT_R2(sp)
174         li      t0, 1                           # set error flag
175         sw      t0, PT_R7(sp)
176         j       o32_syscall_exit
177         END(handle_sys)
178
179         LEAF(sys_syscall)
180         subu    t0, a0, __NR_O32_Linux  # check syscall number
181         sltiu   v0, t0, __NR_O32_Linux_syscalls + 1
182         beqz    t0, einval              # do not recurse
183         sll     t1, t0, 2
184         beqz    v0, einval
185         lw      t2, sys_call_table(t1)          # syscall routine
186
187         /* Some syscalls like execve get their arguments from struct pt_regs
188            and claim zero arguments in the syscall table. Thus we have to
189            assume the worst case and shuffle around all potential arguments.
190            If you want performance, don't use indirect syscalls. */
191
192         move    a0, a1                          # shift argument registers
193         move    a1, a2
194         move    a2, a3
195         lw      a3, 16(sp)
196         lw      t4, 20(sp)
197         lw      t5, 24(sp)
198         lw      t6, 28(sp)
199         sw      t4, 16(sp)
200         sw      t5, 20(sp)
201         sw      t6, 24(sp)
202         sw      a0, PT_R4(sp)                   # .. and push back a0 - a3, some
203         sw      a1, PT_R5(sp)                   # syscalls expect them there
204         sw      a2, PT_R6(sp)
205         sw      a3, PT_R7(sp)
206         sw      a3, PT_R26(sp)                  # update a3 for syscall restarting
207         jr      t2
208         /* Unreached */
209
210 einval: li      v0, -ENOSYS
211         jr      ra
212         END(sys_syscall)
213
214         .align  2
215         .type   sys_call_table, @object
216 EXPORT(sys_call_table)
217         PTR     sys_syscall                     /* 4000 */
218         PTR     sys_exit
219         PTR     __sys_fork
220         PTR     sys_read
221         PTR     sys_write
222         PTR     sys_open                        /* 4005 */
223         PTR     sys_close
224         PTR     sys_waitpid
225         PTR     sys_creat
226         PTR     sys_link
227         PTR     sys_unlink                      /* 4010 */
228         PTR     sys_execve
229         PTR     sys_chdir
230         PTR     sys_time
231         PTR     sys_mknod
232         PTR     sys_chmod                       /* 4015 */
233         PTR     sys_lchown
234         PTR     sys_ni_syscall
235         PTR     sys_ni_syscall                  /* was sys_stat */
236         PTR     sys_lseek
237         PTR     sys_getpid                      /* 4020 */
238         PTR     sys_mount
239         PTR     sys_oldumount
240         PTR     sys_setuid
241         PTR     sys_getuid
242         PTR     sys_stime                       /* 4025 */
243         PTR     sys_ptrace
244         PTR     sys_alarm
245         PTR     sys_ni_syscall                  /* was sys_fstat */
246         PTR     sys_pause
247         PTR     sys_utime                       /* 4030 */
248         PTR     sys_ni_syscall
249         PTR     sys_ni_syscall
250         PTR     sys_access
251         PTR     sys_nice
252         PTR     sys_ni_syscall                  /* 4035 */
253         PTR     sys_sync
254         PTR     sys_kill
255         PTR     sys_rename
256         PTR     sys_mkdir
257         PTR     sys_rmdir                       /* 4040 */
258         PTR     sys_dup
259         PTR     sysm_pipe
260         PTR     sys_times
261         PTR     sys_ni_syscall
262         PTR     sys_brk                         /* 4045 */
263         PTR     sys_setgid
264         PTR     sys_getgid
265         PTR     sys_ni_syscall                  /* was signal(2) */
266         PTR     sys_geteuid
267         PTR     sys_getegid                     /* 4050 */
268         PTR     sys_acct
269         PTR     sys_umount
270         PTR     sys_ni_syscall
271         PTR     sys_ioctl
272         PTR     sys_fcntl                       /* 4055 */
273         PTR     sys_ni_syscall
274         PTR     sys_setpgid
275         PTR     sys_ni_syscall
276         PTR     sys_olduname
277         PTR     sys_umask                       /* 4060 */
278         PTR     sys_chroot
279         PTR     sys_ustat
280         PTR     sys_dup2
281         PTR     sys_getppid
282         PTR     sys_getpgrp                     /* 4065 */
283         PTR     sys_setsid
284         PTR     sys_sigaction
285         PTR     sys_sgetmask
286         PTR     sys_ssetmask
287         PTR     sys_setreuid                    /* 4070 */
288         PTR     sys_setregid
289         PTR     sys_sigsuspend
290         PTR     sys_sigpending
291         PTR     sys_sethostname
292         PTR     sys_setrlimit                   /* 4075 */
293         PTR     sys_getrlimit
294         PTR     sys_getrusage
295         PTR     sys_gettimeofday
296         PTR     sys_settimeofday
297         PTR     sys_getgroups                   /* 4080 */
298         PTR     sys_setgroups
299         PTR     sys_ni_syscall                  /* old_select */
300         PTR     sys_symlink
301         PTR     sys_ni_syscall                  /* was sys_lstat */
302         PTR     sys_readlink                    /* 4085 */
303         PTR     sys_uselib
304         PTR     sys_swapon
305         PTR     sys_reboot
306         PTR     sys_old_readdir
307         PTR     sys_mips_mmap                   /* 4090 */
308         PTR     sys_munmap
309         PTR     sys_truncate
310         PTR     sys_ftruncate
311         PTR     sys_fchmod
312         PTR     sys_fchown                      /* 4095 */
313         PTR     sys_getpriority
314         PTR     sys_setpriority
315         PTR     sys_ni_syscall
316         PTR     sys_statfs
317         PTR     sys_fstatfs                     /* 4100 */
318         PTR     sys_ni_syscall                  /* was ioperm(2) */
319         PTR     sys_socketcall
320         PTR     sys_syslog
321         PTR     sys_setitimer
322         PTR     sys_getitimer                   /* 4105 */
323         PTR     sys_newstat
324         PTR     sys_newlstat
325         PTR     sys_newfstat
326         PTR     sys_uname
327         PTR     sys_ni_syscall                  /* 4110 was iopl(2) */
328         PTR     sys_vhangup
329         PTR     sys_ni_syscall                  /* was sys_idle() */
330         PTR     sys_ni_syscall                  /* was sys_vm86 */
331         PTR     sys_wait4
332         PTR     sys_swapoff                     /* 4115 */
333         PTR     sys_sysinfo
334         PTR     sys_ipc
335         PTR     sys_fsync
336         PTR     sys_sigreturn
337         PTR     __sys_clone                     /* 4120 */
338         PTR     sys_setdomainname
339         PTR     sys_newuname
340         PTR     sys_ni_syscall                  /* sys_modify_ldt */
341         PTR     sys_adjtimex
342         PTR     sys_mprotect                    /* 4125 */
343         PTR     sys_sigprocmask
344         PTR     sys_ni_syscall                  /* was create_module */
345         PTR     sys_init_module
346         PTR     sys_delete_module
347         PTR     sys_ni_syscall                  /* 4130 was get_kernel_syms */
348         PTR     sys_quotactl
349         PTR     sys_getpgid
350         PTR     sys_fchdir
351         PTR     sys_bdflush
352         PTR     sys_sysfs                       /* 4135 */
353         PTR     sys_personality
354         PTR     sys_ni_syscall                  /* for afs_syscall */
355         PTR     sys_setfsuid
356         PTR     sys_setfsgid
357         PTR     sys_llseek                      /* 4140 */
358         PTR     sys_getdents
359         PTR     sys_select
360         PTR     sys_flock
361         PTR     sys_msync
362         PTR     sys_readv                       /* 4145 */
363         PTR     sys_writev
364         PTR     sys_cacheflush
365         PTR     sys_cachectl
366         PTR     sys_sysmips
367         PTR     sys_ni_syscall                  /* 4150 */
368         PTR     sys_getsid
369         PTR     sys_fdatasync
370         PTR     sys_sysctl
371         PTR     sys_mlock
372         PTR     sys_munlock                     /* 4155 */
373         PTR     sys_mlockall
374         PTR     sys_munlockall
375         PTR     sys_sched_setparam
376         PTR     sys_sched_getparam
377         PTR     sys_sched_setscheduler          /* 4160 */
378         PTR     sys_sched_getscheduler
379         PTR     sys_sched_yield
380         PTR     sys_sched_get_priority_max
381         PTR     sys_sched_get_priority_min
382         PTR     sys_sched_rr_get_interval       /* 4165 */
383         PTR     sys_nanosleep
384         PTR     sys_mremap
385         PTR     sys_accept
386         PTR     sys_bind
387         PTR     sys_connect                     /* 4170 */
388         PTR     sys_getpeername
389         PTR     sys_getsockname
390         PTR     sys_getsockopt
391         PTR     sys_listen
392         PTR     sys_recv                        /* 4175 */
393         PTR     sys_recvfrom
394         PTR     sys_recvmsg
395         PTR     sys_send
396         PTR     sys_sendmsg
397         PTR     sys_sendto                      /* 4180 */
398         PTR     sys_setsockopt
399         PTR     sys_shutdown
400         PTR     sys_socket
401         PTR     sys_socketpair
402         PTR     sys_setresuid                   /* 4185 */
403         PTR     sys_getresuid
404         PTR     sys_ni_syscall                  /* was sys_query_module */
405         PTR     sys_poll
406         PTR     sys_ni_syscall                  /* was nfsservctl */
407         PTR     sys_setresgid                   /* 4190 */
408         PTR     sys_getresgid
409         PTR     sys_prctl
410         PTR     sys_rt_sigreturn
411         PTR     sys_rt_sigaction
412         PTR     sys_rt_sigprocmask              /* 4195 */
413         PTR     sys_rt_sigpending
414         PTR     sys_rt_sigtimedwait
415         PTR     sys_rt_sigqueueinfo
416         PTR     sys_rt_sigsuspend
417         PTR     sys_pread64                     /* 4200 */
418         PTR     sys_pwrite64
419         PTR     sys_chown
420         PTR     sys_getcwd
421         PTR     sys_capget
422         PTR     sys_capset                      /* 4205 */
423         PTR     sys_sigaltstack
424         PTR     sys_sendfile
425         PTR     sys_ni_syscall
426         PTR     sys_ni_syscall
427         PTR     sys_mips_mmap2                  /* 4210 */
428         PTR     sys_truncate64
429         PTR     sys_ftruncate64
430         PTR     sys_stat64
431         PTR     sys_lstat64
432         PTR     sys_fstat64                     /* 4215 */
433         PTR     sys_pivot_root
434         PTR     sys_mincore
435         PTR     sys_madvise
436         PTR     sys_getdents64
437         PTR     sys_fcntl64                     /* 4220 */
438         PTR     sys_ni_syscall
439         PTR     sys_gettid
440         PTR     sys_readahead
441         PTR     sys_setxattr
442         PTR     sys_lsetxattr                   /* 4225 */
443         PTR     sys_fsetxattr
444         PTR     sys_getxattr
445         PTR     sys_lgetxattr
446         PTR     sys_fgetxattr
447         PTR     sys_listxattr                   /* 4230 */
448         PTR     sys_llistxattr
449         PTR     sys_flistxattr
450         PTR     sys_removexattr
451         PTR     sys_lremovexattr
452         PTR     sys_fremovexattr                /* 4235 */
453         PTR     sys_tkill
454         PTR     sys_sendfile64
455         PTR     sys_futex
456 #ifdef CONFIG_MIPS_MT_FPAFF
457         /*
458          * For FPU affinity scheduling on MIPS MT processors, we need to
459          * intercept sys_sched_xxxaffinity() calls until we get a proper hook
460          * in kernel/sched/core.c.  Considered only temporary we only support
461          * these hooks for the 32-bit kernel - there is no MIPS64 MT processor
462          * atm.
463          */
464         PTR     mipsmt_sys_sched_setaffinity
465         PTR     mipsmt_sys_sched_getaffinity
466 #else
467         PTR     sys_sched_setaffinity
468         PTR     sys_sched_getaffinity           /* 4240 */
469 #endif /* CONFIG_MIPS_MT_FPAFF */
470         PTR     sys_io_setup
471         PTR     sys_io_destroy
472         PTR     sys_io_getevents
473         PTR     sys_io_submit
474         PTR     sys_io_cancel                   /* 4245 */
475         PTR     sys_exit_group
476         PTR     sys_lookup_dcookie
477         PTR     sys_epoll_create
478         PTR     sys_epoll_ctl
479         PTR     sys_epoll_wait                  /* 4250 */
480         PTR     sys_remap_file_pages
481         PTR     sys_set_tid_address
482         PTR     sys_restart_syscall
483         PTR     sys_fadvise64_64
484         PTR     sys_statfs64                    /* 4255 */
485         PTR     sys_fstatfs64
486         PTR     sys_timer_create
487         PTR     sys_timer_settime
488         PTR     sys_timer_gettime
489         PTR     sys_timer_getoverrun            /* 4260 */
490         PTR     sys_timer_delete
491         PTR     sys_clock_settime
492         PTR     sys_clock_gettime
493         PTR     sys_clock_getres
494         PTR     sys_clock_nanosleep             /* 4265 */
495         PTR     sys_tgkill
496         PTR     sys_utimes
497         PTR     sys_mbind
498         PTR     sys_ni_syscall                  /* sys_get_mempolicy */
499         PTR     sys_ni_syscall                  /* 4270 sys_set_mempolicy */
500         PTR     sys_mq_open
501         PTR     sys_mq_unlink
502         PTR     sys_mq_timedsend
503         PTR     sys_mq_timedreceive
504         PTR     sys_mq_notify                   /* 4275 */
505         PTR     sys_mq_getsetattr
506         PTR     sys_ni_syscall                  /* sys_vserver */
507         PTR     sys_waitid
508         PTR     sys_ni_syscall                  /* available, was setaltroot */
509         PTR     sys_add_key                     /* 4280 */
510         PTR     sys_request_key
511         PTR     sys_keyctl
512         PTR     sys_set_thread_area
513         PTR     sys_inotify_init
514         PTR     sys_inotify_add_watch           /* 4285 */
515         PTR     sys_inotify_rm_watch
516         PTR     sys_migrate_pages
517         PTR     sys_openat
518         PTR     sys_mkdirat
519         PTR     sys_mknodat                     /* 4290 */
520         PTR     sys_fchownat
521         PTR     sys_futimesat
522         PTR     sys_fstatat64
523         PTR     sys_unlinkat
524         PTR     sys_renameat                    /* 4295 */
525         PTR     sys_linkat
526         PTR     sys_symlinkat
527         PTR     sys_readlinkat
528         PTR     sys_fchmodat
529         PTR     sys_faccessat                   /* 4300 */
530         PTR     sys_pselect6
531         PTR     sys_ppoll
532         PTR     sys_unshare
533         PTR     sys_splice
534         PTR     sys_sync_file_range             /* 4305 */
535         PTR     sys_tee
536         PTR     sys_vmsplice
537         PTR     sys_move_pages
538         PTR     sys_set_robust_list
539         PTR     sys_get_robust_list             /* 4310 */
540         PTR     sys_kexec_load
541         PTR     sys_getcpu
542         PTR     sys_epoll_pwait
543         PTR     sys_ioprio_set
544         PTR     sys_ioprio_get                  /* 4315 */
545         PTR     sys_utimensat
546         PTR     sys_signalfd
547         PTR     sys_ni_syscall                  /* was timerfd */
548         PTR     sys_eventfd
549         PTR     sys_fallocate                   /* 4320 */
550         PTR     sys_timerfd_create
551         PTR     sys_timerfd_gettime
552         PTR     sys_timerfd_settime
553         PTR     sys_signalfd4
554         PTR     sys_eventfd2                    /* 4325 */
555         PTR     sys_epoll_create1
556         PTR     sys_dup3
557         PTR     sys_pipe2
558         PTR     sys_inotify_init1
559         PTR     sys_preadv                      /* 4330 */
560         PTR     sys_pwritev
561         PTR     sys_rt_tgsigqueueinfo
562         PTR     sys_perf_event_open
563         PTR     sys_accept4
564         PTR     sys_recvmmsg                    /* 4335 */
565         PTR     sys_fanotify_init
566         PTR     sys_fanotify_mark
567         PTR     sys_prlimit64
568         PTR     sys_name_to_handle_at
569         PTR     sys_open_by_handle_at           /* 4340 */
570         PTR     sys_clock_adjtime
571         PTR     sys_syncfs
572         PTR     sys_sendmmsg
573         PTR     sys_setns
574         PTR     sys_process_vm_readv            /* 4345 */
575         PTR     sys_process_vm_writev
576         PTR     sys_kcmp
577         PTR     sys_finit_module
578         PTR     sys_sched_setattr
579         PTR     sys_sched_getattr               /* 4350 */