aboutsummaryrefslogtreecommitdiff
path: root/meta-bigendian/recipes-devtools/strace/strace/strace-4.8-arm-be8.patch
blob: bda480746654b1fd40eda2856e684fe52eba4c65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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);
+#endif /*  __ARMEB__ && __ARM_ARCH_7A__ */
+
 	/* EABI syscall convention? */
 	if (scno != 0xef000000) {
 		/* No, it's OABI */