score: fix off-by-one index into syscall table
[linux-2.6.git] / arch / score / kernel / entry.S
index 6c6b7ea..83bb960 100644 (file)
@@ -23,7 +23,7 @@
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <linux/errno.h>
+#include <linux/err.h>
 #include <linux/init.h>
 #include <linux/linkage.h>
 
@@ -395,6 +395,8 @@ ENTRY(resume)
 
 ENTRY(handle_sys)
        SAVE_ALL
+       sw      r8, [r0, 16]            # argument 5 from user r8
+       sw      r9, [r0, 20]            # argument 6 from user r9
        enable_irq
 
        sw      r4, [r0, PT_ORIG_R4]    #for restart syscall
@@ -406,21 +408,16 @@ ENTRY(handle_sys)
        sw      r9, [r0, PT_EPC]
 
        cmpi.c  r27, __NR_syscalls      # check syscall number
-       bgtu    illegal_syscall
+       bgeu    illegal_syscall
 
-       slli    r8, r27, 3              # get syscall routine
+       slli    r8, r27, 2              # get syscall routine
        la      r11, sys_call_table
        add     r11, r11, r8
        lw      r10, [r11]              # get syscall entry
-       lw      r11, [r11, 4]           # get number of args
 
        cmpz.c  r10
        beq     illegal_syscall
 
-       cmpi.c  r11, 4                  # more than 4 arguments?
-       bgtu    stackargs
-
-stack_done:
        lw      r8, [r28, TI_FLAGS]
        li      r9, _TIF_SYSCALL_TRACE
        and.c   r8, r8, r9
@@ -434,7 +431,7 @@ stack_done:
        sw      r8, [r0, PT_R7]
        b 2f
 1:
-       cmpi.c  r4, -EMAXERRNO-1        # -EMAXERRNO - 1=-1134
+       cmpi.c  r4, -MAX_ERRNO - 1
        ble     2f
        ldi     r8, 0x1;
        sw      r8, [r0, PT_R7]
@@ -466,7 +463,7 @@ syscall_trace_entry:
        lw      r7, [r0, PT_R7]
        brl     r8
 
-       li      r8, -EMAXERRNO - 1      # error?
+       li      r8, -MAX_ERRNO - 1
        sw      r8, [r0, PT_R7]         # set error flag
 
        neg     r4, r4                  # error
@@ -475,44 +472,6 @@ syscall_trace_entry:
 1:     sw      r4, [r0, PT_R2]         # result
        j       syscall_exit
 
-stackargs:
-       lw      r8, [r0, PT_R0]
-       andri.c r9, r8, 3               # test whether user sp is align a word
-       bne     bad_stack
-       subi    r11, 5
-       slli    r9, r11, 2
-       add.c   r9, r9, r8
-
-       bmi     bad_stack
-       la      r9, 3f                  # calculate branch address
-       slli    r11, r11, 3
-       sub     r9, r9, r11
-       br      r9
-
-2:     lw      r9, [r8, 20]            # argument 6 from usp
-       sw      r9, [r0, 20]
-
-3:     lw      r9, [r8, 16]            # argument 5 from usp
-       sw      r9, [r0, 16]
-       j       stack_done
-
-       .section __ex_table,"a"
-       .word   2b, bad_stack
-       .word   3b, bad_stack
-       .previous
-
-       /*
-        * The stackpointer for a call with more than 4 arguments is bad.
-        * We probably should handle this case a bit more drastic.
-        */
-bad_stack:
-       neg     r27, r27                # error
-       sw      r27, [r0, PT_ORIG_R4]
-       sw      r27, [r0, PT_R4]
-       ldi     r8, 1                   # set error flag
-       sw      r8, [r0, PT_R7]
-       j       syscall_return
-
 illegal_syscall:
        ldi     r4, -ENOSYS             # error
        sw      r4, [r0, PT_ORIG_R4]
@@ -540,3 +499,16 @@ ENTRY(sys_sigaltstack)
        mv      r4, r0
        la      r8, score_sigaltstack
        br      r8
+
+#ifdef __ARCH_WANT_SYSCALL_DEPRECATED
+ENTRY(sys_fork)
+       mv      r4, r0
+       la      r8, score_fork
+       br      r8
+
+ENTRY(sys_vfork)
+       mv      r4, r0
+       la      r8, score_vfork
+       br      r8
+#endif /* __ARCH_WANT_SYSCALL_DEPRECATED */
+