summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/strace/strace
diff options
context:
space:
mode:
authorAndre McCurdy <armccurdy@gmail.com>2018-05-16 18:03:53 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-05-29 11:25:03 +0100
commitb038a6e418d723a0a413219e9882cdd7f3804625 (patch)
treefeed5979ed81c1083e22f21157f30dcd4241fb94 /meta/recipes-devtools/strace/strace
parent278b00ddccb274150ed85e48e984675b40fc9aaa (diff)
downloadopenembedded-core-contrib-b038a6e418d723a0a413219e9882cdd7f3804625.tar.gz
strace: fix ARM Thumb build with frame pointers enabled
Replace the previous (incomplete) workaround with better solution backported from upstream. Signed-off-by: Andre McCurdy <armccurdy@gmail.com> Signed-off-by: Ross Burton <ross.burton@intel.com>
Diffstat (limited to 'meta/recipes-devtools/strace/strace')
-rw-r--r--meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch b/meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch
new file mode 100644
index 0000000000..8584291ba8
--- /dev/null
+++ b/meta/recipes-devtools/strace/strace/0001-linux-arm-raw_syscall.h-avoid-r7-specified-register-.patch
@@ -0,0 +1,74 @@
+From 0c75ebaad09d6d3f2395dfe6160904af883dd0d9 Mon Sep 17 00:00:00 2001
+From: Andre McCurdy <armccurdy@gmail.com>
+Date: Tue, 15 May 2018 15:34:39 -0700
+Subject: [PATCH] linux/arm/raw_syscall.h: avoid r7 specified register
+ variables with Thumb
+
+If Thumb code is being generated and frame pointers are enabled, the
+Thumb frame pointer in r7 clashes with any local variable which may
+need to be assigned to r7 (e.g. the syscall NR when making a raw
+syscall).
+
+With gcc, the double use of r7 results in a build error, e.g.
+
+ strace-4.22/tests/inject-nf.c:86:1: error: r7 cannot be used in asm here
+
+With clang, the double use of r7 can result in the compiler silently
+generating broken code which crashes at run time due to frame pointer
+corruption:
+
+ https://bugs.llvm.org/show_bug.cgi?id=34165
+
+In most cases the problem isn't visible as frame pointers will be
+disabled automatically due to optimisation level. However to handle
+cases where frame pointers are enabled (e.g. when CFLAGS etc are set
+to support a debug build, etc) provide a version of raw_syscall_0
+which manually saves and restores the frame pointer value in r7
+to a temporary register before setting up the syscall NR in r7
+and invoking the syscall.
+
+* linux/arm/raw_syscall.h (raw_syscall_0) [__thumb__]: Provide
+an alternative version.
+
+Upstream-Status: Backport
+
+Signed-off-by: Andre McCurdy <armccurdy@gmail.com>
+---
+ linux/arm/raw_syscall.h | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/linux/arm/raw_syscall.h b/linux/arm/raw_syscall.h
+index 69c7e23..ec534ec 100644
+--- a/linux/arm/raw_syscall.h
++++ b/linux/arm/raw_syscall.h
+@@ -36,12 +36,27 @@ static inline kernel_ulong_t
+ raw_syscall_0(const kernel_ulong_t nr, kernel_ulong_t *err)
+ {
+ *err = 0;
++
++#ifdef __thumb__ /* && FRAME_POINTERS_ENABLED */
++
++ register kernel_ulong_t rt;
++ register kernel_ulong_t r0 __asm__("r0");
++ __asm__ __volatile__("mov %1,r7; mov r7,%2; swi 0x0; mov r7,%1"
++ : "=r"(r0), "=&r"(rt)
++ : "r"(nr)
++ : "memory");
++
++#else
++
+ register kernel_ulong_t r7 __asm__("r7") = nr;
+ register kernel_ulong_t r0 __asm__("r0");
+ __asm__ __volatile__("swi 0x0"
+ : "=r"(r0)
+ : "r"(r7)
+ : "memory");
++
++#endif
++
+ return r0;
+ }
+ # define raw_syscall_0 raw_syscall_0
+--
+1.9.1
+