1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Building vDSO images for sparc. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunVDSO64-$(CONFIG_SPARC64) := y 7*4882a593SmuzhiyunVDSOCOMPAT-$(CONFIG_COMPAT) := y 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun# files to link into the vdso 10*4882a593Smuzhiyunvobjs-y := vdso-note.o vclock_gettime.o 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun# files to link into kernel 13*4882a593Smuzhiyunobj-y += vma.o 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun# vDSO images to build 16*4882a593Smuzhiyunvdso_img-$(VDSO64-y) += 64 17*4882a593Smuzhiyunvdso_img-$(VDSOCOMPAT-y) += 32 18*4882a593Smuzhiyun 19*4882a593Smuzhiyunvobjs := $(foreach F,$(vobjs-y),$(obj)/$F) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun$(obj)/vdso.o: $(obj)/vdso.so 22*4882a593Smuzhiyun 23*4882a593Smuzhiyuntargets += vdso.lds $(vobjs-y) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun# Build the vDSO image C files and link them in. 26*4882a593Smuzhiyunvdso_img_objs := $(vdso_img-y:%=vdso-image-%.o) 27*4882a593Smuzhiyunvdso_img_cfiles := $(vdso_img-y:%=vdso-image-%.c) 28*4882a593Smuzhiyunvdso_img_sodbg := $(vdso_img-y:%=vdso%.so.dbg) 29*4882a593Smuzhiyunobj-y += $(vdso_img_objs) 30*4882a593Smuzhiyuntargets += $(vdso_img_cfiles) 31*4882a593Smuzhiyuntargets += $(vdso_img_sodbg) $(vdso_img-y:%=vdso%.so) 32*4882a593Smuzhiyun 33*4882a593SmuzhiyunCPPFLAGS_vdso.lds += -P -C 34*4882a593Smuzhiyun 35*4882a593SmuzhiyunVDSO_LDFLAGS_vdso.lds = -m elf64_sparc -soname linux-vdso.so.1 --no-undefined \ 36*4882a593Smuzhiyun -z max-page-size=8192 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun$(obj)/vdso64.so.dbg: $(obj)/vdso.lds $(vobjs) FORCE 39*4882a593Smuzhiyun $(call if_changed,vdso) 40*4882a593Smuzhiyun 41*4882a593SmuzhiyunHOST_EXTRACFLAGS += -I$(srctree)/tools/include 42*4882a593Smuzhiyunhostprogs += vdso2c 43*4882a593Smuzhiyun 44*4882a593Smuzhiyunquiet_cmd_vdso2c = VDSO2C $@ 45*4882a593Smuzhiyun cmd_vdso2c = $(obj)/vdso2c $< $(<:%.dbg=%) $@ 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun$(obj)/vdso-image-%.c: $(obj)/vdso%.so.dbg $(obj)/vdso%.so $(obj)/vdso2c FORCE 48*4882a593Smuzhiyun $(call if_changed,vdso2c) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun# 51*4882a593Smuzhiyun# Don't omit frame pointers for ease of userspace debugging, but do 52*4882a593Smuzhiyun# optimize sibling calls. 53*4882a593Smuzhiyun# 54*4882a593SmuzhiyunCFL := $(PROFILING) -mcmodel=medlow -fPIC -O2 -fasynchronous-unwind-tables -m64 \ 55*4882a593Smuzhiyun $(filter -g%,$(KBUILD_CFLAGS)) -fno-stack-protector \ 56*4882a593Smuzhiyun -fno-omit-frame-pointer -foptimize-sibling-calls \ 57*4882a593Smuzhiyun -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO 58*4882a593Smuzhiyun 59*4882a593SmuzhiyunSPARC_REG_CFLAGS = -ffixed-g4 -ffixed-g5 -fcall-used-g5 -fcall-used-g7 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun$(vobjs): KBUILD_CFLAGS := $(filter-out $(GCC_PLUGINS_CFLAGS) $(SPARC_REG_CFLAGS),$(KBUILD_CFLAGS)) $(CFL) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun# 64*4882a593Smuzhiyun# vDSO code runs in userspace and -pg doesn't help with profiling anyway. 65*4882a593Smuzhiyun# 66*4882a593SmuzhiyunCFLAGS_REMOVE_vclock_gettime.o = -pg 67*4882a593SmuzhiyunCFLAGS_REMOVE_vdso32/vclock_gettime.o = -pg 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun$(obj)/%.so: OBJCOPYFLAGS := -S 70*4882a593Smuzhiyun$(obj)/%.so: $(obj)/%.so.dbg FORCE 71*4882a593Smuzhiyun $(call if_changed,objcopy) 72*4882a593Smuzhiyun 73*4882a593SmuzhiyunCPPFLAGS_vdso32/vdso32.lds = $(CPPFLAGS_vdso.lds) 74*4882a593SmuzhiyunVDSO_LDFLAGS_vdso32.lds = -m elf32_sparc -soname linux-gate.so.1 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun#This makes sure the $(obj) subdirectory exists even though vdso32/ 77*4882a593Smuzhiyun#is not a kbuild sub-make subdirectory 78*4882a593Smuzhiyunoverride obj-dirs = $(dir $(obj)) $(obj)/vdso32/ 79*4882a593Smuzhiyun 80*4882a593Smuzhiyuntargets += vdso32/vdso32.lds 81*4882a593Smuzhiyuntargets += vdso32/vdso-note.o 82*4882a593Smuzhiyuntargets += vdso32/vclock_gettime.o 83*4882a593Smuzhiyun 84*4882a593SmuzhiyunKBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS)) -DBUILD_VDSO 85*4882a593Smuzhiyun$(obj)/vdso32.so.dbg: KBUILD_AFLAGS = $(KBUILD_AFLAGS_32) 86*4882a593Smuzhiyun$(obj)/vdso32.so.dbg: asflags-$(CONFIG_SPARC64) += -m32 87*4882a593Smuzhiyun 88*4882a593SmuzhiyunKBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS)) 89*4882a593SmuzhiyunKBUILD_CFLAGS_32 := $(filter-out -mcmodel=medlow,$(KBUILD_CFLAGS_32)) 90*4882a593SmuzhiyunKBUILD_CFLAGS_32 := $(filter-out -fno-pic,$(KBUILD_CFLAGS_32)) 91*4882a593SmuzhiyunKBUILD_CFLAGS_32 := $(filter-out $(GCC_PLUGINS_CFLAGS),$(KBUILD_CFLAGS_32)) 92*4882a593SmuzhiyunKBUILD_CFLAGS_32 := $(filter-out $(SPARC_REG_CFLAGS),$(KBUILD_CFLAGS_32)) 93*4882a593SmuzhiyunKBUILD_CFLAGS_32 += -m32 -msoft-float -fpic 94*4882a593SmuzhiyunKBUILD_CFLAGS_32 += -fno-stack-protector 95*4882a593SmuzhiyunKBUILD_CFLAGS_32 += $(call cc-option, -foptimize-sibling-calls) 96*4882a593SmuzhiyunKBUILD_CFLAGS_32 += -fno-omit-frame-pointer 97*4882a593SmuzhiyunKBUILD_CFLAGS_32 += -DDISABLE_BRANCH_PROFILING 98*4882a593SmuzhiyunKBUILD_CFLAGS_32 += -mv8plus 99*4882a593Smuzhiyun$(obj)/vdso32.so.dbg: KBUILD_CFLAGS = $(KBUILD_CFLAGS_32) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun$(obj)/vdso32.so.dbg: FORCE \ 102*4882a593Smuzhiyun $(obj)/vdso32/vdso32.lds \ 103*4882a593Smuzhiyun $(obj)/vdso32/vclock_gettime.o \ 104*4882a593Smuzhiyun $(obj)/vdso32/vdso-note.o 105*4882a593Smuzhiyun $(call if_changed,vdso) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun# 108*4882a593Smuzhiyun# The DSO images are built using a special linker script. 109*4882a593Smuzhiyun# 110*4882a593Smuzhiyunquiet_cmd_vdso = VDSO $@ 111*4882a593Smuzhiyun cmd_vdso = $(LD) -nostdlib -o $@ \ 112*4882a593Smuzhiyun $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \ 113*4882a593Smuzhiyun -T $(filter %.lds,$^) $(filter %.o,$^) && \ 114*4882a593Smuzhiyun sh $(srctree)/$(src)/checkundef.sh '$(OBJDUMP)' '$@' 115*4882a593Smuzhiyun 116*4882a593SmuzhiyunVDSO_LDFLAGS = -shared --hash-style=both --build-id=sha1 -Bsymbolic 117*4882a593SmuzhiyunGCOV_PROFILE := n 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun# 120*4882a593Smuzhiyun# Install the unstripped copies of vdso*.so. If our toolchain supports 121*4882a593Smuzhiyun# build-id, install .build-id links as well. 122*4882a593Smuzhiyun# 123*4882a593Smuzhiyunquiet_cmd_vdso_install = INSTALL $(@:install_%=%) 124*4882a593Smuzhiyundefine cmd_vdso_install 125*4882a593Smuzhiyun cp $< "$(MODLIB)/vdso/$(@:install_%=%)"; \ 126*4882a593Smuzhiyun if readelf -n $< |grep -q 'Build ID'; then \ 127*4882a593Smuzhiyun buildid=`readelf -n $< |grep 'Build ID' |sed -e 's/^.*Build ID: \(.*\)$$/\1/'`; \ 128*4882a593Smuzhiyun first=`echo $$buildid | cut -b-2`; \ 129*4882a593Smuzhiyun last=`echo $$buildid | cut -b3-`; \ 130*4882a593Smuzhiyun mkdir -p "$(MODLIB)/vdso/.build-id/$$first"; \ 131*4882a593Smuzhiyun ln -sf "../../$(@:install_%=%)" "$(MODLIB)/vdso/.build-id/$$first/$$last.debug"; \ 132*4882a593Smuzhiyun fi 133*4882a593Smuzhiyunendef 134*4882a593Smuzhiyun 135*4882a593Smuzhiyunvdso_img_insttargets := $(vdso_img_sodbg:%.dbg=install_%) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun$(MODLIB)/vdso: FORCE 138*4882a593Smuzhiyun @mkdir -p $(MODLIB)/vdso 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun$(vdso_img_insttargets): install_%: $(obj)/%.dbg $(MODLIB)/vdso FORCE 141*4882a593Smuzhiyun $(call cmd,vdso_install) 142*4882a593Smuzhiyun 143*4882a593SmuzhiyunPHONY += vdso_install $(vdso_img_insttargets) 144*4882a593Smuzhiyunvdso_install: $(vdso_img_insttargets) FORCE 145