arm64: vdso32: add CONFIG_THUMB2_COMPAT_VDSO
authorNick Desaulniers <ndesaulniers@google.com>
Mon, 8 Jun 2020 20:57:08 +0000 (13:57 -0700)
committerWill Deacon <will@kernel.org>
Wed, 10 Jun 2020 10:38:56 +0000 (11:38 +0100)
Allow the compat vdso (32b) to be compiled as either THUMB2 (default) or
ARM.

For THUMB2, the register r7 is reserved for the frame pointer, but
code in arch/arm64/include/asm/vdso/compat_gettimeofday.h
uses r7. Explicitly set -fomit-frame-pointer, since unwinding through
interworked THUMB2 and ARM is unreliable anyways. See also how
CONFIG_UNWINDER_FRAME_POINTER cannot be selected for
CONFIG_THUMB2_KERNEL for ARCH=arm.

This also helps toolchains that differ in their implicit value if the
choice of -f{no-}omit-frame-pointer is left unspecified, to not error on
the use of r7.

2019 Q4 ARM AAPCS seeks to standardize the use of r11 as the reserved
frame pointer register, but no production compiler that can compile the
Linux kernel currently implements this.  We're actively discussing such
a transition with ARM toolchain developers currently.

Reported-by: Luis Lozano <llozano@google.com>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Tested-by: Manoj Gupta <manojgupta@google.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Stephen Boyd <swboyd@google.com>
Cc: Robin Murphy <robin.murphy@arm.com>
Cc: Dave Martin <Dave.Martin@arm.com>
Link: https://static.docs.arm.com/ihi0042/i/aapcs32.pdf
Link: https://bugs.chromium.org/p/chromium/issues/detail?id=1084372
Link: https://lore.kernel.org/r/20200608205711.109418-1-ndesaulniers@google.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/Kconfig
arch/arm64/kernel/vdso32/Makefile

index 77c440db9d46ca80327fababa2b6b93654ba3e64..63d711001dabbd568b319158652dbceaeccd4086 100644 (file)
@@ -1297,6 +1297,14 @@ config COMPAT_VDSO
          You must have a 32-bit build of glibc 2.22 or later for programs
          to seamlessly take advantage of this.
 
+config THUMB2_COMPAT_VDSO
+       bool "Compile the 32-bit vDSO for Thumb-2 mode" if EXPERT
+       depends on COMPAT_VDSO
+       default y
+       help
+         Compile the compat vDSO with '-mthumb -fomit-frame-pointer' if y,
+         otherwise with '-marm'.
+
 menuconfig ARMV8_DEPRECATED
        bool "Emulate deprecated/obsolete ARMv8 instructions"
        depends on SYSCTL
index 3964738ebbde860471540a8bd27f61e03fa48080..7ea1e827e5051101633aadd9d0f859cb68c7ba56 100644 (file)
@@ -105,6 +105,14 @@ VDSO_CFLAGS += -D__uint128_t='void*'
 VDSO_CFLAGS += $(call cc32-disable-warning,shift-count-overflow)
 VDSO_CFLAGS += -Wno-int-to-pointer-cast
 
+# Compile as THUMB2 or ARM. Unwinding via frame-pointers in THUMB2 is
+# unreliable.
+ifeq ($(CONFIG_THUMB2_COMPAT_VDSO), y)
+VDSO_CFLAGS += -mthumb -fomit-frame-pointer
+else
+VDSO_CFLAGS += -marm
+endif
+
 VDSO_AFLAGS := $(VDSO_CAFLAGS)
 VDSO_AFLAGS += -D__ASSEMBLY__