Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / arch / mips / kernel / scall64-o32.S
index 433fc3c..7ac3efe 100644 (file)
@@ -6,6 +6,7 @@
  * Copyright (C) 1995 - 2000, 2001 by Ralf Baechle
  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  * Copyright (C) 2001 MIPS Technologies, Inc.
+ * Copyright (C) 2004 Thiemo Seufer
  *
  * Hairy, the userspace application uses a different argument passing
  * convention than the kernel, so we have to translate things from o32
@@ -43,6 +44,8 @@ NESTED(handle_sys, PT_SIZE, sp)
  RESTORE_ALL
 #endif
 
+       /* We don't want to stumble over broken sign extensions from
+          userland. O32 does never use the upper half. */
        sll     a0, a0, 0
        sll     a1, a1, 0
        sll     a2, a2, 0
@@ -68,11 +71,13 @@ NESTED(handle_sys, PT_SIZE, sp)
 1:     lw      a4, 16(t0)              # argument #5 from usp
 2:     lw      a5, 20(t0)              # argument #6 from usp
 3:     lw      a6, 24(t0)              # argument #7 from usp
+4:     lw      a7, 28(t0)              # argument #8 from usp (for indirect syscalls)
 
        .section __ex_table,"a"
        PTR     1b, bad_stack
        PTR     2b, bad_stack
        PTR     3b, bad_stack
+       PTR     4b, bad_stack
        .previous
 
        li      t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
@@ -91,7 +96,7 @@ NESTED(handle_sys, PT_SIZE, sp)
        sd      v0, PT_R0(sp)           # flag for syscall restarting
 1:     sd      v0, PT_R2(sp)           # result
 
-FEXPORT(o32_syscall_exit)
+o32_syscall_exit:
        local_irq_disable               # make need_resched and
                                        # signals dont change between
                                        # sampling and return
@@ -109,24 +114,27 @@ o32_syscall_exit_work:
 
 trace_a_syscall:
        SAVE_STATIC
-       sd      a4, PT_R8(sp)
+       sd      a4, PT_R8(sp)           # Save argument registers
        sd      a5, PT_R9(sp)
        sd      a6, PT_R10(sp)
-       sd      a7, PT_R11(sp)
+       sd      a7, PT_R11(sp)          # For indirect syscalls
 
-       move    s0, t2
+       move    s0, t2                  # Save syscall pointer
        move    a0, sp
        li      a1, 0
        jal     do_syscall_trace
 
+       move    t0, s0
+       RESTORE_STATIC
        ld      a0, PT_R4(sp)           # Restore argument registers
        ld      a1, PT_R5(sp)
        ld      a2, PT_R6(sp)
        ld      a3, PT_R7(sp)
        ld      a4, PT_R8(sp)
        ld      a5, PT_R9(sp)
-       ld      a6, PT_R10(sp)          # For indirect syscalls
-       jalr    s0
+       ld      a6, PT_R10(sp)
+       ld      a7, PT_R11(sp)          # For indirect syscalls
+       jalr    t0
 
        li      t0, -EMAXERRNO - 1      # error?
        sltu    t0, t0, v0
@@ -162,40 +170,17 @@ not_o32_scall:
 #else
        j       handle_sys64
 #endif
-
-illegal_syscall:
-       /* This also isn't a 64-bit syscall, throw an error.  */
-       li      v0, ENOSYS              # error
-       sd      v0, PT_R2(sp)
-       li      t0, 1                   # set error flag
-       sd      t0, PT_R7(sp)
-       j       o32_syscall_exit
        END(handle_sys)
 
 LEAF(sys32_syscall)
-       ld      t0, PT_R29(sp)          # user sp
-
        sltu    v0, a0, __NR_O32_Linux + __NR_O32_Linux_syscalls + 1
-       beqz    v0, enosys
+       beqz    v0, einval
 
        dsll    v0, a0, 3
-       dla     v1, sys32_syscall
        ld      t2, (sys_call_table - (__NR_O32_Linux * 8))(v0)
 
-       li      v0, -EINVAL
-       beq     t2, v1, out             # do not recurse
-
-       beqz    t2, enosys              # null function pointer?
-
-       andi    v0, t0, 0x3             # unaligned stack pointer?
-       bnez    v0, sigsegv
-
-       daddiu  v0, t0, 16              # v0 = usp + 16
-       daddu   t1, v0, 12              # 3 32-bit arguments
-       ld      v1, TI_ADDR_LIMIT($28)
-       or      v0, v0, t1
-       and     v1, v1, v0
-       bnez    v1, efault
+       li      v1, 4000                # indirect syscall number
+       beq     a0, v1, einval          # do not recurse
 
        move    a0, a1                  # shift argument registers
        move    a1, a2
@@ -203,32 +188,28 @@ LEAF(sys32_syscall)
        move    a3, a4
        move    a4, a5
        move    a5, a6
+       move    a6, a7
+       sd      a0, PT_R4(sp)           # ... and push back a0 - a3, some
+       sd      a1, PT_R5(sp)           # syscalls expect them there
+       sd      a2, PT_R6(sp)
+       sd      a3, PT_R7(sp)
+       sd      a3, PT_R26(sp)          # update a3 for syscall restarting
        jr      t2
        /* Unreached */
 
-enosys:        li      v0, -ENOSYS
-       b       out
-
-sigsegv:
-       li      a0, _SIGSEGV
-       move    a1, $28
-       jal     force_sig
-       /* Fall through */
-
-efault:        li      v0, -EFAULT
-
-out:   jr      ra
+einval:        li      v0, -EINVAL
+       jr      ra
        END(sys32_syscall)
 
        .align  3
-       .type   sys_call_table,@object;
+       .type   sys_call_table,@object
 sys_call_table:
        PTR     sys32_syscall                   /* 4000 */
        PTR     sys_exit
        PTR     sys_fork
        PTR     sys_read
        PTR     sys_write
-       PTR     sys_open                        /* 4005 */
+       PTR     compat_sys_open                 /* 4005 */
        PTR     sys_close
        PTR     sys_waitpid
        PTR     sys_creat
@@ -236,7 +217,7 @@ sys_call_table:
        PTR     sys_unlink                      /* 4010 */
        PTR     sys32_execve
        PTR     sys_chdir
-       PTR     sys_time
+       PTR     compat_sys_time
        PTR     sys_mknod
        PTR     sys_chmod                       /* 4015 */
        PTR     sys_lchown
@@ -248,7 +229,7 @@ sys_call_table:
        PTR     sys_oldumount
        PTR     sys_setuid
        PTR     sys_getuid
-       PTR     sys_stime                       /* 4025 */
+       PTR     compat_sys_stime                /* 4025 */
        PTR     sys32_ptrace
        PTR     sys_alarm
        PTR     sys_ni_syscall                  /* was sys_fstat */
@@ -312,7 +293,7 @@ sys_call_table:
        PTR     sys_uselib
        PTR     sys_swapon
        PTR     sys_reboot
-       PTR     sys32_readdir
+       PTR     compat_sys_old_readdir
        PTR     old_mmap                        /* 4090 */
        PTR     sys_munmap
        PTR     sys_truncate
@@ -337,17 +318,17 @@ sys_call_table:
        PTR     sys_vhangup
        PTR     sys_ni_syscall                  /* was sys_idle  */
        PTR     sys_ni_syscall                  /* sys_vm86 */
-       PTR     sys32_wait4
+       PTR     compat_sys_wait4
        PTR     sys_swapoff                     /* 4115 */
        PTR     sys32_sysinfo
        PTR     sys32_ipc
        PTR     sys_fsync
        PTR     sys32_sigreturn
-       PTR     sys_clone                       /* 4120 */
+       PTR     sys32_clone                     /* 4120 */
        PTR     sys_setdomainname
        PTR     sys32_newuname
        PTR     sys_ni_syscall                  /* sys_modify_ldt */
-       PTR     sys32_adjtimex
+       PTR     compat_sys_adjtimex
        PTR     sys_mprotect                    /* 4125 */
        PTR     compat_sys_sigprocmask
        PTR     sys_ni_syscall                  /* was creat_module */
@@ -364,7 +345,7 @@ sys_call_table:
        PTR     sys_setfsuid
        PTR     sys_setfsgid
        PTR     sys32_llseek                    /* 4140 */
-       PTR     sys32_getdents
+       PTR     compat_sys_getdents
        PTR     compat_sys_select
        PTR     sys_flock
        PTR     sys_msync
@@ -412,7 +393,7 @@ sys_call_table:
        PTR     sys_getresuid
        PTR     sys_ni_syscall                  /* was query_module */
        PTR     sys_poll
-       PTR     sys_nfsservctl
+       PTR     compat_sys_nfsservctl
        PTR     sys_setresgid                   /* 4190 */
        PTR     sys_getresgid
        PTR     sys_prctl
@@ -420,7 +401,7 @@ sys_call_table:
        PTR     sys32_rt_sigaction
        PTR     sys32_rt_sigprocmask            /* 4195 */
        PTR     sys32_rt_sigpending
-       PTR     sys32_rt_sigtimedwait
+       PTR     compat_sys_rt_sigtimedwait
        PTR     sys32_rt_sigqueueinfo
        PTR     sys32_rt_sigsuspend
        PTR     sys32_pread                     /* 4200 */
@@ -480,7 +461,7 @@ sys_call_table:
        PTR     sys_fadvise64_64
        PTR     compat_sys_statfs64             /* 4255 */
        PTR     compat_sys_fstatfs64
-       PTR     sys_timer_create
+       PTR     sys32_timer_create
        PTR     compat_sys_timer_settime
        PTR     compat_sys_timer_gettime
        PTR     sys_timer_getoverrun            /* 4260 */
@@ -500,10 +481,33 @@ sys_call_table:
        PTR     compat_sys_mq_timedreceive
        PTR     compat_sys_mq_notify            /* 4275 */
        PTR     compat_sys_mq_getsetattr
-       PTR     sys_ni_syscall                  /* sys_vserver */
-       PTR     sys_waitid
+       PTR     sys32_vserver
+       PTR     sys32_waitid
        PTR     sys_ni_syscall                  /* available, was setaltroot */
        PTR     sys_add_key                     /* 4280 */
        PTR     sys_request_key
        PTR     sys_keyctl
+       PTR     sys_set_thread_area
+       PTR     sys_inotify_init
+       PTR     sys_inotify_add_watch           /* 4285 */
+       PTR     sys_inotify_rm_watch
+       PTR     sys_migrate_pages
+       PTR     compat_sys_openat
+       PTR     sys_mkdirat
+       PTR     sys_mknodat                     /* 4290 */
+       PTR     sys_fchownat
+       PTR     compat_sys_futimesat
+       PTR     compat_sys_newfstatat
+       PTR     sys_unlinkat
+       PTR     sys_renameat                    /* 4295 */
+       PTR     sys_linkat
+       PTR     sys_symlinkat
+       PTR     sys_readlinkat
+       PTR     sys_fchmodat
+       PTR     sys_faccessat                   /* 4300 */
+       PTR     sys_pselect6
+       PTR     sys_ppoll
+       PTR     sys_unshare
+       PTR     sys_splice
+       PTR     sys32_sync_file_range           /* 4305 */
        .size   sys_call_table,.-sys_call_table