X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fmips%2Fkernel%2Fscall64-64.S;h=32efb888160abf7ffb245ab6720f3bc8c0dcb1ec;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=3125b634faecc64da9effe9564e2b9b855d111fe;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 3125b634f..32efb8881 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S @@ -18,6 +18,7 @@ #include #include #include +#include #ifndef CONFIG_BINFMT_ELF32 /* Neither O32 nor N32, so define handle_sys here */ @@ -37,8 +38,7 @@ NESTED(handle_sys64, PT_SIZE, sp) .set at #endif -FEXPORT(__handle_sys64) - subu t0, v0, __NR_64_Linux # check syscall number + dsubu t0, v0, __NR_64_Linux # check syscall number sltiu t0, t0, __NR_64_Linux_syscalls + 1 #if !defined(CONFIG_MIPS32_O32) && !defined(CONFIG_MIPS32_N32) ld t1, PT_EPC(sp) # skip syscall on return @@ -53,8 +53,10 @@ FEXPORT(__handle_sys64) sd a3, PT_R26(sp) # save a3 for syscall restarting - LONG_L t0, TI_FLAGS($28) - bltz t0, syscall_trace_entry # syscall tracing enabled? + li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT + LONG_L t0, TI_FLAGS($28) # syscall tracing enabled? + and t0, t1, t0 + bnez t0, syscall_trace_entry jalr t2 # Do The Real Thing (TM) @@ -63,12 +65,12 @@ FEXPORT(__handle_sys64) sd t0, PT_R7(sp) # set error flag beqz t0, 1f - negu v0 # error + dnegu v0 # error sd v0, PT_R0(sp) # set flag for syscall # restarting 1: sd v0, PT_R2(sp) # result -syscall_exit: +n64_syscall_exit: local_irq_disable # make sure need_resched and # signals dont change between # sampling and return @@ -86,24 +88,25 @@ n64_syscall_exit_work: syscall_trace_entry: SAVE_STATIC - sd t2,PT_R1(sp) + move s0, t2 move a0, sp li a1, 0 jal do_syscall_trace - ld t2,PT_R1(sp) ld a0, PT_R4(sp) # Restore argument registers ld a1, PT_R5(sp) ld a2, PT_R6(sp) ld a3, PT_R7(sp) - jalr t2 + ld a4, PT_R8(sp) + ld a5, PT_R9(sp) + jalr s0 li t0, -EMAXERRNO - 1 # error? sltu t0, t0, v0 sd t0, PT_R7(sp) # set error flag beqz t0, 1f - negu v0 # error + dnegu v0 # error sd v0, PT_R0(sp) # set flag for syscall restarting 1: sd v0, PT_R2(sp) # result @@ -111,11 +114,11 @@ syscall_trace_entry: illegal_syscall: /* This also isn't a 64-bit syscall, throw an error. */ - li v0, ENOSYS # error + li v0, -ENOSYS # error sd v0, PT_R2(sp) li t0, 1 # set error flag sd t0, PT_R7(sp) - j syscall_exit + j n64_syscall_exit END(handle_sys64) LEAF(mips_atomic_set) @@ -133,7 +136,11 @@ illegal_syscall: 1: ll v0, (a1) move a0, a2 2: sc a0, (a1) +#if R10000_LLSC_WAR + beqzl a0, 1b +#else beqz a0, 1b +#endif .section __ex_table,"a" PTR 1b, bad_stack @@ -168,12 +175,12 @@ illegal_syscall: sd v0, PT_R2(sp) # result /* Success, so skip usual error handling garbage. */ - LONG_L a2, TI_FLAGS($28) # syscall tracing enabled? li t0, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT + LONG_L a2, TI_FLAGS($28) # syscall tracing enabled? and t0, a2, t0 bnez t0, 1f - b syscall_exit + j n64_syscall_exit 1: SAVE_STATIC move a0, sp @@ -198,17 +205,6 @@ bad_alignment: j _sys_sysmips END(sys_sysmips) - LEAF(sys_syscall) /* Quick'n'dirty ... */ - move v0, a0 - move a0, a1 - move a1, a2 - move a2, a3 - move a3, a4 - move a4, a5 - move a5, a6 - j __handle_sys64 - END(sys_syscall) - .align 3 sys_call_table: PTR sys_read /* 5000 */ @@ -438,7 +434,7 @@ sys_call_table: PTR sys_clock_nanosleep PTR sys_tgkill /* 5225 */ PTR sys_utimes - PTR sys_ni_syscall /* sys_mbind */ + PTR sys_mbind PTR sys_ni_syscall /* sys_get_mempolicy */ PTR sys_ni_syscall /* sys_set_mempolicy */ PTR sys_mq_open /* 5230 */ @@ -448,3 +444,8 @@ sys_call_table: PTR sys_mq_notify PTR sys_mq_getsetattr /* 5235 */ PTR sys_ni_syscall /* sys_vserver */ + PTR sys_waitid + PTR sys_ni_syscall /* available, was setaltroot */ + PTR sys_add_key + PTR sys_request_key /* 5240 */ + PTR sys_keyctl