20551d81dc0a29b9f181c2c0a08273fc730a09e8
[openwrt/openwrt.git] / target / linux / generic / backport-5.4 / 310-v5.6-mips-vdso-fix-jalr-t9-crash-in-vdso-code.patch
1 From d3f703c4359ff06619b2322b91f69710453e6b6d Mon Sep 17 00:00:00 2001
2 From: Victor Kamensky <kamensky@cisco.com>
3 Date: Tue, 11 Feb 2020 11:24:33 -0800
4 Subject: [PATCH] mips: vdso: fix 'jalr t9' crash in vdso code
5
6 Observed that when kernel is built with Yocto mips64-poky-linux-gcc,
7 and mips64-poky-linux-gnun32-gcc toolchain, resulting vdso contains
8 'jalr t9' instructions in its code and since in vdso case nobody
9 sets GOT table code crashes when instruction reached. On other hand
10 observed that when kernel is built mips-poky-linux-gcc toolchain, the
11 same 'jalr t9' instruction are replaced with PC relative function
12 calls using 'bal' instructions.
13
14 The difference boils down to -mrelax-pic-calls and -mexplicit-relocs
15 gcc options that gets different default values depending on gcc
16 target triplets and corresponding binutils. -mrelax-pic-calls got
17 enabled by default only in mips-poky-linux-gcc case. MIPS binutils
18 ld relies on R_MIPS_JALR relocation to convert 'jalr t9' into 'bal'
19 and such relocation is generated only if -mrelax-pic-calls option
20 is on.
21
22 Please note 'jalr t9' conversion to 'bal' can happen only to static
23 functions. These static PIC calls use mips local GOT entries that
24 are supposed to be filled with start of DSO value by run-time linker
25 (missing in VDSO case) and they do not have dynamic relocations.
26 Global mips GOT entries must have dynamic relocations and they should
27 be prevented by cmd_vdso_check Makefile rule.
28
29 Solution call out -mrelax-pic-calls and -mexplicit-relocs options
30 explicitly while compiling MIPS vdso code. That would get correct
31 and consistent between different toolchains behaviour.
32
33 Reported-by: Bruce Ashfield <bruce.ashfield@gmail.com>
34 Signed-off-by: Victor Kamensky <kamensky@cisco.com>
35 Signed-off-by: Paul Burton <paulburton@kernel.org>
36 Cc: linux-mips@vger.kernel.org
37 Cc: Ralf Baechle <ralf@linux-mips.org>
38 Cc: James Hogan <jhogan@kernel.org>
39 Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
40 Cc: richard.purdie@linuxfoundation.org
41 ---
42 arch/mips/vdso/Makefile | 1 +
43 1 file changed, 1 insertion(+)
44
45 diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
46 index aa89a41dc5dd..848baeaef1f8 100644
47 --- a/arch/mips/vdso/Makefile
48 +++ b/arch/mips/vdso/Makefile
49 @@ -33,6 +33,7 @@ endif
50 cflags-vdso := $(ccflags-vdso) \
51 $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \
52 -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \
53 + -mrelax-pic-calls -mexplicit-relocs \
54 -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \
55 $(call cc-option, -fno-asynchronous-unwind-tables) \
56 $(call cc-option, -fno-stack-protector)
57 --
58 2.17.1
59