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