Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c2c9fe9 authored by Kevin Brodsky's avatar Kevin Brodsky Committed by Gagan Malvi
Browse files

FROMLIST: BACKPORT: [PATCH 6/6] arm64: Wire up and expose the new compat 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: default avatarKevin Brodsky <kevin.brodsky@arm.com>
Signed-off-by: default avatarMark 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

Signed-off-by: default avatarstarlight5234 <ifist2834@gmail.com>

Conflicts:
	arch/arm64/Makefile
Signed-off-by: default avatarTheSync <repo-sync@outlook.com>
parent a5a1d081
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -1188,6 +1188,30 @@ config KEYS_COMPAT
	def_bool y
	depends on COMPAT && KEYS

config COMPAT_VDSO
	bool "32-bit vDSO"
	depends on COMPAT
	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"
+33 −2
Original line number Diff line number Diff line
@@ -50,6 +50,35 @@ $(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.
@@ -57,11 +86,11 @@ KBUILD_CFLAGS += -mno-implicit-float
else
KBUILD_CFLAGS	+= -mgeneral-regs-only
endif
KBUILD_CFLAGS	+= $(lseinstr)
KBUILD_CFLAGS	+= $(lseinstr) $(vdso32)
KBUILD_CFLAGS	+= -fno-asynchronous-unwind-tables
KBUILD_CFLAGS	+= $(call cc-option, -mpc-relative-literal-loads)
KBUILD_CFLAGS	+= -fno-pic
KBUILD_AFLAGS	+= $(lseinstr)
KBUILD_AFLAGS	+= $(lseinstr) $(vdso32)

ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
KBUILD_CPPFLAGS	+= -mbig-endian
@@ -181,6 +210,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)'
+3 −0
Original line number Diff line number Diff line
@@ -32,7 +32,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
@@ -64,6 +66,7 @@ endif
KASAN_SANITIZE_stacktrace.o := n

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