android_kernel_motorola_sm6225/arch/mips
Paul Burton 9b8a065de9 MIPS: Avoid VDSO ABI breakage due to global register variable
commit bbcc5672b0063b0e9d65dc8787a4f09c3b5bb5cc upstream.

Declaring __current_thread_info as a global register variable has the
effect of preventing GCC from saving & restoring its value in cases
where the ABI would typically do so.

To quote GCC documentation:

> If the register is a call-saved register, call ABI is affected: the
> register will not be restored in function epilogue sequences after the
> variable has been assigned. Therefore, functions cannot safely return
> to callers that assume standard ABI.

When our position independent VDSO is built for the n32 or n64 ABIs all
functions it exposes should be preserving the value of $gp/$28 for their
caller, but in the presence of the __current_thread_info global register
variable GCC stops doing so & simply clobbers $gp/$28 when calculating
the address of the GOT.

In cases where the VDSO returns success this problem will typically be
masked by the caller in libc returning & restoring $gp/$28 itself, but
that is by no means guaranteed. In cases where the VDSO returns an error
libc will typically contain a fallback path which will now fail
(typically with a bad memory access) if it attempts anything which
relies upon the value of $gp/$28 - eg. accessing anything via the GOT.

One fix for this would be to move the declaration of
__current_thread_info inside the current_thread_info() function,
demoting it from global register variable to local register variable &
avoiding inadvertently creating a non-standard calling ABI for the VDSO.
Unfortunately this causes issues for clang, which doesn't support local
register variables as pointed out by commit fe92da0f35 ("MIPS: Changed
current_thread_info() to an equivalent supported by both clang and GCC")
which introduced the global register variable before we had a VDSO to
worry about.

Instead, fix this by continuing to use the global register variable for
the kernel proper but declare __current_thread_info as a simple extern
variable when building the VDSO. It should never be referenced, and will
cause a link error if it is. This resolves the calling convention issue
for the VDSO without having any impact upon the build of the kernel
itself for either clang or gcc.

Signed-off-by: Paul Burton <paulburton@kernel.org>
Fixes: ebb5e78cc6 ("MIPS: Initial implementation of a VDSO")
Reported-by: Jason A. Donenfeld <Jason@zx2c4.com>
Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
Tested-by: Jason A. Donenfeld <Jason@zx2c4.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Christian Brauner <christian.brauner@canonical.com>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Cc: <stable@vger.kernel.org> # v4.4+
Cc: linux-mips@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-01-09 10:18:59 +01:00
..
alchemy mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
ar7 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
ath25 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
ath79 Revert "MIPS: perf: ath79: Fix perfcount IRQ assignment" 2019-06-11 12:20:53 +02:00
bcm47xx MIPS: BCM47XX: Enable USB power on Netgear WNDR3400v3 2019-11-20 18:45:35 +01:00
bcm63xx MIPS: BCM63XX: fix switch core reset on BCM6368 2019-11-20 18:45:10 +01:00
bmips MIPS: bmips: remove unnecessary call to register "simple-bus" 2018-06-24 09:27:27 -07:00
boot MIPS: dts: ar9331: fix interrupt-controller size 2019-10-29 09:19:32 +01:00
cavium-octeon MIPS: OCTEON: cvmx_pko_mem_debug8: use oldest forward compatible definition 2019-12-13 08:52:26 +01:00
cobalt
configs USB: rio500: Remove Rio 500 kernel driver 2019-10-17 13:44:47 -07:00
crypto MIPS: crypto: Add crc32 and crc32c hw accelerated module 2018-02-19 20:50:36 +00:00
dec MIPS: Convert update_persistent_clock() to update_persistent_clock64() 2018-05-14 23:58:23 +01:00
emma
fw MIPS: fw: sni: Fix out of bounds init of o32 stack 2019-11-06 13:06:04 +01:00
generic MIPS: Remove obsolete MIPS checks for DST node "chosen@0" 2018-08-06 09:50:33 -07:00
include MIPS: Avoid VDSO ABI breakage due to global register variable 2020-01-09 10:18:59 +01:00
jazz MIPS: jazz: fix 64bit build 2019-02-27 10:08:53 +01:00
jz4740 MIPS: lb60: Fix pin mappings 2019-07-28 08:29:28 +02:00
kernel MIPS: bmips: mark exception vectors as char arrays 2019-11-10 11:27:31 +01:00
kvm KVM: s390: Do not report unusabled IDs via KVM_CAP_MAX_VCPU_ID 2019-06-09 09:17:18 +02:00
lantiq MIPS: lantiq: Fix bitfield masking 2019-08-06 19:06:48 +02:00
lasat kbuild: rename LDFLAGS to KBUILD_LDFLAGS 2018-08-24 08:22:08 +09:00
lib MIPS: memset: Fix CPU_DADDI_WORKAROUNDS `small_fixup' regression 2018-10-05 09:41:39 -07:00
loongson32 MIPS: Loongson: Merge load addresses 2018-07-30 18:59:01 -07:00
loongson64 mips: Loongson: Fix the link time qualifier of 'serial_exit()' 2019-10-29 09:19:35 +01:00
math-emu MIPS: math-emu: Write-protect delay slot emulation pages 2019-01-09 17:38:47 +01:00
mm MIPS: tlbex: Fix build_restore_pagemask KScratch restore 2019-10-29 09:19:47 +01:00
mti-malta MIPS: Malta: Use PIIX4 poweroff driver to power down 2018-06-24 09:27:27 -07:00
net MIPS: eBPF: Fix icache flush end address 2019-03-05 17:58:54 +01:00
netlogic mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
oprofile MIPS: perf: More robustly probe for the presence of per-tc counters 2018-05-15 15:16:16 +01:00
paravirt mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
pci MIPS: OCTEON: don't set octeon_dma_bar_type if PCI is disabled 2019-02-15 08:10:11 +01:00
pic32 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
pistachio MIPS: pistachio: Build uImage.gz by default 2019-06-11 12:20:53 +02:00
pmcs-msp71xx License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pnx833x mtd: nand: Rename nand.h into rawnand.h 2017-08-13 10:11:49 +02:00
power License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ralink MIPS: ralink: Select CONFIG_CPU_MIPSR2_IRQ_VI on MT7620/8 2019-02-12 19:47:17 +01:00
rb532 MIPS: RB532: Avoid undefined mac_pton without GENERIC_NET_UTILS 2018-01-10 16:39:03 +01:00
sgi-ip22 Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2017-11-13 17:56:58 -08:00
sgi-ip27 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
sgi-ip32 MIPS: IP32: use generic dma noncoherent ops 2018-06-24 09:27:27 -07:00
sibyte MIPS: SiByte: Enable swiotlb for SWARM, LittleSur and BigSur 2019-01-26 09:32:35 +01:00
sni MIPS: sni: Remove the read_persistent_clock() 2018-05-14 23:58:25 +01:00
tools Update MIPS email addresses 2017-11-03 09:02:30 -07:00
txx9 mips: txx9: fix iounmap related issue 2019-11-20 18:46:04 +01:00
vdso MIPS: Disable Loongson MMI instructions for kernel build 2019-10-17 13:45:31 -07:00
vr41xx MIPS: Annotate cpu_wait implementations with __cpuidle 2018-06-28 14:18:54 -07:00
Kbuild
Kbuild.platforms MIPS: Xilfpga: Switch to using generic defconfigs 2017-11-08 22:54:14 +00:00
Kconfig MIPS: SiByte: Enable ZONE_DMA32 for LittleSur 2019-12-13 08:51:20 +01:00
Kconfig.debug Kconfig: consolidate the "Kernel hacking" menu 2018-08-02 08:06:48 +09:00
Makefile MIPS: have "plain" make calls build dtbs for selected platforms 2019-07-10 09:53:48 +02:00
Makefile.postlink License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00