diff options
author | Helge Deller <deller@gmx.de> | 2018-08-16 22:33:04 +0200 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2018-08-17 16:45:31 +0200 |
commit | b6fc0cccb6b35815a7d1cfc9279cdbfc2c61d00d (patch) | |
tree | 17a4841baf246e3a0c3f2e5b37e2b2cc40fc3a6b /arch/parisc | |
parent | parisc: Restore possibility to execute 64-bit applications (diff) | |
download | linux-b6fc0cccb6b35815a7d1cfc9279cdbfc2c61d00d.tar.xz linux-b6fc0cccb6b35815a7d1cfc9279cdbfc2c61d00d.zip |
parisc: Fix ptraced 64-bit applications to call 64-bit syscalls
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>
Diffstat (limited to 'arch/parisc')
-rw-r--r-- | arch/parisc/kernel/syscall.S | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index 5f7e57fcaeef..be451766e9d0 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S @@ -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 |