| From d3f703c4359ff06619b2322b91f69710453e6b6d Mon Sep 17 00:00:00 2001 |
| From: Victor Kamensky <kamensky@cisco.com> |
| Date: Tue, 11 Feb 2020 11:24:33 -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, resulting 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 binutils |
| 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. |
| |
| Please note 'jalr t9' conversion to 'bal' can happen only to static |
| functions. These static PIC calls use mips local GOT entries that |
| are supposed to be filled with start of DSO value by run-time linker |
| (missing in VDSO case) and they do not have dynamic relocations. |
| Global mips GOT entries must have dynamic relocations and they should |
| be prevented by cmd_vdso_check Makefile rule. |
| |
| Solution call out -mrelax-pic-calls and -mexplicit-relocs options |
| explicitly while compiling MIPS vdso code. That would get correct |
| and consistent between different toolchains behaviour. |
| |
| Reported-by: Bruce Ashfield <bruce.ashfield@gmail.com> |
| Signed-off-by: Victor Kamensky <kamensky@cisco.com> |
| Signed-off-by: Paul Burton <paulburton@kernel.org> |
| Cc: linux-mips@vger.kernel.org |
| Cc: Ralf Baechle <ralf@linux-mips.org> |
| Cc: James Hogan <jhogan@kernel.org> |
| Cc: Vincenzo Frascino <vincenzo.frascino@arm.com> |
| Cc: richard.purdie@linuxfoundation.org |
| --- |
| arch/mips/vdso/Makefile | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/arch/mips/vdso/Makefile |
| +++ b/arch/mips/vdso/Makefile |
| @@ -26,6 +26,7 @@ ccflags-vdso := \ |
| cflags-vdso := $(ccflags-vdso) \ |
| $(filter -W%,$(filter-out -Wa$(comma)%,$(KBUILD_CFLAGS))) \ |
| -O3 -g -fPIC -fno-strict-aliasing -fno-common -fno-builtin -G 0 \ |
| + -mrelax-pic-calls -mexplicit-relocs \ |
| -fno-stack-protector -fno-jump-tables -DDISABLE_BRANCH_PROFILING \ |
| $(call cc-option, -fno-asynchronous-unwind-tables) \ |
| $(call cc-option, -fno-stack-protector) |