]> granicus.if.org Git - strace/commitdiff
aarch64: fix decoding of arm syscall numbers
authorElliott Hughes <enh@google.com>
Mon, 3 Mar 2014 23:45:26 +0000 (23:45 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 3 Mar 2014 23:54:14 +0000 (23:54 +0000)
If an aarch64 strace is tracing a process using the arm personality, it
also needs to call the shuffle_scno function for the ARM-specific
syscalls.

* syscall.c (shuffle_scno): Define on AARCH64.
(get_scno) [AARCH64]: Call shuffle_scno when the tracee is in 32-bit mode.

Signed-off-by: Elliott Hughes <enh@google.com>
syscall.c

index a0cc31279e189542b34d01046064b905d8dd53b3..5c4b42e79f141065578237b223a301959fccbced 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -926,7 +926,7 @@ print_pc(struct tcb *tcp)
 /* Shuffle syscall numbers so that we don't have huge gaps in syscall table.
  * The shuffling should be reversible: shuffle_scno(shuffle_scno(n)) == n.
  */
-#if defined(ARM) /* So far only ARM needs this */
+#if defined(ARM) || defined(AARCH64) /* So far only 32-bit ARM needs this */
 static long
 shuffle_scno(unsigned long scno)
 {
@@ -1347,6 +1347,7 @@ get_scno(struct tcb *tcp)
                        /* We are in 32-bit mode */
                        /* Note: we don't support OABI, unlike 32-bit ARM build */
                        scno = arm_regs.ARM_r7;
+                       scno = shuffle_scno(scno);
                        update_personality(tcp, 0);
                        break;
        }