aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/mips/mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch50
-rw-r--r--arch/mips/mips.scc3
2 files changed, 52 insertions, 1 deletions
diff --git a/arch/mips/mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch b/arch/mips/mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch
new file mode 100644
index 00000000..5eb1f280
--- /dev/null
+++ b/arch/mips/mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch
@@ -0,0 +1,50 @@
+From 96f71c147809df7880100edeecb197d5d5095206 Mon Sep 17 00:00:00 2001
+From: Victor Kamensky <kamensky@cisco.com>
+Date: Fri, 31 Jan 2020 09:39:44 -0800
+Subject: [PATCH] mips: vdso: fix 'jalr $t9' crash in vdso code
+
+Observed that when kernel is built with Yocto mips64-poky-linux-gcc,
+and mips64-poky-linux-gnun32-gcc toolchain, resuling vdso contains
+'jalr $t9' instructions in its code and since in vdso case nobody
+sets GOT table code crashes when instruction reached. On other hand
+observed that when kernel is built mips-poky-linux-gcc toolchain, the
+same 'jalr $t9' instruction are replaced with PC relative function
+calls using 'bal' instructions.
+
+The difference boils down to -mrelax-pic-calls and -mexplicit-relocs
+gcc options that gets different default values depending on gcc
+target triplets and corresponding binutils. -mrelax-pic-calls got
+enabled by default only in mips-poky-linux-gcc case. MIPS binuitls
+ld relies on R_MIPS_JALR relocation to convert 'jalr $t9' into 'bal'
+and such relocation is generated only if -mrelax-pic-calls option
+is on.
+
+Solution call out -mrelax-pic-calls and -mexplicit-relocs options
+explicitely while compiling MIPS vdso code. That would get correct
+and consitent between different toolchains behavior.
+
+Reported-by: Bruce Ashfield <bruce.ashfield@gmail.com>
+Signed-off-by: Victor Kamensky <kamensky@cisco.com>
+Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
+---
+ arch/mips/vdso/Makefile | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
+index 996a934ece7d..25b5adee5ade 100644
+--- a/arch/mips/vdso/Makefile
++++ b/arch/mips/vdso/Makefile
+@@ -31,7 +31,9 @@ cflags-vdso := $(ccflags-vdso) \
+ -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \
+ -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \
+ $(call cc-option, -fno-asynchronous-unwind-tables) \
+- $(call cc-option, -fno-stack-protector)
++ $(call cc-option, -fno-stack-protector) \
++ $(call cc-option, -mrelax-pic-calls) \
++ $(call cc-option, -mexplicit-relocs)
+ aflags-vdso := $(ccflags-vdso) \
+ -D__ASSEMBLY__ -Wa,-gdwarf-2
+
+--
+2.19.1
+
diff --git a/arch/mips/mips.scc b/arch/mips/mips.scc
index 9ff48e5c..ed3e0549 100644
--- a/arch/mips/mips.scc
+++ b/arch/mips/mips.scc
@@ -8,4 +8,5 @@ fi
patch malta-uhci-quirks-make-allowance-for-slow-4k-e-c.patch
patch 4kc-cache-tlb-hazard-tlbp-cache-coherency.patch
patch staging-octeon-Add-a-workaround-for-the-issue-of-GCC.patch
-patch mips-Kconfig-add-QEMUMIPS64-option.patch \ No newline at end of file
+patch mips-Kconfig-add-QEMUMIPS64-option.patch
+patch mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch