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 Signed-off-by: Riku Voipio --- 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 */