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