| From foo@baz Sun Apr 20 18:23:45 PDT 2014 |
| From: Dave Kleikamp <dave.kleikamp@oracle.com> |
| Date: Fri, 14 Mar 2014 10:42:01 -0500 |
| Subject: sparc64: don't treat 64-bit syscall return codes as 32-bit |
| |
| From: Dave Kleikamp <dave.kleikamp@oracle.com> |
| |
| [ Upstream commit 1535bd8adbdedd60a0ee62e28fd5225d66434371 ] |
| |
| When checking a system call return code for an error, |
| linux_sparc_syscall was sign-extending the lower 32-bit value and |
| comparing it to -ERESTART_RESTARTBLOCK. lseek can return valid return |
| codes whose lower 32-bits alone would indicate a failure (such as 4G-1). |
| Use the whole 64-bit value to check for errors. Only the 32-bit path |
| should sign extend the lower 32-bit value. |
| |
| Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com> |
| Acked-by: Bob Picco <bob.picco@oracle.com> |
| Acked-by: Allen Pais <allen.pais@oracle.com> |
| Cc: David S. Miller <davem@davemloft.net> |
| Cc: sparclinux@vger.kernel.org |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/sparc/kernel/syscalls.S | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/sparc/kernel/syscalls.S |
| +++ b/arch/sparc/kernel/syscalls.S |
| @@ -189,7 +189,8 @@ linux_sparc_syscall32: |
| mov %i0, %l5 ! IEU1 |
| 5: call %l7 ! CTI Group brk forced |
| srl %i5, 0, %o5 ! IEU1 |
| - ba,a,pt %xcc, 3f |
| + ba,pt %xcc, 3f |
| + sra %o0, 0, %o0 |
| |
| /* Linux native system calls enter here... */ |
| .align 32 |
| @@ -217,7 +218,6 @@ linux_sparc_syscall: |
| 3: stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] |
| ret_sys_call: |
| ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %g3 |
| - sra %o0, 0, %o0 |
| mov %ulo(TSTATE_XCARRY | TSTATE_ICARRY), %g2 |
| sllx %g2, 32, %g2 |
| |