parisc: Fix ptraced 64-bit applications to call 64-bit syscalls
authorHelge Deller <deller@gmx.de>
Thu, 16 Aug 2018 20:33:04 +0000 (22:33 +0200)
committerHelge Deller <deller@gmx.de>
Fri, 17 Aug 2018 14:45:31 +0000 (16:45 +0200)
Fix the strace code path to call 64-bit syscalls in case we are
executing by a 64-bit application.

Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/kernel/syscall.S

index 5f7e57fcaeef0333da7482f8af566a0e4da7fc00..be451766e9d00dd296a5214679f86df29274f0b4 100644 (file)
@@ -227,8 +227,7 @@ linux_gateway_entry:
        or,=    %r2,%r2,%r2
        ldo     R%sys_call_table64(%r1), %r19
 #else
-       ldil    L%sys_call_table, %r1
-       ldo     R%sys_call_table(%r1), %r19
+       load32  sys_call_table, %r19
 #endif 
        comiclr,>>      __NR_Linux_syscalls, %r20, %r0
        b,n     .Lsyscall_nosys
@@ -331,8 +330,6 @@ tracesys_next:
         *  task->thread.regs.gr[20] above.
         */
        copy    %ret0,%r20
-       ldil    L%sys_call_table,%r1
-       ldo     R%sys_call_table(%r1), %r19
 
        ldo     -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1      /* get task ptr */
        LDREG   TI_TASK(%r1), %r1
@@ -354,6 +351,23 @@ tracesys_next:
        comiclr,>>      __NR_Linux_syscalls, %r20, %r0
        b,n     .Ltracesys_nosys
 
+       /* Note!  We cannot use the syscall table that is mapped
+       nearby since the gateway page is mapped execute-only. */
+
+#ifdef CONFIG_64BIT
+       LDREG   TASK_PT_GR30(%r1), %r19         /* get users sp back */
+       extrd,u %r19,63,1,%r2                   /* W hidden in bottom bit */
+
+       ldil    L%sys_call_table, %r1
+       or,=    %r2,%r2,%r2
+       addil   L%(sys_call_table64-sys_call_table), %r1
+       ldo     R%sys_call_table(%r1), %r19
+       or,=    %r2,%r2,%r2
+       ldo     R%sys_call_table64(%r1), %r19
+#else
+       load32  sys_call_table, %r19
+#endif
+
        LDREGX  %r20(%r19), %r19
 
        /* If this is a sys_rt_sigreturn call, and the signal was received