Skip to content

Commit

Permalink
FROMLIST: BACKPORT: [PATCH 6/6] arm64: Wire up and expose the new com…
Browse files Browse the repository at this point in the history
…pat vDSO

(cherry pick from url https://patchwork.kernel.org/patch/10060447/)

Expose the new compat vDSO via the COMPAT_VDSO config option.

The option is not enabled in defconfig because we really need a 32-bit
compiler this time, and we rely on the user to provide it themselves
by setting CROSS_COMPILE_ARM32. Therefore enabling the option by
default would make little sense, since the user must explicitly set a
non-standard environment variable anyway.

CONFIG_COMPAT_VDSO is not directly used in the code, because we want
to ignore it (build as if it were not set) if the user didn't set
CROSS_COMPILE_ARM32. If the variable has been set to a valid prefix,
CONFIG_VDSO32 will be set; this is the option that the code and
Makefiles test.

For more flexibility, like CROSS_COMPILE, CROSS_COMPILE_ARM32 can also
be set via CONFIG_CROSS_COMPILE_ARM32 (the environment variable
overrides the config option, as expected).

Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>

Also needs to set CONFIG_ARM_ARCH_TIMER_VCT_ACCESS when CONFIG_VDSO32
is selected.

Signed-off-by: Mark Salyzyn <salyzyn@android.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Dave Martin <Dave.Martin@arm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Bug: 63737556
Bug: 20045882
Change-Id: Ie8a7d6c2b5ba3edca591a9a953ce99ec792da882
  • Loading branch information
kevin-brodsky-arm authored and rr-mario committed Jun 9, 2019
1 parent c6f1f15 commit de396ed
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 2 deletions.
26 changes: 26 additions & 0 deletions arch/arm64/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -1234,6 +1234,32 @@ config KEYS_COMPAT
def_bool y
depends on COMPAT && KEYS


config COMPAT_VDSO
bool "32-bit vDSO"
depends on COMPAT
select ARM_ARCH_TIMER_VCT_ACCESS
default n
help
Warning: a 32-bit toolchain is necessary to build the vDSO. You
must explicitly define which toolchain should be used by setting
CROSS_COMPILE_ARM32 to the prefix of the 32-bit toolchain (same format
as CROSS_COMPILE). If CROSS_COMPILE_ARM32 is empty, a warning will be
printed and the kernel will be built as if COMPAT_VDSO had not been
set. If CROSS_COMPILE_ARM32 is set to an invalid prefix, compilation
will be aborted.

Provide a vDSO to 32-bit processes. It includes the symbols provided
by the vDSO from the 32-bit kernel, so that a 32-bit libc can use
the compat vDSO without modification. It also provides sigreturn
trampolines, replacing the sigreturn page.

config CROSS_COMPILE_ARM32
string "32-bit toolchain prefix"
help
Same as setting CROSS_COMPILE_ARM32 in the environment, but saved for
future builds. The environment variable overrides this config option.

endmenu

menu "Power management options"
Expand Down
35 changes: 33 additions & 2 deletions arch/arm64/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,47 @@ $(warning LSE atomics not supported by binutils)
endif
endif

ifeq ($(CONFIG_COMPAT_VDSO), y)
CROSS_COMPILE_ARM32 ?= $(CONFIG_CROSS_COMPILE_ARM32:"%"=%)

# Check that the user has provided a valid prefix for the 32-bit toolchain.
# To prevent selecting the system $(cc-name) by default, the prefix is not
# allowed to be empty, unlike CROSS_COMPILE. In the unlikely event that the
# system $(cc-name) is actually the 32-bit ARM compiler to be used, the
# variable can be set to the dirname (e.g. CROSS_COMPILE_ARM32=/usr/bin/).
# Note: this Makefile is read both before and after regenerating the config
# (if needed). Any warning appearing before the config has been regenerated
# should be ignored. If the error is triggered and you set
# CONFIG_CROSS_COMPILE_ARM32, set CROSS_COMPILE_ARM32 to an appropriate value
# when invoking make and fix CONFIG_CROSS_COMPILE_ARM32.
ifeq ($(CROSS_COMPILE_ARM32),)
$(warning CROSS_COMPILE_ARM32 not defined or empty, the compat vDSO will not be built)
else ifeq ($(cc-name),clang)
export CLANG_TRIPLE_ARM32 ?= $(CROSS_COMPILE_ARM32)
export CLANG_TARGET_ARM32 := --target=$(notdir $(CLANG_TRIPLE_ARM32:%-=%))
export CONFIG_VDSO32 := y
vdso32 := -DCONFIG_VDSO32=1
else ifeq ($(shell which $(CROSS_COMPILE_ARM32)$(cc-name) 2> /dev/null),)
$(error $(CROSS_COMPILE_ARM32)$(cc-name) not found, check CROSS_COMPILE_ARM32)
else
export CROSS_COMPILE_ARM32
export CONFIG_VDSO32 := y
vdso32 := -DCONFIG_VDSO32=1
endif
endif

ifeq ($(cc-name),clang)
# This is a workaround for https://bugs.llvm.org/show_bug.cgi?id=30792.
# TODO: revert when this is fixed in LLVM.
KBUILD_CFLAGS += -mno-implicit-float
else
KBUILD_CFLAGS += -mgeneral-regs-only
endif
KBUILD_CFLAGS += $(lseinstr)
KBUILD_CFLAGS += $(lseinstr) $(vdso32)
KBUILD_CFLAGS += -fno-pic
KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads)
KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
KBUILD_AFLAGS += $(lseinstr)
KBUILD_AFLAGS += $(lseinstr) $(vdso32)

ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
KBUILD_CPPFLAGS += -mbig-endian
Expand Down Expand Up @@ -152,6 +181,8 @@ archclean:
prepare: vdso_prepare
vdso_prepare: prepare0
$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h
$(if $(CONFIG_VDSO32),$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso32 \
include/generated/vdso32-offsets.h)

define archhelp
echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)'
Expand Down
3 changes: 3 additions & 0 deletions arch/arm64/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE

arm64-obj-$(CONFIG_COMPAT) += sys32.o signal32.o \
sys_compat.o entry32.o
ifneq ($(CONFIG_VDSO32),y)
arm64-obj-$(CONFIG_COMPAT) += sigreturn32.o
endif
arm64-obj-$(CONFIG_KUSER_HELPERS) += kuser32.o
arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o
arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o
Expand Down Expand Up @@ -56,6 +58,7 @@ arm64-obj-$(CONFIG_HARDEN_BRANCH_PREDICTOR) += bpi.o
endif

obj-y += $(arm64-obj-y) vdso/ probes/
obj-$(CONFIG_VDSO32) += vdso32/
obj-m += $(arm64-obj-m)
head-y := head.o
extra-y += $(head-y) vmlinux.lds

0 comments on commit de396ed

Please sign in to comment.