arm64: vdso32: Detect binutils support for dmb ishld
Older versions of binutils (prior to 2.24) do not support the "ISHLD" option for memory barrier instructions, which leads to a build failure when assembling the vdso32 library. Add a compilation time mechanism that detects if binutils supports those instructions and configure the kernel accordingly. Cc: Will Deacon <will@kernel.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Reported-by: Will Deacon <will@kernel.org> Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Tested-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
37a5076098
commit
0df2c90eba
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory")
|
#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory")
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 8
|
#if __LINUX_ARM_ARCH__ >= 8 && defined(CONFIG_AS_DMB_ISHLD)
|
||||||
#define aarch32_smp_mb() dmb(ish)
|
#define aarch32_smp_mb() dmb(ish)
|
||||||
#define aarch32_smp_rmb() dmb(ishld)
|
#define aarch32_smp_rmb() dmb(ishld)
|
||||||
#define aarch32_smp_wmb() dmb(ishst)
|
#define aarch32_smp_wmb() dmb(ishst)
|
||||||
|
|
|
@ -15,6 +15,8 @@ cc32-disable-warning = $(call try-run,\
|
||||||
$(COMPATCC) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
|
$(COMPATCC) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
|
||||||
cc32-ldoption = $(call try-run,\
|
cc32-ldoption = $(call try-run,\
|
||||||
$(COMPATCC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
|
$(COMPATCC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
|
||||||
|
cc32-as-instr = $(call try-run,\
|
||||||
|
printf "%b\n" "$(1)" | $(COMPATCC) $(VDSO_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
|
||||||
|
|
||||||
# We cannot use the global flags to compile the vDSO files, the main reason
|
# We cannot use the global flags to compile the vDSO files, the main reason
|
||||||
# being that the 32-bit compiler may be older than the main (64-bit) compiler
|
# being that the 32-bit compiler may be older than the main (64-bit) compiler
|
||||||
|
@ -53,6 +55,7 @@ endif
|
||||||
VDSO_CAFLAGS += -fPIC -fno-builtin -fno-stack-protector
|
VDSO_CAFLAGS += -fPIC -fno-builtin -fno-stack-protector
|
||||||
VDSO_CAFLAGS += -DDISABLE_BRANCH_PROFILING
|
VDSO_CAFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||||
|
|
||||||
|
|
||||||
# Try to compile for ARMv8. If the compiler is too old and doesn't support it,
|
# Try to compile for ARMv8. If the compiler is too old and doesn't support it,
|
||||||
# fall back to v7. There is no easy way to check for what architecture the code
|
# fall back to v7. There is no easy way to check for what architecture the code
|
||||||
# is being compiled, so define a macro specifying that (see arch/arm/Makefile).
|
# is being compiled, so define a macro specifying that (see arch/arm/Makefile).
|
||||||
|
@ -89,6 +92,12 @@ VDSO_CFLAGS += -Wno-int-to-pointer-cast
|
||||||
VDSO_AFLAGS := $(VDSO_CAFLAGS)
|
VDSO_AFLAGS := $(VDSO_CAFLAGS)
|
||||||
VDSO_AFLAGS += -D__ASSEMBLY__
|
VDSO_AFLAGS += -D__ASSEMBLY__
|
||||||
|
|
||||||
|
# Check for binutils support for dmb ishld
|
||||||
|
dmbinstr := $(call cc32-as-instr,dmb ishld,-DCONFIG_AS_DMB_ISHLD=1)
|
||||||
|
|
||||||
|
VDSO_CFLAGS += $(dmbinstr)
|
||||||
|
VDSO_AFLAGS += $(dmbinstr)
|
||||||
|
|
||||||
VDSO_LDFLAGS := $(VDSO_CPPFLAGS)
|
VDSO_LDFLAGS := $(VDSO_CPPFLAGS)
|
||||||
# From arm vDSO Makefile
|
# From arm vDSO Makefile
|
||||||
VDSO_LDFLAGS += -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1
|
VDSO_LDFLAGS += -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1
|
||||||
|
|
Loading…
Reference in New Issue