162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ciOBJECT_FILES_NON_STANDARD := y 362306a36Sopenharmony_ci 462306a36Sopenharmony_cipurgatory-y := purgatory.o sha256.o entry.o string.o ctype.o memcpy.o memset.o 562306a36Sopenharmony_cipurgatory-y += strcmp.o strlen.o strncmp.o 662306a36Sopenharmony_ci 762306a36Sopenharmony_citargets += $(purgatory-y) 862306a36Sopenharmony_ciPURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y)) 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci$(obj)/string.o: $(srctree)/lib/string.c FORCE 1162306a36Sopenharmony_ci $(call if_changed_rule,cc_o_c) 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci$(obj)/ctype.o: $(srctree)/lib/ctype.c FORCE 1462306a36Sopenharmony_ci $(call if_changed_rule,cc_o_c) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci$(obj)/memcpy.o: $(srctree)/arch/riscv/lib/memcpy.S FORCE 1762306a36Sopenharmony_ci $(call if_changed_rule,as_o_S) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci$(obj)/memset.o: $(srctree)/arch/riscv/lib/memset.S FORCE 2062306a36Sopenharmony_ci $(call if_changed_rule,as_o_S) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci$(obj)/strcmp.o: $(srctree)/arch/riscv/lib/strcmp.S FORCE 2362306a36Sopenharmony_ci $(call if_changed_rule,as_o_S) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci$(obj)/strlen.o: $(srctree)/arch/riscv/lib/strlen.S FORCE 2662306a36Sopenharmony_ci $(call if_changed_rule,as_o_S) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci$(obj)/strncmp.o: $(srctree)/arch/riscv/lib/strncmp.S FORCE 2962306a36Sopenharmony_ci $(call if_changed_rule,as_o_S) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci$(obj)/sha256.o: $(srctree)/lib/crypto/sha256.c FORCE 3262306a36Sopenharmony_ci $(call if_changed_rule,cc_o_c) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciCFLAGS_sha256.o := -D__DISABLE_EXPORTS -D__NO_FORTIFY 3562306a36Sopenharmony_ciCFLAGS_string.o := -D__DISABLE_EXPORTS 3662306a36Sopenharmony_ciCFLAGS_ctype.o := -D__DISABLE_EXPORTS 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci# When profile-guided optimization is enabled, llvm emits two different 3962306a36Sopenharmony_ci# overlapping text sections, which is not supported by kexec. Remove profile 4062306a36Sopenharmony_ci# optimization flags. 4162306a36Sopenharmony_ciKBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%,$(KBUILD_CFLAGS)) 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci# When linking purgatory.ro with -r unresolved symbols are not checked, 4462306a36Sopenharmony_ci# also link a purgatory.chk binary without -r to check for unresolved symbols. 4562306a36Sopenharmony_ciPURGATORY_LDFLAGS := -e purgatory_start -z nodefaultlib 4662306a36Sopenharmony_ciLDFLAGS_purgatory.ro := -r $(PURGATORY_LDFLAGS) 4762306a36Sopenharmony_ciLDFLAGS_purgatory.chk := $(PURGATORY_LDFLAGS) 4862306a36Sopenharmony_citargets += purgatory.ro purgatory.chk 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci# Sanitizer, etc. runtimes are unavailable and cannot be linked here. 5162306a36Sopenharmony_ciGCOV_PROFILE := n 5262306a36Sopenharmony_ciKASAN_SANITIZE := n 5362306a36Sopenharmony_ciUBSAN_SANITIZE := n 5462306a36Sopenharmony_ciKCSAN_SANITIZE := n 5562306a36Sopenharmony_ciKCOV_INSTRUMENT := n 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci# These are adjustments to the compiler flags used for objects that 5862306a36Sopenharmony_ci# make up the standalone purgatory.ro 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciPURGATORY_CFLAGS_REMOVE := -mcmodel=kernel 6162306a36Sopenharmony_ciPURGATORY_CFLAGS := -mcmodel=medany -ffreestanding -fno-zero-initialized-in-bss 6262306a36Sopenharmony_ciPURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING 6362306a36Sopenharmony_ciPURGATORY_CFLAGS += -fno-stack-protector -g0 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That 6662306a36Sopenharmony_ci# in turn leaves some undefined symbols like __fentry__ in purgatory and not 6762306a36Sopenharmony_ci# sure how to relocate those. 6862306a36Sopenharmony_ciifdef CONFIG_FUNCTION_TRACER 6962306a36Sopenharmony_ciPURGATORY_CFLAGS_REMOVE += $(CC_FLAGS_FTRACE) 7062306a36Sopenharmony_ciendif 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciifdef CONFIG_STACKPROTECTOR 7362306a36Sopenharmony_ciPURGATORY_CFLAGS_REMOVE += -fstack-protector 7462306a36Sopenharmony_ciendif 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciifdef CONFIG_STACKPROTECTOR_STRONG 7762306a36Sopenharmony_ciPURGATORY_CFLAGS_REMOVE += -fstack-protector-strong 7862306a36Sopenharmony_ciendif 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ciifdef CONFIG_CFI_CLANG 8162306a36Sopenharmony_ciPURGATORY_CFLAGS_REMOVE += $(CC_FLAGS_CFI) 8262306a36Sopenharmony_ciendif 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciCFLAGS_REMOVE_purgatory.o += $(PURGATORY_CFLAGS_REMOVE) 8562306a36Sopenharmony_ciCFLAGS_purgatory.o += $(PURGATORY_CFLAGS) 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ciCFLAGS_REMOVE_sha256.o += $(PURGATORY_CFLAGS_REMOVE) 8862306a36Sopenharmony_ciCFLAGS_sha256.o += $(PURGATORY_CFLAGS) 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciCFLAGS_REMOVE_string.o += $(PURGATORY_CFLAGS_REMOVE) 9162306a36Sopenharmony_ciCFLAGS_string.o += $(PURGATORY_CFLAGS) 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ciCFLAGS_REMOVE_ctype.o += $(PURGATORY_CFLAGS_REMOVE) 9462306a36Sopenharmony_ciCFLAGS_ctype.o += $(PURGATORY_CFLAGS) 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ciasflags-remove-y += $(foreach x, -g -gdwarf-4 -gdwarf-5, $(x) -Wa,$(x)) 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE 9962306a36Sopenharmony_ci $(call if_changed,ld) 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci$(obj)/purgatory.chk: $(obj)/purgatory.ro FORCE 10262306a36Sopenharmony_ci $(call if_changed,ld) 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci$(obj)/kexec-purgatory.o: $(obj)/purgatory.ro $(obj)/purgatory.chk 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ciobj-y += kexec-purgatory.o 107