162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#
362306a36Sopenharmony_ci# Building a vDSO image for AArch64.
462306a36Sopenharmony_ci#
562306a36Sopenharmony_ci# Author: Will Deacon <will.deacon@arm.com>
662306a36Sopenharmony_ci# Heavily based on the vDSO Makefiles for other archs.
762306a36Sopenharmony_ci#
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci# Include the generic Makefile to check the built vdso.
1062306a36Sopenharmony_ciinclude $(srctree)/lib/vdso/Makefile
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciobj-vdso := vgettimeofday.o note.o sigreturn.o
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci# Build rules
1562306a36Sopenharmony_citargets := $(obj-vdso) vdso.so vdso.so.dbg
1662306a36Sopenharmony_ciobj-vdso := $(addprefix $(obj)/, $(obj-vdso))
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cibtildflags-$(CONFIG_ARM64_BTI_KERNEL) += -z force-bti
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci# -Bsymbolic has been added for consistency with arm, the compat vDSO and
2162306a36Sopenharmony_ci# potential future proofing if we end up with internal calls to the exported
2262306a36Sopenharmony_ci# routines, as x86 does (see 6f121e548f83 ("x86, vdso: Reimplement vdso.so
2362306a36Sopenharmony_ci# preparation in build-time C")).
2462306a36Sopenharmony_cildflags-y := -shared -soname=linux-vdso.so.1 --hash-style=sysv	\
2562306a36Sopenharmony_ci	     -Bsymbolic --build-id=sha1 -n $(btildflags-y)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ciifdef CONFIG_LD_ORPHAN_WARN
2862306a36Sopenharmony_ci  ldflags-y += --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
2962306a36Sopenharmony_ciendif
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cildflags-y += -T
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciccflags-y := -fno-common -fno-builtin -fno-stack-protector -ffixed-x18
3462306a36Sopenharmony_ciccflags-y += -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci# -Wmissing-prototypes and -Wmissing-declarations are removed from
3762306a36Sopenharmony_ci# the CFLAGS of vgettimeofday.c to make possible to build the
3862306a36Sopenharmony_ci# kernel with CONFIG_WERROR enabled.
3962306a36Sopenharmony_ciCFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) \
4062306a36Sopenharmony_ci				$(RANDSTRUCT_CFLAGS) $(GCC_PLUGINS_CFLAGS) \
4162306a36Sopenharmony_ci				$(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \
4262306a36Sopenharmony_ci				-Wmissing-prototypes -Wmissing-declarations
4362306a36Sopenharmony_ciKASAN_SANITIZE			:= n
4462306a36Sopenharmony_ciKCSAN_SANITIZE			:= n
4562306a36Sopenharmony_ciUBSAN_SANITIZE			:= n
4662306a36Sopenharmony_ciOBJECT_FILES_NON_STANDARD	:= y
4762306a36Sopenharmony_ciKCOV_INSTRUMENT			:= n
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciCFLAGS_vgettimeofday.o = -O2 -mcmodel=tiny -fasynchronous-unwind-tables
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciifneq ($(c-gettimeofday-y),)
5262306a36Sopenharmony_ci  CFLAGS_vgettimeofday.o += -include $(c-gettimeofday-y)
5362306a36Sopenharmony_ciendif
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci# Disable gcov profiling for VDSO code
5662306a36Sopenharmony_ciGCOV_PROFILE := n
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_citargets += vdso.lds
5962306a36Sopenharmony_ciCPPFLAGS_vdso.lds += -P -C -U$(ARCH)
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci# Link rule for the .so file, .lds has to be first
6262306a36Sopenharmony_ci$(obj)/vdso.so.dbg: $(obj)/vdso.lds $(obj-vdso) FORCE
6362306a36Sopenharmony_ci	$(call if_changed,vdsold_and_vdso_check)
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci# Strip rule for the .so file
6662306a36Sopenharmony_ci$(obj)/%.so: OBJCOPYFLAGS := -S
6762306a36Sopenharmony_ci$(obj)/%.so: $(obj)/%.so.dbg FORCE
6862306a36Sopenharmony_ci	$(call if_changed,objcopy)
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci# Generate VDSO offsets using helper script
7162306a36Sopenharmony_cigen-vdsosym := $(srctree)/$(src)/gen_vdso_offsets.sh
7262306a36Sopenharmony_ciquiet_cmd_vdsosym = VDSOSYM $@
7362306a36Sopenharmony_ci      cmd_vdsosym = $(NM) $< | $(gen-vdsosym) | LC_ALL=C sort > $@
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciinclude/generated/vdso-offsets.h: $(obj)/vdso.so.dbg FORCE
7662306a36Sopenharmony_ci	$(call if_changed,vdsosym)
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci# Actual build commands
7962306a36Sopenharmony_ciquiet_cmd_vdsold_and_vdso_check = LD      $@
8062306a36Sopenharmony_ci      cmd_vdsold_and_vdso_check = $(cmd_ld); $(cmd_vdso_check)
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci# Install commands for the unstripped file
8362306a36Sopenharmony_ciquiet_cmd_vdso_install = INSTALL $@
8462306a36Sopenharmony_ci      cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_civdso.so: $(obj)/vdso.so.dbg
8762306a36Sopenharmony_ci	@mkdir -p $(MODLIB)/vdso
8862306a36Sopenharmony_ci	$(call cmd,vdso_install)
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_civdso_install: vdso.so
91