18c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#
38c2ecf20Sopenharmony_ci# Building vDSO images for x86.
48c2ecf20Sopenharmony_ci#
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci# Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
78c2ecf20Sopenharmony_ciKCOV_INSTRUMENT                := n
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ciVDSO64-y		:= y
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_civdso-install-$(VDSO64-y)	+= vdso.so
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci# files to link into the vdso
158c2ecf20Sopenharmony_civobjs-y := vdso-note.o um_vdso.o
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci# files to link into kernel
188c2ecf20Sopenharmony_ciobj-$(VDSO64-y)			+= vdso.o vma.o
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_civobjs := $(foreach F,$(vobjs-y),$(obj)/$F)
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci$(obj)/vdso.o: $(obj)/vdso.so
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_citargets += vdso.so vdso.so.dbg vdso.lds $(vobjs-y)
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ciCPPFLAGS_vdso.lds += -P -C
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ciVDSO_LDFLAGS_vdso.lds = -m64 -Wl,-soname=linux-vdso.so.1 \
298c2ecf20Sopenharmony_ci       -Wl,-z,max-page-size=4096
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci$(obj)/vdso.o: $(src)/vdso.S $(obj)/vdso.so
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci$(obj)/vdso.so.dbg: $(obj)/vdso.lds $(vobjs) FORCE
348c2ecf20Sopenharmony_ci	$(call if_changed,vdso)
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci$(obj)/%.so: OBJCOPYFLAGS := -S
378c2ecf20Sopenharmony_ci$(obj)/%.so: $(obj)/%.so.dbg FORCE
388c2ecf20Sopenharmony_ci	$(call if_changed,objcopy)
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci#
418c2ecf20Sopenharmony_ci# Don't omit frame pointers for ease of userspace debugging, but do
428c2ecf20Sopenharmony_ci# optimize sibling calls.
438c2ecf20Sopenharmony_ci#
448c2ecf20Sopenharmony_ciCFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \
458c2ecf20Sopenharmony_ci       $(filter -g%,$(KBUILD_CFLAGS)) -fno-stack-protector \
468c2ecf20Sopenharmony_ci       -fno-omit-frame-pointer -foptimize-sibling-calls
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci$(vobjs): KBUILD_CFLAGS += $(CFL)
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci#
518c2ecf20Sopenharmony_ci# vDSO code runs in userspace and -pg doesn't help with profiling anyway.
528c2ecf20Sopenharmony_ci#
538c2ecf20Sopenharmony_ciCFLAGS_REMOVE_vdso-note.o = -pg -fprofile-arcs -ftest-coverage
548c2ecf20Sopenharmony_ciCFLAGS_REMOVE_um_vdso.o = -pg -fprofile-arcs -ftest-coverage
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci#
578c2ecf20Sopenharmony_ci# The DSO images are built using a special linker script.
588c2ecf20Sopenharmony_ci#
598c2ecf20Sopenharmony_ciquiet_cmd_vdso = VDSO    $@
608c2ecf20Sopenharmony_ci      cmd_vdso = $(CC) -nostdlib -o $@ \
618c2ecf20Sopenharmony_ci		       $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \
628c2ecf20Sopenharmony_ci		       -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) && \
638c2ecf20Sopenharmony_ci		 sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ciVDSO_LDFLAGS = -fPIC -shared -Wl,--hash-style=sysv -z noexecstack
668c2ecf20Sopenharmony_ciGCOV_PROFILE := n
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#
698c2ecf20Sopenharmony_ci# Install the unstripped copy of vdso*.so listed in $(vdso-install-y).
708c2ecf20Sopenharmony_ci#
718c2ecf20Sopenharmony_ciquiet_cmd_vdso_install = INSTALL $@
728c2ecf20Sopenharmony_ci      cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
738c2ecf20Sopenharmony_ci$(vdso-install-y): %.so: $(obj)/%.so.dbg FORCE
748c2ecf20Sopenharmony_ci	@mkdir -p $(MODLIB)/vdso
758c2ecf20Sopenharmony_ci	$(call cmd,vdso_install)
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ciPHONY += vdso_install $(vdso-install-y)
788c2ecf20Sopenharmony_civdso_install: $(vdso-install-y)
79