aboutsummaryrefslogtreecommitdiff
path: root/meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch')
-rw-r--r--meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch52
1 files changed, 35 insertions, 17 deletions
diff --git a/meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch b/meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch
index d9cce72b..bda48074 100644
--- a/meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch
+++ b/meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch
@@ -1,19 +1,37 @@
-Index: strace-4.8/syscall.c
-===================================================================
---- strace-4.8.orig/syscall.c
-+++ strace-4.8/syscall.c
-@@ -1355,6 +1355,14 @@ get_scno(struct tcb *tcp)
- if (errno)
- return -1;
-
+strace: fix system call matching code in get_scno for be8 arm
+
+on ARM V7 operating in big endian mode strace does not work:
+
+root@genericarmv7ab:~# strace ls
+pid 1356 unknown syscall trap 0x000000ef
+
+it happens because ARM V7 when runs as big endian operates in be8 mode,
+where instruction are still in little endian form. Strace get_scno reads
+instructions and matches it to certain pattern, but in armeb case it needs
+to byteswap it before that.
+
+Signed-off-by: Victor Kamensky <victor.kamensky@linaro.org>
+Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
+---
+ syscall.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/syscall.c
++++ b/syscall.c
+@@ -1374,6 +1374,16 @@ get_scno(struct tcb *tcp)
+ scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *)(arm_regs.ARM_pc - 4), NULL);
+ if (errno)
+ return -1;
++
+#if defined(__ARMEB__) && defined(__ARM_ARCH_7A__)
-+ /* We running big endian arm on ARMv7: instructions are
-+ * in little endian form so we need to byteswap it. Note
-+ * on older ARM like V5 Xscale code is in big endian form
-+ * byte swap is not needed in this case. I.e be8 vs be32.
-+ */
-+ scno = __builtin_bswap32(scno);
++ /* We running big endian arm on ARMv7: instructions are
++ * in little endian form so we need to byteswap it. Note
++ * on older ARM like V5 Xscale code is in big endian form
++ * byte swap is not needed in this case. I.e be8 vs be32.
++ */
++ scno = __builtin_bswap32(scno);
+#endif /* __ARMEB__ && __ARM_ARCH_7A__ */
- /* EABI syscall convention? */
- if (scno == 0xef000000) {
- scno = arm_regs.ARM_r7; /* yes */
++
+ /* EABI syscall convention? */
+ if (scno != 0xef000000) {
+ /* No, it's OABI */