Merge ../torvalds-2.6/
[pandora-kernel.git] / arch / arm / kernel / entry-common.S
index 55201db..db302c6 100644 (file)
@@ -9,8 +9,6 @@
  */
 #include <linux/config.h>
 
-#include <asm/thread_info.h>
-#include <asm/ptrace.h>
 #include <asm/unistd.h>
 
 #include "entry-header.S"
@@ -27,7 +25,15 @@ ret_fast_syscall:
        ldr     r1, [tsk, #TI_FLAGS]
        tst     r1, #_TIF_WORK_MASK
        bne     fast_work_pending
-       fast_restore_user_regs
+
+       @ fast_restore_user_regs
+       ldr     r1, [sp, #S_OFF + S_PSR]        @ get calling cpsr
+       ldr     lr, [sp, #S_OFF + S_PC]!        @ get pc
+       msr     spsr_cxsf, r1                   @ save in spsr_svc
+       ldmdb   sp, {r1 - lr}^                  @ get calling r1 - lr
+       mov     r0, r0
+       add     sp, sp, #S_FRAME_SIZE - S_PC
+       movs    pc, lr                          @ return & move spsr_svc into cpsr
 
 /*
  * Ok, we need to do extra processing, enter the slow path.
@@ -57,7 +63,14 @@ ret_slow_syscall:
        tst     r1, #_TIF_WORK_MASK
        bne     work_pending
 no_work_pending:
-       slow_restore_user_regs
+       @ slow_restore_user_regs
+       ldr     r1, [sp, #S_PSR]                @ get calling cpsr
+       ldr     lr, [sp, #S_PC]!                @ get pc
+       msr     spsr_cxsf, r1                   @ save in spsr_svc
+       ldmdb   sp, {r0 - lr}^                  @ get calling r1 - lr
+       mov     r0, r0
+       add     sp, sp, #S_FRAME_SIZE - S_PC
+       movs    pc, lr                          @ return & move spsr_svc into cpsr
 
 /*
  * This is how we return from a fork.
@@ -109,9 +122,26 @@ ENTRY(ret_from_fork)
 
        .align  5
 ENTRY(vector_swi)
-       save_user_regs
+       sub     sp, sp, #S_FRAME_SIZE
+       stmia   sp, {r0 - r12}                  @ Calling r0 - r12
+       add     r8, sp, #S_PC
+       stmdb   r8, {sp, lr}^                   @ Calling sp, lr
+       mrs     r8, spsr                        @ called from non-FIQ mode, so ok.
+       str     lr, [sp, #S_PC]                 @ Save calling PC
+       str     r8, [sp, #S_PSR]                @ Save CPSR
+       str     r0, [sp, #S_OLD_R0]             @ Save OLD_R0
        zero_fp
-       get_scno
+
+       /*
+        * Get the system call number.
+        */
+#ifdef CONFIG_ARM_THUMB
+       tst     r8, #PSR_T_BIT                  @ this is SPSR from save_user_regs
+       addne   scno, r7, #__NR_SYSCALL_BASE    @ put OS number in
+       ldreq   scno, [lr, #-4]
+#else
+       ldr     scno, [lr, #-4]                 @ get SWI instruction
+#endif
        arm710_bug_check scno, ip
 
 #ifdef CONFIG_ALIGNMENT_TRAP
@@ -126,7 +156,7 @@ ENTRY(vector_swi)
        get_thread_info tsk
        ldr     ip, [tsk, #TI_FLAGS]            @ check for syscall tracing
        bic     scno, scno, #0xff000000         @ mask off SWI op-code
-       eor     scno, scno, #OS_NUMBER << 20    @ check OS number
+       eor     scno, scno, #__NR_SYSCALL_BASE  @ check OS number
        adr     tbl, sys_call_table             @ load syscall table pointer
        tst     ip, #_TIF_SYSCALL_TRACE         @ are we tracing syscalls?
        bne     __sys_trace
@@ -137,8 +167,8 @@ ENTRY(vector_swi)
 
        add     r1, sp, #S_OFF
 2:     mov     why, #0                         @ no longer a real syscall
-       cmp     scno, #ARMSWI_OFFSET
-       eor     r0, scno, #OS_NUMBER << 20      @ put OS number back
+       cmp     scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE)
+       eor     r0, scno, #__NR_SYSCALL_BASE    @ put OS number back
        bcs     arm_syscall     
        b       sys_ni_syscall                  @ not private func
 
@@ -183,7 +213,7 @@ ENTRY(sys_call_table)
 @ r5 = syscall table
                .type   sys_syscall, #function
 sys_syscall:
-               eor     scno, r0, #OS_NUMBER << 20
+               eor     scno, r0, #__NR_SYSCALL_BASE
                cmp     scno, #__NR_syscall - __NR_SYSCALL_BASE
                cmpne   scno, #NR_syscalls      @ check range
                stmloia sp, {r5, r6}            @ shuffle args
@@ -235,6 +265,14 @@ sys_futex_wrapper:
                str     r5, [sp, #4]            @ push sixth arg
                b       sys_futex
 
+sys_arm_fadvise64_64_wrapper:
+               str     r5, [sp, #4]            @ push r5 to stack
+               b       sys_arm_fadvise64_64
+
+sys_mbind_wrapper:
+               str     r5, [sp, #4]
+               b       sys_mbind
+
 /*
  * Note: off_4k (r5) is always units of 4K.  If we can't do the requested
  * offset, we return EINVAL.