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