1104382Sarchie# SPDX-License-Identifier: GPL-2.0 2104382SarchieOBJECT_FILES_NON_STANDARD := y 3104382Sarchie 4104382Sarchiepurgatory-y := purgatory.o sha256.o entry.o string.o ctype.o memcpy.o memset.o 5104382Sarchiepurgatory-y += strcmp.o strlen.o strncmp.o 6104382Sarchie 7104382Sarchietargets += $(purgatory-y) 8104382SarchiePURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y)) 9104382Sarchie 10104382Sarchie$(obj)/string.o: $(srctree)/lib/string.c FORCE 11104382Sarchie $(call if_changed_rule,cc_o_c) 12104382Sarchie 13104382Sarchie$(obj)/ctype.o: $(srctree)/lib/ctype.c FORCE 14104382Sarchie $(call if_changed_rule,cc_o_c) 15104382Sarchie 16104382Sarchie$(obj)/memcpy.o: $(srctree)/arch/riscv/lib/memcpy.S FORCE 17104382Sarchie $(call if_changed_rule,as_o_S) 18104382Sarchie 19104382Sarchie$(obj)/memset.o: $(srctree)/arch/riscv/lib/memset.S FORCE 20104382Sarchie $(call if_changed_rule,as_o_S) 21104382Sarchie 22104382Sarchie$(obj)/strcmp.o: $(srctree)/arch/riscv/lib/strcmp.S FORCE 23104382Sarchie $(call if_changed_rule,as_o_S) 24104382Sarchie 25104382Sarchie$(obj)/strlen.o: $(srctree)/arch/riscv/lib/strlen.S FORCE 26104382Sarchie $(call if_changed_rule,as_o_S) 27104382Sarchie 28104382Sarchie$(obj)/strncmp.o: $(srctree)/arch/riscv/lib/strncmp.S FORCE 29104382Sarchie $(call if_changed_rule,as_o_S) 30104382Sarchie 31104382Sarchie$(obj)/sha256.o: $(srctree)/lib/crypto/sha256.c FORCE 32104382Sarchie $(call if_changed_rule,cc_o_c) 33104382Sarchie 34104382SarchieCFLAGS_sha256.o := -D__DISABLE_EXPORTS -D__NO_FORTIFY 35104382SarchieCFLAGS_string.o := -D__DISABLE_EXPORTS 36104382SarchieCFLAGS_ctype.o := -D__DISABLE_EXPORTS 37104382Sarchie 38166693Sjulian# When profile-guided optimization is enabled, llvm emits two different 39104382Sarchie# overlapping text sections, which is not supported by kexec. Remove profile 40104382Sarchie# optimization flags. 41104382SarchieKBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%,$(KBUILD_CFLAGS)) 42104382Sarchie 43104382Sarchie# When linking purgatory.ro with -r unresolved symbols are not checked, 44104382Sarchie# also link a purgatory.chk binary without -r to check for unresolved symbols. 45104382SarchiePURGATORY_LDFLAGS := -e purgatory_start -z nodefaultlib 46104382SarchieLDFLAGS_purgatory.ro := -r $(PURGATORY_LDFLAGS) 47104382SarchieLDFLAGS_purgatory.chk := $(PURGATORY_LDFLAGS) 48104382Sarchietargets += purgatory.ro purgatory.chk 49104382Sarchie 50166692Sjulian# Sanitizer, etc. runtimes are unavailable and cannot be linked here. 51104382SarchieGCOV_PROFILE := n 52104382SarchieKASAN_SANITIZE := n 53104382SarchieUBSAN_SANITIZE := n 54111476SjulianKCSAN_SANITIZE := n 55104382SarchieKCOV_INSTRUMENT := n 56152751Sru 57104382Sarchie# These are adjustments to the compiler flags used for objects that 58152751Sru# make up the standalone purgatory.ro 59123367Smarcel 60123367SmarcelPURGATORY_CFLAGS_REMOVE := -mcmodel=kernel 61104382SarchiePURGATORY_CFLAGS := -mcmodel=medany -ffreestanding -fno-zero-initialized-in-bss 62108028SruPURGATORY_CFLAGS += $(DISABLE_STACKLEAK_PLUGIN) -DDISABLE_BRANCH_PROFILING 63104382SarchiePURGATORY_CFLAGS += -fno-stack-protector -g0 64104382Sarchie 65104382Sarchie# Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That 66104382Sarchie# in turn leaves some undefined symbols like __fentry__ in purgatory and not 67104382Sarchie# sure how to relocate those. 68104382Sarchieifdef CONFIG_FUNCTION_TRACER 69104382SarchiePURGATORY_CFLAGS_REMOVE += $(CC_FLAGS_FTRACE) 70104382Sarchieendif 71104382Sarchie 72104382Sarchieifdef CONFIG_STACKPROTECTOR 73104382SarchiePURGATORY_CFLAGS_REMOVE += -fstack-protector 74104382Sarchieendif 75104382Sarchie 76104382Sarchieifdef CONFIG_STACKPROTECTOR_STRONG 77104382SarchiePURGATORY_CFLAGS_REMOVE += -fstack-protector-strong 78104382Sarchieendif 79104382Sarchie 80104382Sarchieifdef CONFIG_CFI_CLANG 81104382SarchiePURGATORY_CFLAGS_REMOVE += $(CC_FLAGS_CFI) 82104382Sarchieendif 83104382Sarchie 84104382Sarchieifdef CONFIG_RELOCATABLE 85104382SarchiePURGATORY_CFLAGS_REMOVE += -fPIE 86104382Sarchieendif 87104382Sarchie 88104382Sarchieifdef CONFIG_SHADOW_CALL_STACK 89104382SarchiePURGATORY_CFLAGS_REMOVE += $(CC_FLAGS_SCS) 90108309Sjulianendif 91104382Sarchie 92104382SarchieCFLAGS_REMOVE_purgatory.o += $(PURGATORY_CFLAGS_REMOVE) 93104382SarchieCFLAGS_purgatory.o += $(PURGATORY_CFLAGS) 94104382Sarchie 95104382SarchieCFLAGS_REMOVE_sha256.o += $(PURGATORY_CFLAGS_REMOVE) 96104382SarchieCFLAGS_sha256.o += $(PURGATORY_CFLAGS) 97104382Sarchie 98104382SarchieCFLAGS_REMOVE_string.o += $(PURGATORY_CFLAGS_REMOVE) 99104382SarchieCFLAGS_string.o += $(PURGATORY_CFLAGS) 100104382Sarchie 101104382SarchieCFLAGS_REMOVE_ctype.o += $(PURGATORY_CFLAGS_REMOVE) 102104382SarchieCFLAGS_ctype.o += $(PURGATORY_CFLAGS) 103104382Sarchie 104104382Sarchieasflags-remove-y += $(foreach x, -g -gdwarf-4 -gdwarf-5, $(x) -Wa,$(x)) 105104382Sarchie 106104382Sarchie$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE 107104382Sarchie $(call if_changed,ld) 108104382Sarchie 109104382Sarchie$(obj)/purgatory.chk: $(obj)/purgatory.ro FORCE 110104382Sarchie $(call if_changed,ld) 111104382Sarchie 112104382Sarchie$(obj)/kexec-purgatory.o: $(obj)/purgatory.ro $(obj)/purgatory.chk 113104382Sarchie 114104382Sarchieobj-y += kexec-purgatory.o 115104382Sarchie