Package: strace
Version: 4.5.12-1
Severity: wishlist
Tags: patch

The new ARM EABI uses a different instruction to issue syscalls; strace
needs to be updated, or it fails at the first syscall.  Here's a patch.

-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'stable')
Architecture: amd64 (x86_64)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.15-rc1
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1)

Versions of packages strace depends on:
ii  libc6                         2.3.6-4    GNU C Library: Shared libraries an

strace recommends no packages.

-- no debconf information
2006-03-30  Daniel Jacobowitz  <[EMAIL PROTECTED]>

	* process.c (change_syscall): Add ARM support.
	* syscall.c (get_scno): Handle ARM EABI.

Index: strace/process.c
===================================================================
--- strace.orig/process.c	2006-03-30 17:36:14.000000000 -0500
+++ strace/process.c	2006-03-30 17:44:16.000000000 -0500
@@ -694,6 +694,16 @@ int new;
                                    0x100000 | new) < 0)
                        return -1;
        return 0;
+#elif defined(ARM)
+       /* Some kernels support this, some (pre-2.6.16 or so) don't.  */
+# ifndef PTRACE_SET_SYSCALL
+#  define PTRACE_SET_SYSCALL 23
+# endif
+
+       if (ptrace (PTRACE_SET_SYSCALL, tcp->pid, 0, new) != 0)
+		return -1;
+
+       return 0;
 #else
 #warning Do not know how to handle change_syscall for this architecture
 #endif /* architecture */
Index: strace/syscall.c
===================================================================
--- strace.orig/syscall.c	2006-03-30 17:36:14.000000000 -0500
+++ strace/syscall.c	2006-03-30 17:44:16.000000000 -0500
@@ -1108,16 +1108,25 @@ struct tcb *tcp;
 				return 0;
 			}
 
-			if ((scno & 0x0ff00000) != 0x0f900000) {
-				fprintf(stderr, "syscall: unknown syscall trap 0x%08lx\n",
-					scno);
-				return -1;
-			}
+			/* Handle the EABI syscall convention.  We do not
+			   bother converting structures between the two
+			   ABIs, but basic functionality should work even
+			   if strace and the traced program have different
+			   ABIs.  */
+			if (scno == 0xef000000) {
+				scno = regs.ARM_r7;
+			} else {
+				if ((scno & 0x0ff00000) != 0x0f900000) {
+					fprintf(stderr, "syscall: unknown syscall trap 0x%08lx\n",
+						scno);
+					return -1;
+				}
 
-			/*
-			 * Fixup the syscall number
-			 */
-			scno &= 0x000fffff;
+				/*
+				 * Fixup the syscall number
+				 */
+				scno &= 0x000fffff;
+			}
 		}
 
 		if (tcp->flags & TCB_INSYSCALL) {

Reply via email to