b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 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 | --- a/arch/mips/vdso/Makefile |
| 46 | +++ b/arch/mips/vdso/Makefile |
| 47 | @@ -26,6 +26,7 @@ ccflags-vdso := \ |
| 48 | cflags-vdso := $(ccflags-vdso) \ |
| 49 | $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \ |
| 50 | -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \ |
| 51 | + -mrelax-pic-calls -mexplicit-relocs \ |
| 52 | -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \ |
| 53 | $(call cc-option, -fno-asynchronous-unwind-tables) \ |
| 54 | $(call cc-option, -fno-stack-protector) |