From af6852b98f011ac859e632f244a5c411a8f2292c Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Wed, 10 Sep 2014 10:20:19 -0700 Subject: [PATCH] Makefile: Preprocess linker scripts and other general improvements This patch started out as an attempt to run linker scripts through the preprocessor. However, since that required some more infrastructure changes, the build system is so intertwined, and there are so many other small issues that turned up and are easier to fix (and get running, and test thoroughly) in a single go, it turned out a little bigger. In order of appearance, it: - wraps direct linker invocations in a macro to avoid the widespread ifeq($(CONFIG_COMPILER_LLVM_CLANG),y) duplication. - introduces an $(generic-deps) (equivalent to $(-deps)) variable for targets that all files depend on - makes the $(src-to-obj) function usable in multiple places as the authoritative way to get an output file name (even if the respective source file is also under build/), and makes it preserve extensions on everything except %.c and %.S (e.g. %.ld and %.asl) - replaces the old $(-postprocess) with a single $(postprocessors) variable. The old ramstage-postprocess was weird because it contained unescaped $(eval ...)s, meaning it gets executed as soon as the variable is first substituted (and the other $(eval ...) in the toplevel Makefile does essentially nothing). The new mechanism is just $(eval ...)ed directly after the recursive parse with no further magic. Files can freely append their own (escaped) content to it and access variables valid in the calling context (like $(-objs)) directly. - enhances the existing $(--ccopts) mechanism with $(-generic-ccopts) and $(generic--ccopts) to reduce duplication. - makes .ld a type that can be added like a normal class file, causing it to be preprocessed with the correct #defines for the current class (needed for a follow-up feature). Migrates all linker scripts to this mechanism, which allows us to get rid of the weird $(ldoptions) mechanism (Kconfigs are replaced by preprocessor and no longer need to be defined as symbols). - removes duplicate $(INCLUDES) from $(CFLAGS) - repairs the crazy state of MIPS Makefiles, which seem to have been copied together from X86 despite having absolutely nothing in common with that architecture. They were using the same code to paste assembly pieces and linker scripts together without really needing it for anything, and even accidentally relied on a Kconfig default set in the arch/x86 subdirectory (I wish I was kidding). Changed them to work equivalent to the arm/arm64 Makefiles which are far closer related (also being SRAM-based platforms). - moves the x86-specifc $(OPTION_TABLES_H) into the x86 Makefile.inc and fixes an rule that would've had an empty target if it wasn't defined - removes the custom ldscript-gathering variables for x86 bootblock and romstage. The Makefile simply combines all .ld files that have been added to the respective class now. - uses the normal class build system to replace some of the custom rules for autogenerated bootblock/crt0 files on x86, and removes some hardcoded flags by using the normal $(...-ccopts) variables. - moves the handling of .asl files from the global Makefile.inc to x86. Changed to reuse the generic template for the preprocessing and C compilation steps. - removed the extra .o linking step before linking an rmodule for modules that don't require special linker flags (most of them). - removes the incorrect assumption that there was a global $(LDFLAGS) from the SMM Makefile.inc (it was named $(LDFLAGFS in one place so it couldn't have been all that important ;) ). - allow -j flag for parallel builds to be properly passed through to vboot child invocation by using special $(MAKE) variable. BUG=None TEST=Built for Falco, Nyan_Blaze, Stout, Rush_Ryu and Urara. Binary diffed old and new coreboot.rom (and some manually uncompressed stages), confirmed that images/stages are byte-for-byte identical except for some embedded timestamps and commit hashes. (Addresses in Falco/Stout ramstages shifting slightly due to different link order for ASL object files within their directory. Some addresses in Urara ramstage .rodata and some relocation entries in rmodules moved around due to linking them in fewer steps.) Change-Id: I50af7dacf616e0f8ff4c43f4acc679089ad7022b Signed-off-by: Julius Werner Reviewed-on: https://chromium-review.googlesource.com/219170 Reviewed-by: Aaron Durbin --- Makefile | 44 +++- Makefile.inc | 68 +----- src/arch/arm/Makefile.inc | 53 ++--- src/arch/arm/bootblock.ld | 3 +- src/arch/arm/ramstage.ld | 1 - src/arch/arm/romstage.ld | 6 - src/arch/arm64/Makefile.inc | 32 +-- src/arch/arm64/armv8/secmon/Makefile.inc | 19 +- src/arch/arm64/bootblock.ld | 1 - src/arch/arm64/ramstage.ld | 1 - src/arch/arm64/romstage.ld | 6 - src/arch/mips/Makefile.inc | 68 ++---- src/arch/mips/{bootblock.inc => bootblock.S} | 0 src/arch/x86/Makefile.inc | 205 +++++++++--------- .../{ldscript_failover.lb => failover.ld} | 0 src/arch/x86/lib/id.inc | 1 + src/arch/x86/lib/{id.lds => id.ld} | 0 src/arch/x86/ramstage.ld | 1 - src/console/Makefile.inc | 5 - src/cpu/intel/fit/{fit.lds => fit.ld} | 0 src/cpu/x86/16bit/{entry16.lds => entry16.ld} | 0 src/cpu/x86/16bit/{reset16.lds => reset16.ld} | 0 src/cpu/x86/32bit/{entry32.lds => entry32.ld} | 0 src/cpu/x86/Makefile.inc | 7 +- src/cpu/x86/smm/Makefile.inc | 43 ++-- src/drivers/pc80/Makefile.inc | 5 - src/lib/Makefile.inc | 44 +--- src/northbridge/intel/haswell/Makefile.inc | 2 - .../intel/sandybridge/Makefile.inc | 2 - src/northbridge/via/vx800/Makefile.inc | 3 +- .../via/vx800/{romstrap.lds => romstrap.ld} | 0 src/southbridge/nvidia/ck804/Makefile.inc | 4 +- src/southbridge/nvidia/ck804/nic.c | 2 +- .../ck804/{romstrap.lds => romstrap.ld} | 0 src/southbridge/nvidia/mcp55/Makefile.inc | 3 +- src/southbridge/nvidia/mcp55/nic.c | 2 +- .../mcp55/{romstrap.lds => romstrap.ld} | 0 src/southbridge/sis/sis966/Makefile.inc | 3 +- .../sis/sis966/{romstrap.lds => romstrap.ld} | 0 src/southbridge/via/k8t890/Makefile.inc | 3 +- .../via/k8t890/{romstrap.lds => romstrap.ld} | 0 src/vendorcode/google/chromeos/Makefile.inc | 21 +- 42 files changed, 253 insertions(+), 405 deletions(-) rename src/arch/mips/{bootblock.inc => bootblock.S} (100%) rename src/arch/x86/init/{ldscript_failover.lb => failover.ld} (100%) rename src/arch/x86/lib/{id.lds => id.ld} (100%) rename src/cpu/intel/fit/{fit.lds => fit.ld} (100%) rename src/cpu/x86/16bit/{entry16.lds => entry16.ld} (100%) rename src/cpu/x86/16bit/{reset16.lds => reset16.ld} (100%) rename src/cpu/x86/32bit/{entry32.lds => entry32.ld} (100%) rename src/northbridge/via/vx800/{romstrap.lds => romstrap.ld} (100%) rename src/southbridge/nvidia/ck804/{romstrap.lds => romstrap.ld} (100%) rename src/southbridge/nvidia/mcp55/{romstrap.lds => romstrap.ld} (100%) rename src/southbridge/sis/sis966/{romstrap.lds => romstrap.ld} (100%) rename src/southbridge/via/k8t890/{romstrap.lds => romstrap.ld} (100%) diff --git a/Makefile b/Makefile index 1812562d3f..159d9797ee 100644 --- a/Makefile +++ b/Makefile @@ -79,6 +79,9 @@ HOSTCXX = g++ HOSTCFLAGS := -g HOSTCXXFLAGS := -g +# Pass -undef to avoid predefined legacy macros like 'i386' +PREPROCESS_ONLY := -E -P -x assembler-with-cpp -undef + DOXYGEN := doxygen DOXYGEN_OUTPUT_DIR := doxygen @@ -115,10 +118,20 @@ include $(HAVE_DOTCONFIG) include toolchain.inc +COMMA:=, + +# Function to wrap calls to the linker (will be overridden for CLANG) +# $1 stage +# $2 objects to link (will be wrapped in --start-group and --end-group) +# $3 options passed directly (to GCC or LD) (-nostdlib and -static are default) +# $4 options passed to LD (wrapped with -Wl, for GCC) +link=$(CC_$(1)) $(CFLAGS_$(1)) -nostdlib -static $(3) $(foreach opt,$(4),-Wl$(COMMA)$(opt)) -Wl,--start-group $(2) -Wl,--end-group + ifneq ($(INNER_SCANBUILD),y) ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) CC:=clang -m32 -mno-mmx -mno-sse HOSTCC:=clang +link:=$(LD_$(1)) -nostdlib -static $(3) $(4) --start-group $(2) --end-group endif endif @@ -165,6 +178,12 @@ endif $(obj)/config.h: $(MAKE) oldconfig +# Dependencies that should be built before all files in all classes +generic-deps = $(obj)/config.h + +# Every file can append to this string. It is simply eval'ed after the scan. +postprocessors := + # Add a new class of source/object files to the build system add-class= \ $(eval $(1)-srcs:=) \ @@ -214,12 +233,16 @@ endif # Eliminate duplicate mentions of source files in a class $(foreach class,$(classes),$(eval $(class)-srcs:=$(sort $($(class)-srcs)))) -src-to-obj=$(addsuffix .$(1).o, $(basename $(patsubst src/%, $(obj)/%, $($(1)-srcs)))) -$(foreach class,$(classes),$(eval $(class)-objs:=$(call src-to-obj,$(class)))) +# Converts one or more source file paths to their corresponding build/ paths. +# Only .c and .S get converted to .o, other files (like .ld) keep their name. +# $1 stage name +# $2 file path (list) +src-to-obj=$(foreach file,$(2),$(basename $(patsubst src/%,$(obj)/%,$(file))).$(1)$(patsubst %.c,%.o,$(patsubst %.S,%.o,$(suffix $(file))))) + +$(foreach class,$(classes),$(eval $(class)-objs+=$(call src-to-obj,$(class),$($(class)-srcs)))) # Call post-processors if they're defined -$(foreach class,$(classes),\ - $(if $(value $(class)-postprocess),$(eval $(call $(class)-postprocess,$($(class)-objs))))) +$(eval $(postprocessors)) allsrcs:=$(foreach var, $(addsuffix -srcs,$(classes)), $($(var))) allobjs:=$(foreach var, $(addsuffix -objs,$(classes)), $($(var))) @@ -228,14 +251,14 @@ alldirs:=$(sort $(abspath $(dir $(allobjs)))) # macro to define template macros that are used by use_template macro define create_cc_template # $1 obj class -# $2 source suffix (c, S) +# $2 source suffix (c, S, ld) # $3 additional compiler flags # $4 additional dependencies ifn$(EMPTY)def $(1)-objs_$(2)_template de$(EMPTY)fine $(1)-objs_$(2)_template -$(obj)/$$(1).$(1).o: src/$$(1).$(2) $(obj)/config.h $(4) +$$(call src-to-obj,$1,$$(1)): $$(1) $$$$(generic-deps) $(4) @printf " CC $$$$(subst $$$$(obj)/,,$$$$(@))\n" - $(CC_$(1)) -MMD $$$$(CFLAGS_$(1)) $(3) -c -o $$$$@ $$$$< + $(CC_$(1)) -MMD $$$$(CFLAGS_$(1)) -MT $$$$(@) $(3) -c -o $$$$@ $$$$< en$(EMPTY)def end$(EMPTY)if endef @@ -243,16 +266,17 @@ endef filetypes-of-class=$(subst .,,$(sort $(suffix $($(1)-srcs)))) $(foreach class,$(classes), \ $(foreach type,$(call filetypes-of-class,$(class)), \ + $(eval $(class)-$(type)-ccopts += $(generic-$(type)-ccopts) $($(class)-generic-ccopts)) \ $(eval $(call create_cc_template,$(class),$(type),$($(class)-$(type)-ccopts),$($(class)-$(type)-deps))))) -foreach-src=$(foreach file,$($(1)-srcs),$(eval $(call $(1)-objs_$(subst .,,$(suffix $(file)))_template,$(subst src/,,$(basename $(file)))))) +foreach-src=$(foreach file,$($(1)-srcs),$(eval $(call $(1)-objs_$(subst .,,$(suffix $(file)))_template,$(file)))) $(eval $(foreach class,$(classes),$(call foreach-src,$(class)))) -DEPENDENCIES = $(allobjs:.o=.d) +DEPENDENCIES = $(addsuffix .d,$(basename $(allobjs))) -include $(DEPENDENCIES) printall: - @$(foreach class,$(classes),echo $(class)-objs:=$($(class)-objs); ) + @$(foreach class,$(classes),echo $(class)-objs=$($(class)-objs); ) @echo alldirs:=$(alldirs) @echo allsrcs=$(allsrcs) @echo DEPENDENCIES=$(DEPENDENCIES) diff --git a/Makefile.inc b/Makefile.inc index 2b4d33ed0c..d119754476 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -41,7 +41,7 @@ export objgenerated := $(obj)/generated ####################################################################### # root rule to resolve if in build mode (ie. configuration exists) -real-target: $(obj)/config.h coreboot +real-target: coreboot coreboot: build-dirs $(obj)/coreboot.rom ####################################################################### @@ -95,17 +95,12 @@ files-in-dir=$(filter-out $(call dir-wildcards,$(call filter-out-dirs,$(1),$(dir ####################################################################### # reduce command line length by linking the objects of each # directory into an intermediate file -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) -LINK=$(LD_ramstage) -else -LINK=$(CC_ramstage) $(CFLAGS_ramstage) -endif -ramstage-postprocess=$(foreach d,$(sort $(dir $(1))), \ - $(eval $(d)ramstage.o: $(call files-in-dir,$(d),$(1)); $$(LINK) -o $$@ -r $$^ ) \ - $(eval ramstage-objs:=$(d)ramstage.o $(filter-out $(call files-in-dir,$(d),$(1)),$(ramstage-objs)))) +postprocessors += $$(foreach d,$$(sort $$(dir $$(filter %.o %.a,$$(ramstage-objs)))), \ + $$(eval $$(d)ramstage.o: $$(call files-in-dir,$$(d),$$(ramstage-objs)); $$$$(call link,ramstage,$$$$(filter %.o %.a,$$$$(^)),-o $$$$(@),-r)) \ + $$(eval ramstage-objs:=$$(d)ramstage.o $$(filter-out $$(call files-in-dir,$$(d),$$(filter %.o %.a,$$(ramstage-objs))),$$(ramstage-objs)))) -romstage-c-ccopts:=-D__PRE_RAM__ -romstage-S-ccopts:=-D__PRE_RAM__ +bootblock-generic-ccopts += -D__PRE_RAM__ -D__BOOT_BLOCK__ +romstage-generic-ccopts += -D__PRE_RAM__ ifeq ($(CONFIG_TRACE),y) ramstage-c-ccopts:= -finstrument-functions endif @@ -117,38 +112,8 @@ ifeq ($(CONFIG_USE_BLOBS),y) forgetthis:=$(shell git submodule update --init --checkout 3rdparty) endif -bootblock-c-ccopts:=-D__BOOT_BLOCK__ -D__PRE_RAM__ -bootblock-S-ccopts:=-D__BOOT_BLOCK__ -D__PRE_RAM__ - -smmstub-c-ccopts:=-D__SMM__ -smmstub-S-ccopts:=-D__SMM__ -smm-c-ccopts:=-D__SMM__ -smm-S-ccopts:=-D__SMM__ - -# SMM TSEG base is dynamic -ifneq ($(CONFIG_SMM_MODULES),y) -ifeq ($(CONFIG_SMM_TSEG),y) -smm-c-ccopts += -fpic -endif -endif - -ramstage-c-deps:=$$(OPTION_TABLE_H) -romstage-c-deps:=$$(OPTION_TABLE_H) -verstage-c-deps:=$$(OPTION_TABLE_H) -bootblock-c-deps:=$$(OPTION_TABLE_H) - -####################################################################### -# Add handler to compile ACPI's ASL -define ramstage-objs_asl_template -$(obj)/$(1).ramstage.o: src/$(1).asl $(obj)/config.h - @printf " IASL $$(subst $(top)/,,$$(@))\n" - $(CC_ramstage) -x assembler-with-cpp -E -MMD -MT $$(@) -D__ACPI__ -P -include $(src)/include/kconfig.h -I$(obj) -I$(src) -I$(src)/include -I$(src)/arch/$(ARCHDIR-$(ARCH-RAMSTAGE-y))/include -I$(src)/mainboard/$(MAINBOARDDIR) $$< -o $$(basename $$@).asl - cd $$(dir $$@); $(IASL) -p $$(notdir $$@) -tc $$(notdir $$(basename $$@)).asl - mv $$(basename $$@).hex $$(basename $$@).c - $(CC_ramstage) $$(CFLAGS_ramstage) $$(if $$(subst dsdt,,$$(basename $$(notdir $(1)))), -DAmlCode=AmlCode_$$(basename $$(notdir $(1)))) -c -o $$@ $$(basename $$@).c - # keep %.o: %.c rule from catching the temporary .c file after a make clean - mv $$(basename $$@).c $$(basename $$@).hex -endef +# Linker scripts are just preprocessed, not compiled +generic-ld-ccopts += $(PREPROCESS_ONLY) ####################################################################### # Parse plaintext cmos defaults into binary format @@ -212,7 +177,7 @@ INCLUDES += -Isrc/device/oprom/include # abspath is a workaround for romcc INCLUDES += -include $(src)/include/kconfig.h -CFLAGS_common = $(INCLUDES) -pipe -g -nostdinc +CFLAGS_common = -pipe -g -nostdinc CFLAGS_common += -nostdlib -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes CFLAGS_common += -Wwrite-strings -Wredundant-decls -Wno-trigraphs CFLAGS_common += -Wstrict-aliasing -Wshadow @@ -253,8 +218,7 @@ $(obj)/build.h: .xcompile printf "#endif\n" >> $(obj)/build.ht mv $(obj)/build.ht $(obj)/build.h -$(obj)/ldoptions: $(obj)/config.h - awk '/^#define ([^"])* ([^"])*$$/ {gsub("\\r","",$$3); print $$2 " = " $$3 ";";}' $< > $@ +generic-deps += $(obj)/build.h build-dirs: mkdir -p $(objcbfs) $(objgenerated) @@ -311,18 +275,6 @@ $(objutil)/%.o: $(objutil)/%.c @printf " HOSTCC $(subst $(objutil)/,,$(@))\n" $(HOSTCC) -MMD -I$(subst $(objutil)/,util/,$(dir $<)) -I$(dir $<) $(HOSTCFLAGS) -c -o $@ $< -$(obj)/%.ramstage.o $(abspath $(obj))/%.ramstage.o: $(obj)/%.c $(obj)/config.h $(OPTION_TABLE_H) - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_ramstage) -MMD $(CFLAGS_ramstage) $(ramstage-c-ccopts) -c -o $@ $< - -$(obj)/%.romstage.o $(abspath $(obj))/%.romstage.o: $(obj)/%.c $(obj)/config.h $(OPTION_TABLE_H) - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_romstage) -MMD $(CFLAGS_romstage) $(romstage-c-ccopts) -c -o $@ $< - -$(obj)/%.bootblock.o $(abspath $(obj))/%.bootblock.o: $(obj)/%.c $(obj)/config.h $(OPTION_TABLE_H) - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_bootblock) -MMD $(CFLAGS_bootblock) $(bootblock-c-ccopts) -c -o $@ $< - ####################################################################### # Clean up rules clean-abuild: diff --git a/src/arch/arm/Makefile.inc b/src/arch/arm/Makefile.inc index ef9ec90cae..9d3b5365d5 100644 --- a/src/arch/arm/Makefile.inc +++ b/src/arch/arm/Makefile.inc @@ -46,38 +46,27 @@ bootblock-y += div0.c bootblock-$(CONFIG_BOOTBLOCK_CONSOLE) += early_console.c bootblock-y += id.S bootblock-y += clock.c - -$(obj)/arch/arm/id.bootblock.o: $(obj)/build.h - bootblock-y += stages.c bootblock-y += eabi_compat.c bootblock-y += memset.S bootblock-y += memcpy.S bootblock-y += memmove.S -$(objcbfs)/bootblock.debug: $(src)/arch/arm/bootblock.ld $(obj)/ldoptions $$(bootblock-objs) $(obj)/config.h - @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_bootblock) -nostdlib -m armelf_linux_eabi --gc-sections -static -o $@ -L$(obj) $< -T $(src)/arch/arm/bootblock.ld -else - # This is based on the assumption that bootblock and verstage are compatible - # from the linker's perspective. - $(CC_bootblock) $(CFLAGS_bootblock) -nostdlib -Wl,--gc-sections -static -o $@ -L$(obj) -T $(src)/arch/arm/bootblock.ld -Wl,--start-group $(bootblock-objs) -Wl,--end-group -endif +bootblock-y += bootblock.ld -endif +$(objcbfs)/bootblock.debug: $$(bootblock-objs) + @printf " LINK $(subst $(obj)/,,$(@))\n" + $(call link,bootblock,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/arm/bootblock.bootblock.ld,--gc-sections) + +endif # CONFIG_ARCH_BOOTBLOCK_ARM ############################################################################### # verification stage ############################################################################### -$(objcbfs)/verstage.debug: $$(verstage-objs) $(src)/arch/arm/verstage.ld $(obj)/ldoptions $$(VB2_LIB) +$(objcbfs)/verstage.debug: $$(verstage-objs) $$(VB2_LIB) @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_verstage) -nostdlib --gc-sections -static -o $@ -L$(obj) $(verstage-objs) -T $(src)/arch/arm/verstage.ld -else - $(CC_verstage) $(CFLAGS_verstage) -nostdlib -Wl,--gc-sections -static -o $@ -L$(obj) -T $(src)/arch/arm/verstage.ld -Wl,--start-group $(verstage-objs) $(VB2_LIB) -Wl,--end-group -endif + $(call link,verstage,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/arm/verstage.verstage.ld,--gc-sections) verstage-$(CONFIG_EARLY_CONSOLE) += early_console.c verstage-y += div0.c @@ -87,6 +76,8 @@ verstage-y += memcpy.S verstage-y += memmove.S verstage-y += stages.c +verstage-y += verstage.ld + ############################################################################### # romstage ############################################################################### @@ -108,17 +99,15 @@ rmodules_arm-y += memcpy.S rmodules_arm-y += memmove.S rmodules_arm-y += eabi_compat.c +romstage-y += romstage.ld + VBOOT_STUB_DEPS += $(obj)/arch/arm/eabi_compat.rmodules_arm.o -$(objcbfs)/romstage.debug: $$(romstage-objs) $(src)/arch/arm/romstage.ld $(obj)/ldoptions +$(objcbfs)/romstage.debug: $$(romstage-objs) @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_romstage) -nostdlib --gc-sections -static -o $@ -L$(obj) $(romstage-objs) -T $(src)/arch/arm/romstage.ld -else - $(CC_romstage) $(CFLAGS_romstage) -nostdlib -Wl,--gc-sections -static -o $@ -L$(obj) -T $(src)/arch/arm/romstage.ld -Wl,--start-group $(romstage-objs) -Wl,--end-group -endif + $(call link,romstage,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/arm/romstage.romstage.ld,--gc-sections) -endif +endif # CONFIG_ARCH_ROMSTAGE_ARM ############################################################################### # ramstage @@ -137,6 +126,8 @@ ramstage-y += memcpy.S ramstage-y += memmove.S ramstage-y += clock.c +ramstage-y += ramstage.ld + rmodules_arm-y += memset.S rmodules_arm-y += memcpy.S rmodules_arm-y += memmove.S @@ -146,12 +137,8 @@ ramstage-$(CONFIG_COLLECT_TIMESTAMPS) += timestamp.c ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/mainboard.c -$(objcbfs)/ramstage.debug: $$(ramstage-objs) $(src)/arch/arm/ramstage.ld $(obj)/ldoptions +$(objcbfs)/ramstage.debug: $$(ramstage-objs) @printf " CC $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_ramstage) -nostdlib -m armelf_linux_eabi --gc-sections -o $@ --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 --wrap __uidiv --start-group $(ramstage-objs) --end-group -T $(src)/arch/arm/ramstage.ld -else - $(CC_ramstage) $(CFLAGS_ramstage) -nostdlib -Wl,--gc-sections -static -o $@ -L$(obj) -Wl,--start-group $(ramstage-objs) -Wl,--end-group -T $(src)/arch/arm/ramstage.ld -endif + $(call link,ramstage,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/arm/ramstage.ramstage.ld,--gc-sections) -endif +endif # CONFIG_ARCH_RAMSTAGE_ARM diff --git a/src/arch/arm/bootblock.ld b/src/arch/arm/bootblock.ld index 0d1cf754a7..73034cc2de 100644 --- a/src/arch/arm/bootblock.ld +++ b/src/arch/arm/bootblock.ld @@ -21,7 +21,6 @@ /* We use ELF as output format. So that we can debug the code in some form. */ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) -INCLUDE ldoptions PHDRS { @@ -59,4 +58,4 @@ SECTIONS *(.note.*) *(.ARM.*) } -} \ No newline at end of file +} diff --git a/src/arch/arm/ramstage.ld b/src/arch/arm/ramstage.ld index 48f4e78eef..5144f4d2b1 100644 --- a/src/arch/arm/ramstage.ld +++ b/src/arch/arm/ramstage.ld @@ -20,7 +20,6 @@ */ /* We use ELF as output format. So that we can debug the code in some form. */ -INCLUDE ldoptions PHDRS { diff --git a/src/arch/arm/romstage.ld b/src/arch/arm/romstage.ld index 17123ef0a4..982ab81651 100644 --- a/src/arch/arm/romstage.ld +++ b/src/arch/arm/romstage.ld @@ -19,15 +19,9 @@ * 2005.12 yhlu add ramstage cross the vga font buffer handling */ -/* We use ELF as output format. So that we can debug the code in some form. */ -/* - INCLUDE ldoptions - */ - /* We use ELF as output format. So that we can debug the code in some form. */ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) -INCLUDE ldoptions PHDRS { diff --git a/src/arch/arm64/Makefile.inc b/src/arch/arm64/Makefile.inc index 640871ba30..7ef25ec757 100644 --- a/src/arch/arm64/Makefile.inc +++ b/src/arch/arm64/Makefile.inc @@ -47,8 +47,6 @@ bootblock-y += div0.c bootblock-$(CONFIG_BOOTBLOCK_CONSOLE) += early_console.c bootblock-y += id.S -$(obj)/arch/arm64/id.bootblock.o: $(obj)/build.h - bootblock-y += c_entry.c bootblock-y += stage_entry.S bootblock-y += stages.c @@ -59,15 +57,13 @@ bootblock-y += ../../lib/memset.c bootblock-y += ../../lib/memcpy.c bootblock-y += ../../lib/memmove.c +bootblock-y += bootblock.ld + # Build the bootblock -$(objcbfs)/bootblock.debug: $(src)/arch/arm64/bootblock.ld $(obj)/ldoptions $$(bootblock-objs) $(obj)/config.h +$(objcbfs)/bootblock.debug: $$(bootblock-objs) @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_bootblock) -nostdlib -m armelf_linux_eabi --gc-sections -static -o $@ -L$(obj) $< -T $(src)/arch/arm64/bootblock.ld -else - $(CC_bootblock) $(CFLAGS_bootblock) -nostdlib -Wl,--gc-sections -static -o $@ -L$(obj) -T $(src)/arch/arm64/bootblock.ld -Wl,--start-group $(bootblock-objs) -Wl,--end-group -endif + $(call link,bootblock,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/arm64/bootblock.bootblock.ld,--gc-sections) endif # CONFIG_ARCH_BOOTBLOCK_ARM64 @@ -89,6 +85,8 @@ romstage-y += ../../lib/memmove.c romstage-$(CONFIG_COLLECT_TIMESTAMPS) += timestamp.c romstage-y += transition.c transition_asm.S +romstage-y += romstage.ld + rmodules_arm64-y += ../../lib/memset.c rmodules_arm64-y += ../../lib/memcpy.c rmodules_arm64-y += ../../lib/memmove.c @@ -98,13 +96,9 @@ VBOOT_STUB_DEPS += $(obj)/arch/arm64/eabi_compat.rmodules_arm64.o # Build the romstage -$(objcbfs)/romstage.debug: $$(romstage-objs) $(src)/arch/arm64/romstage.ld $(obj)/ldoptions +$(objcbfs)/romstage.debug: $$(romstage-objs) @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_romstage) -nostdlib --gc-sections -static -o $@ -L$(obj) $(romstage-objs) -T $(src)/arch/arm64/romstage.ld -else - $(CC_romstage) $(CFLAGS_romstage) -nostdlib -Wl,--gc-sections -static -o $@ -L$(obj) -T $(src)/arch/arm64/romstage.ld -Wl,--start-group $(romstage-objs) -Wl,--end-group -endif + $(call link,romstage,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/arm64/romstage.romstage.ld,--gc-sections) endif # CONFIG_ARCH_ROMSTAGE_ARM64 @@ -129,6 +123,8 @@ ramstage-y += stage_entry.S ramstage-$(CONFIG_ARCH_SPINTABLE) += spintable.c spintable_asm.S ramstage-y += transition.c transition_asm.S +ramstage-y += ramstage.ld + rmodules_arm64-y += ../../lib/memset.c rmodules_arm64-y += ../../lib/memcpy.c rmodules_arm64-y += ../../lib/memmove.c @@ -145,12 +141,8 @@ ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/mainboard.c # Build the ramstage -$(objcbfs)/ramstage.debug: $$(ramstage-objs) $(src)/arch/arm64/ramstage.ld $(obj)/ldoptions +$(objcbfs)/ramstage.debug: $$(ramstage-objs) @printf " CC $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_ramstage) -nostdlib -m armelf_linux_eabi --gc-sections -o $@ --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 --wrap __uidiv --start-group $(ramstage-objs) --end-group -T $(src)/arch/arm64/ramstage.ld -else - $(CC_ramstage) $(CFLAGS_ramstage) -nostdlib -Wl,--gc-sections -static -o $@ -L$(obj) -Wl,--start-group $(ramstage-objs) -Wl,--end-group -T $(src)/arch/arm64/ramstage.ld -endif + $(call link,ramstage,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/arm64/ramstage.ramstage.ld,--gc-sections) endif # CONFIG_ARCH_RAMSTAGE_ARM64 diff --git a/src/arch/arm64/armv8/secmon/Makefile.inc b/src/arch/arm64/armv8/secmon/Makefile.inc index 1c7a696e66..21fabee19e 100644 --- a/src/arch/arm64/armv8/secmon/Makefile.inc +++ b/src/arch/arm64/armv8/secmon/Makefile.inc @@ -22,14 +22,14 @@ $(eval $(call create_class_compiler,secmon,arm64)) SECMON_DIR=$(obj)/arch/arm64/armv8/secmon -SECMON_SRC=$(SECMON_DIR)/secmon -SECMON_OBJ=$(SECMON_DIR)/secmon.o +SECMON_BIN=$(SECMON_DIR)/secmon SECMON_ELF=$(SECMON_DIR)/secmon.elf SECMON_RMOD=$(SECMON_DIR)/secmon.elf.rmod SECMON_RAMSTAGE=$(SECMON_DIR)/secmon.ramstage.o -secmon-c-ccopts += -I$(src)/arch/arm64/include/armv8/ -include $(src)/include/kconfig.h -D__SECMON__ -secmon-S-ccopts += -I$(src)/arch/arm64/include/armv8/ -include $(src)/include/kconfig.h -D__SECMON__ +secmon-generic-ccopts += -D__SECMON__ +secmon-c-ccopts += $(armv8_flags) +secmon-S-ccopts += $(armv8_asm_flags) secmon-y += secmon_init.c secmon-y += psci.c @@ -39,16 +39,13 @@ secmon-y += ../exception.c secmon-y += ../../cpu.c secmon-y += ../../transition_asm.S ../../transition.c -ramstage-srcs += $(SECMON_SRC) +ramstage-objs += $(SECMON_RAMSTAGE) -$(SECMON_OBJ): $$(secmon-objs) - $(CC_secmon) $(LDFLAGS) -nostdlib -r -o $@ $^ +$(eval $(call rmodule_link,$(SECMON_ELF), $$$$(secmon-objs), 0,arm64)) -$(eval $(call rmodule_link,$(SECMON_ELF), $(SECMON_OBJ), 0,arm64)) - -$(SECMON_SRC): $(SECMON_RMOD) +$(SECMON_BIN): $(SECMON_RMOD) $(OBJCOPY_secmon) -O binary $< $@ -$(SECMON_RAMSTAGE): $(SECMON_SRC) +$(SECMON_RAMSTAGE): $(SECMON_BIN) @printf " OBJCOPY $(subst $(obj)/,,$(@))\n" cd $(dir $@); $(OBJCOPY_secmon) -I binary $(notdir $<) -O elf64-littleaarch64 -B aarch64 $(notdir $@) diff --git a/src/arch/arm64/bootblock.ld b/src/arch/arm64/bootblock.ld index 93989637bd..191a5e0d24 100644 --- a/src/arch/arm64/bootblock.ld +++ b/src/arch/arm64/bootblock.ld @@ -21,7 +21,6 @@ /* We use ELF as output format. So that we can debug the code in some form. */ OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64") OUTPUT_ARCH(aarch64) -INCLUDE ldoptions PHDRS { diff --git a/src/arch/arm64/ramstage.ld b/src/arch/arm64/ramstage.ld index 8a730e0b95..14ccf17391 100644 --- a/src/arch/arm64/ramstage.ld +++ b/src/arch/arm64/ramstage.ld @@ -21,7 +21,6 @@ */ /* We use ELF as output format. So that we can debug the code in some form. */ -INCLUDE ldoptions ENTRY(stage_entry) diff --git a/src/arch/arm64/romstage.ld b/src/arch/arm64/romstage.ld index 05432db9e3..1feb4d852b 100644 --- a/src/arch/arm64/romstage.ld +++ b/src/arch/arm64/romstage.ld @@ -19,15 +19,9 @@ * 2005.12 yhlu add ramstage cross the vga font buffer handling */ -/* We use ELF as output format. So that we can debug the code in some form. */ -/* - INCLUDE ldoptions - */ - /* We use ELF as output format. So that we can debug the code in some form. */ OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64") OUTPUT_ARCH(aarch64) -INCLUDE ldoptions PHDRS { diff --git a/src/arch/mips/Makefile.inc b/src/arch/mips/Makefile.inc index 3d114ece9a..2fca6952d4 100644 --- a/src/arch/mips/Makefile.inc +++ b/src/arch/mips/Makefile.inc @@ -35,16 +35,15 @@ endif ifeq ($(CONFIG_ARCH_BOOTBLOCK_MIPS),y) bootblock-y += boot.c +bootblock-y += bootblock.S +bootblock-y += bootblock_simple.c bootblock-$(CONFIG_BOOTBLOCK_CONSOLE) += early_console.c bootblock-y += stages.c bootblock-y += ../../lib/memcpy.c bootblock-y += ../../lib/memmove.c bootblock-y += ../../lib/memset.c -bootblock_lds = $(src)/arch/mips/bootblock.ld - -bootblock_inc += $(src)/arch/mips/bootblock.inc -bootblock_inc += $(objgenerated)/bootblock.inc +bootblock-y += bootblock.ld # Much of the assembly code is generated by the compiler, and may contain # terms which the preprocessor will happily go on to replace. For example @@ -52,35 +51,9 @@ bootblock_inc += $(objgenerated)/bootblock.inc # prevent that. bootblock-S-ccopts += -undef -$(objgenerated)/bootblock.ld: $$(bootblock_lds) $(obj)/ldoptions - @printf " GEN $(subst $(obj)/,,$(@))\n" - printf '$(foreach ldscript,ldoptions $(bootblock_lds),INCLUDE "$(ldscript)"\n)' > $@ - -$(objgenerated)/bootblock_inc.S: $$(bootblock_inc) - @printf " GEN $(subst $(obj)/,,$(@))\n" - printf '$(foreach crt0,$(bootblock_inc),#include "$(crt0)"\n)' > $@ - -$(objgenerated)/bootblock.o: $(objgenerated)/bootblock.s - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_bootblock) $(bootblock-S-ccopts) -Wa,-acdlns -c -o $@ $< > $(basename $@).disasm - -$(objgenerated)/bootblock.s: $(objgenerated)/bootblock_inc.S $(obj)/config.h $(obj)/build.h - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_bootblock) $(bootblock-S-ccopts) -MMD -x assembler-with-cpp -E \ - -I$(src)/include -I$(src)/arch/mips/include -I$(obj) \ - -include $(obj)/build.h -include $(obj)/config.h -I. \ - -I$(src) $< -o $@ - -$(objgenerated)/bootblock.inc: $(src)/arch/mips/$(subst ",,$(CONFIG_BOOTBLOCK_SOURCE)) $(bootblock_custom) $(obj)/config.h - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_bootblock) $(bootblock-c-ccopts) $(CFLAGS_bootblock) -MM \ - -MT$(objgenerated)/bootblock.inc \ - $< > $(objgenerated)/bootblock.inc.d - $(CC_bootblock) $(bootblock-c-ccopts) -c -S $(CFLAGS_bootblock) -I. $< -o $@ - -$(objcbfs)/bootblock.debug: $(objgenerated)/bootblock.o $(objgenerated)/bootblock.ld $$(bootblock-objs) $(obj)/config.h +$(objcbfs)/bootblock.debug: $$(bootblock-objs) @printf " LINK $(subst $(obj)/,,$(@))\n" - $(CC_bootblock) $(CFLAGS_bootblock) -nostdlib -Wl,--gc-sections -nostartfiles -include $(obj)/config.h -static -o $@ -L$(obj) -T $(objgenerated)/bootblock.ld -Wl,--start-group $(objgenerated)/bootblock.o $(bootblock-objs) -Wl,--end-group + $(call link,bootblock,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/mips/bootblock.bootblock.ld,--gc-sections) endif # CONFIG_ARCH_BOOTBLOCK_MIPS @@ -97,17 +70,11 @@ romstage-y += ../../lib/memcpy.c romstage-y += ../../lib/memmove.c romstage-y += ../../lib/memset.c -romstage-lds = $(src)/arch/mips/romstage.ld +romstage-y += romstage.ld -$(objcbfs)/romstage.debug: $$(romstage-objs) $(objgenerated)/romstage.ld +$(objcbfs)/romstage.debug: $$(romstage-objs) @printf " LINK $(subst $(obj)/,,$(@))\n" - $(CC_romstage) -nostdlib -Wl,--gc-sections -nostartfiles -static -o $@ -L$(obj) -T $(objgenerated)/romstage.ld -Wl,--start-group $(romstage-objs) -Wl,--end-group - -$(objgenerated)/romstage.ld: $$(romstage-lds) $(obj)/ldoptions - @printf " GEN $(subst $(obj)/,,$(@))\n" - rm -f $@ - printf '$(foreach ldscript,ldoptions $(romstage-lds),INCLUDE "$(ldscript:$(obj)/%=%)"\n)' >> $@.tmp - mv $@.tmp $@ + $(call link,romstage,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/mips/romstage.romstage.ld,--gc-sections) endif # CONFIG_ARCH_ROMSTAGE_MIPS @@ -124,22 +91,13 @@ ramstage-y += tables.c ramstage-y += ../../lib/memcpy.c ramstage-y += ../../lib/memmove.c ramstage-y += ../../lib/memset.c + +ramstage-y += ramstage.ld + ramstage-srcs += $(wildcard src/mainboard/$(MAINBOARDDIR)/mainboard.c) -ramstage-lds = $(src)/arch/mips/ramstage.ld - -$(objgenerated)/ramstage.ld: $$(ramstage-lds) $(obj)/ldoptions - @printf " GEN $(subst $(obj)/,,$(@))\n" - rm -f $@ - printf '$(foreach ldscript,ldoptions $(ramstage-lds),INCLUDE "$(ldscript:$(obj)/%=%)"\n)' >> $@.tmp - mv $@.tmp $@ - -$(objcbfs)/ramstage.debug: $(objgenerated)/ramstage.o $(objgenerated)/ramstage.ld +$(objcbfs)/ramstage.debug: $$(ramstage-objs) @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_ramstage) -nostdlib -Wl,--gc-sections -nostartfiles -static -o $@ -L$(obj) -T $(objgenerated)/ramstage.ld $< - -$(objgenerated)/ramstage.o: $$(ramstage-objs) - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_ramstage) $(CFLAGS_ramstage) -nostdlib -r -o $@ -Wl,--start-group $(ramstage-objs) -Wl,--end-group + $(call link,ramstage,$(filter %.a %.o,$(^)),-o $(@) -L$(obj) -T $(obj)/arch/mips/ramstage.ramstage.ld,--gc-sections) endif # CONFIG_ARCH_RAMSTAGE_MIPS diff --git a/src/arch/mips/bootblock.inc b/src/arch/mips/bootblock.S similarity index 100% rename from src/arch/mips/bootblock.inc rename to src/arch/mips/bootblock.S diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc index 4cfa9ad316..df6b3081d7 100644 --- a/src/arch/x86/Makefile.inc +++ b/src/arch/x86/Makefile.inc @@ -27,14 +27,31 @@ subdirs-y += boot subdirs-y += lib subdirs-y += smp +################################################################################ +# i386 specific tools +################################################################################ + +NVRAMTOOL:=$(objutil)/nvramtool/nvramtool + OPTION_TABLE_H:= ifeq ($(CONFIG_HAVE_OPTION_TABLE),y) + cbfs-files-y += cmos_layout.bin cmos_layout.bin-file = $(obj)/cmos_layout.bin cmos_layout.bin-type = 0x01aa +$(obj)/cmos_layout.bin: $(NVRAMTOOL) $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout + @printf " OPTION $(subst $(obj)/,,$(@))\n" + $(NVRAMTOOL) -y $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout -L $@ + OPTION_TABLE_H:=$(obj)/option_table.h -endif +generic-deps += $(OPTION_TABLE_H) + +$(OPTION_TABLE_H): $(NVRAMTOOL) $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout + @printf " OPTION $(subst $(obj)/,,$(@))\n" + $(NVRAMTOOL) -y $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout -H $@ + +endif # CONFIG_HAVE_OPTION_TABLE ################################################################################ # X86 specific options @@ -45,6 +62,8 @@ CBFSTOOL_PRE1_OPTS = -m x86 -o $$(( $(CONFIG_ROM_SIZE) - $(CONFIG_CBFS_SIZE) )) CBFSTOOL_PRE_OPTS = -b $(shell cat $(objcbfs)/base_xip.txt) endif +LIBGCC_WRAP_LDFLAGS := --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 + stripped_vgabios_id = $(call strip_quotes,$(CONFIG_VGA_BIOS_ID)) cbfs-files-$(CONFIG_VGA_BIOS) += pci$(stripped_vgabios_id).rom pci$(stripped_vgabios_id).rom-file := $(call strip_quotes,$(CONFIG_VGA_BIOS_FILE)) @@ -58,33 +77,20 @@ cbfs-files-$(CONFIG_BOOTSPLASH) += bootsplash.jpg bootsplash.jpg-file := $(call strip_quotes,$(CONFIG_BOOTSPLASH_FILE)) bootsplash.jpg-type := bootsplash -################################################################################ -# i386 specific tools - -NVRAMTOOL:=$(objutil)/nvramtool/nvramtool - -$(OPTION_TABLE_H): $(NVRAMTOOL) $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout - @printf " OPTION $(subst $(obj)/,,$(@))\n" - $(NVRAMTOOL) -y $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout -H $@ - -$(obj)/cmos_layout.bin: $(NVRAMTOOL) $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout - @printf " OPTION $(subst $(obj)/,,$(@))\n" - $(NVRAMTOOL) -y $(top)/src/mainboard/$(MAINBOARDDIR)/cmos.layout -L $@ - ############################################################################### # bootblock ############################################################################### ifeq ($(CONFIG_ARCH_BOOTBLOCK_X86_32),y) -bootblock_lds = $(src)/arch/x86/init/ldscript_failover.lb -bootblock_lds += $(src)/cpu/x86/16bit/entry16.lds -bootblock_lds += $(src)/cpu/x86/16bit/reset16.lds -bootblock_lds += $(src)/arch/x86/lib/id.lds -bootblock_lds += $(chipset_bootblock_lds) +bootblock-srcs += $(src)/arch/x86/init/failover.ld +bootblock-srcs += $(src)/cpu/x86/16bit/entry16.ld +bootblock-srcs += $(src)/cpu/x86/16bit/reset16.ld +bootblock-srcs += $(src)/arch/x86/lib/id.ld ifeq ($(CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE),y) -bootblock_lds += $(src)/cpu/intel/fit/fit.lds +bootblock-srcs += $(src)/cpu/intel/fit/fit.ld endif +# TODO: Why can't this use the real bootblock-y += xxx.S mechanism instead? bootblock_inc = $(src)/arch/x86/init/prologue.inc bootblock_inc += $(src)/cpu/x86/16bit/entry16.inc bootblock_inc += $(src)/cpu/x86/16bit/reset16.inc @@ -101,42 +107,36 @@ endif bootblock_inc += $(objgenerated)/bootblock.inc bootblock_inc += $(src)/arch/x86/lib/walkcbfs.S -bootblock_romccflags := -mcpu=i386 -O2 -D__PRE_RAM__ ifeq ($(CONFIG_SSE),y) -bootblock_romccflags := -mcpu=k7 -msse -O2 -D__PRE_RAM__ +bootblock_romccflags = -mcpu=k7 -msse +else +bootblock_romccflags = -mcpu=i386 endif +bootblock_romccflags += -O2 $(bootblock-c-ccopts) $(bootblock-generic-ccopts) -$(objgenerated)/bootblock.ld: $$(bootblock_lds) $(obj)/ldoptions - @printf " GEN $(subst $(obj)/,,$(@))\n" - printf '$(foreach ldscript,ldoptions $(bootblock_lds),INCLUDE "$(ldscript)"\n)' > $@ - -$(objgenerated)/bootblock_inc.S: $$(bootblock_inc) - @printf " GEN $(subst $(obj)/,,$(@))\n" - printf '$(foreach crt0,$(bootblock_inc),#include "$(crt0)"\n)' > $@ - -$(objgenerated)/bootblock.o: $(objgenerated)/bootblock.s - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_bootblock) -Wa,-acdlns -c -o $@ $< > $(basename $@).disasm - -$(objgenerated)/bootblock.s: $(objgenerated)/bootblock_inc.S $(obj)/config.h $(obj)/build.h - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_bootblock) -MMD -x assembler-with-cpp -E -I$(src)/include -I$(src)/arch/x86/include -I$(obj) -include $(obj)/build.h -include $(obj)/config.h -I. -I$(src) $< -o $@ - -$(objgenerated)/bootblock.inc: $(src)/arch/x86/init/$(subst ",,$(CONFIG_BOOTBLOCK_SOURCE)) $(objutil)/romcc/romcc $(OPTION_TABLE_H) $(obj)/config.h +$(objgenerated)/bootblock.inc: $(src)/arch/x86/init/$(subst ",,$(CONFIG_BOOTBLOCK_SOURCE)) $(objutil)/romcc/romcc $$(generic-deps) @printf " ROMCC $(subst $(obj)/,,$(@))\n" $(CC_bootblock) $(INCLUDES) $(INCLUDES_bootblock) -MM -MT$(objgenerated)/bootblock.inc \ $< > $(objgenerated)/bootblock.inc.d $(ROMCC) -c -S $(bootblock_romccflags) -I. $(INCLUDES) $(INCLUDES_bootblock) $< -o $@ -$(objcbfs)/bootblock.debug: $(objgenerated)/bootblock.o $(objgenerated)/bootblock.ld - @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_bootblock) -m elf_i386 -static -o $@.tmp -L$(obj) $< -T $(objgenerated)/bootblock.ld -else - $(CC_bootblock) $(CFLAGS_bootblock) -nostartfiles -static -o $@ -L$(obj) -T $(objgenerated)/bootblock.ld $< -endif +$(objgenerated)/bootblock.ld: $$(filter %.ld,$$(bootblock-objs)) + @printf " GEN $(subst $(obj)/,,$(@))\n" + printf '$(foreach ldscript,$(^),INCLUDE "$(ldscript)"\n)' > $@ -endif +$(objgenerated)/bootblock.S: $$(bootblock_inc) + @printf " GEN $(subst $(obj)/,,$(@))\n" + printf '$(foreach inc,$(bootblock_inc),#include "$(inc)"\n)' > $@ + +bootblock-srcs += $(objgenerated)/bootblock.S + +bootblock-S-ccopts += -I. -Wa,-acdlns=$$$$(basename $$$$(@)).disasm + +$(objcbfs)/bootblock.debug: $(objgenerated)/bootblock.bootblock.o $(objgenerated)/bootblock.ld + @printf " LINK $(subst $(obj)/,,$(@))\n" + $(call link,bootblock,$(<),-o $(@) -L$(obj) -T $(objgenerated)/bootblock.ld,) + +endif #CONFIG_ARCH_BOOTBLOCK_X86_32 ############################################################################### # romstage @@ -145,10 +145,9 @@ endif ifeq ($(CONFIG_ARCH_ROMSTAGE_X86_32),y) crt0s = $(src)/arch/x86/init/prologue.inc -ldscripts = -ldscripts += $(src)/arch/x86/init/romstage.ld +romstage-srcs += $(src)/arch/x86/init/romstage.ld crt0s += $(src)/cpu/x86/32bit/entry32.inc -ldscripts += $(src)/cpu/x86/32bit/entry32.lds +romstage-srcs += $(src)/cpu/x86/32bit/entry32.ld crt0s += $(src)/cpu/x86/fpu_enable.inc ifeq ($(CONFIG_SSE),y) @@ -171,13 +170,14 @@ endif ifeq ($(CONFIG_ROMCC),y) ifeq ($(CONFIG_MMX),y) ifeq ($(CONFIG_SSE),y) - ROMCCFLAGS := -mcpu=p4 -O2 # MMX, SSE + ROMCCFLAGS = -mcpu=p4 -O2 # MMX, SSE else - ROMCCFLAGS := -mcpu=p2 -O2 # MMX, !SSE + ROMCCFLAGS = -mcpu=p2 -O2 # MMX, !SSE endif else - ROMCCFLAGS := -mcpu=i386 -O2 # !MMX, !SSE -endif + ROMCCFLAGS = -mcpu=i386 -O2 # !MMX, !SSE +endif # CONFIG_MMX +ROMCCFLAGS += $(romstage-c-ccopts) $(romstage-generic-ccopts) $(objcbfs)/romstage_%.bin: $(objcbfs)/romstage_%.elf @printf " OBJCOPY $(subst $(obj)/,,$(@))\n" @@ -191,49 +191,39 @@ $(objcbfs)/romstage_%.elf: $(objcbfs)/romstage_%.debug $(OBJCOPY_romstage) --add-gnu-debuglink=$< $@.tmp mv $@.tmp $@ -$(obj)/mainboard/$(MAINBOARDDIR)/romstage.inc: $(src)/mainboard/$(MAINBOARDDIR)/romstage.c $(objutil)/romcc/romcc $(OPTION_TABLE_H) $(obj)/build.h $(obj)/config.h +$(obj)/mainboard/$(MAINBOARDDIR)/romstage.inc: $(src)/mainboard/$(MAINBOARDDIR)/romstage.c $(objutil)/romcc/romcc $$(generic-deps) printf " ROMCC romstage.inc\n" - $(ROMCC) -c -S $(ROMCCFLAGS) -D__PRE_RAM__ -I. $(INCLUDES) $(INCLUDES_romstage) $< -o $@ -else + $(ROMCC) -c -S $(ROMCCFLAGS) -I. $(INCLUDES) $(INCLUDES_romstage) $< -o $@ +else # CONFIG_ROMCC -$(obj)/mainboard/$(MAINBOARDDIR)/romstage.pre.inc: $(src)/mainboard/$(MAINBOARDDIR)/romstage.c $(OPTION_TABLE_H) $(obj)/build.h $(obj)/config.h +$(obj)/mainboard/$(MAINBOARDDIR)/romstage.pre.inc: $(src)/mainboard/$(MAINBOARDDIR)/romstage.c $$(generic-deps) @printf " CC romstage.inc\n" - $(CC_romstage) -MMD $(CFLAGS_romstage) -D__PRE_RAM__ -I$(src) -I. -I$(obj) -c -S $< -o $@ + $(CC_romstage) -MMD $(CFLAGS_romstage) $(romstage-c-ccopts) $(romstage-generic-ccopts) -I$(src) -I. -I$(obj) -c -S $< -o $@ $(obj)/mainboard/$(MAINBOARDDIR)/romstage.inc: $(obj)/mainboard/$(MAINBOARDDIR)/romstage.pre.inc @printf " POST romstage.inc\n" sed -e 's/\.rodata/.rom.data/g' -e 's/\^\.text/.section .rom.text/g' \ -e 's/\^\.section \.text/.section .rom.text/g' $^ > $@.tmp mv $@.tmp $@ -endif +endif # CONFIG_ROMCC -romstage-srcs += $(objgenerated)/crt0.s - -$(objcbfs)/romstage_null.debug: $$(romstage-objs) $(objgenerated)/romstage_null.ld +$(objcbfs)/romstage_null.debug: $$(romstage-objs) $(LIBGCC_FILE_NAME_romstage) $(objgenerated)/romstage_null.ld @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_romstage) -nostdlib -nostartfiles -static -o $@ -L$(obj) --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 --start-group $(romstage-objs) $(LIBGCC_FILE_NAME_romstage) --end-group -T $(objgenerated)/romstage_null.ld -else - $(CC_romstage) $(CFLAGS_romstage) -nostartfiles -static -o $@ -L$(obj) -T $(objgenerated)/romstage_null.ld -Wl,--wrap,__divdi3 -Wl,--wrap,__udivdi3 -Wl,--wrap,__moddi3 -Wl,--wrap,__umoddi3 -Wl,--start-group $(romstage-objs) $(LIBGCC_FILE_NAME_romstage) -Wl,--end-group -endif + $(call link,romstage,$(filter %.o %.a,$(^)),-o $(@) -L$(obj) -T $(objgenerated)/romstage_null.ld,$(LIBGCC_WRAP_LDFLAGS)) $(NM_romstage) $@ | grep -q " [DdBb] "; if [ $$? -eq 0 ]; then \ echo "Forbidden global variables in romstage:"; \ $(NM_romstage) $@ | grep " [DdBb] "; test "$(CONFIG_CPU_AMD_AGESA)" = y; \ else true; fi -$(objcbfs)/romstage_xip.debug: $$(romstage-objs) $(objgenerated)/romstage_xip.ld +$(objcbfs)/romstage_xip.debug: $$(romstage-objs) $(LIBGCC_FILE_NAME_romstage) $(objgenerated)/romstage_xip.ld @printf " LINK $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_romstage) -nostdlib -nostartfiles -static -o $@ -L$(obj) --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 --start-group $(romstage-objs) $(LIBGCC_FILE_NAME_romstage) --end-group -T $(objgenerated)/romstage_xip.ld -else - $(CC_romstage) $(CFLAGS_romstage) -nostartfiles -static -o $@ -L$(obj) -T $(objgenerated)/romstage_xip.ld -Wl,--wrap,__divdi3 -Wl,--wrap,__udivdi3 -Wl,--wrap,__moddi3 -Wl,--wrap,__umoddi3 -Wl,--start-group $(romstage-objs) $(LIBGCC_FILE_NAME_romstage) -Wl,--end-group -endif + $(call link,romstage,$(filter %.o %.a,$(^)),-o $(@) -L$(obj) -T $(objgenerated)/romstage_xip.ld,$(LIBGCC_WRAP_LDFLAGS)) -$(objgenerated)/romstage_null.ld: $$(ldscripts) $(obj)/ldoptions +$(objgenerated)/romstage_null.ld: $$(filter %.ld,$$(romstage-objs)) @printf " GEN $(subst $(obj)/,,$(@))\n" rm -f $@ printf "ROMSTAGE_BASE = 0x0;\n" > $@.tmp - printf '$(foreach ldscript,ldoptions $(ldscripts),INCLUDE "$(ldscript:$(obj)/%=%)"\n)' >> $@.tmp + printf '$(foreach ldscript,$(^),INCLUDE "$(ldscript)"\n)' >> $@.tmp mv $@.tmp $@ $(objgenerated)/romstage_xip.ld: $(objgenerated)/romstage_null.ld $(objcbfs)/base_xip.txt @@ -249,19 +239,16 @@ $(objcbfs)/base_xip.txt: $(obj)/coreboot.pre1 $(objcbfs)/romstage_null.bin || { echo "The romstage is larger than XIP size. Please expand the CONFIG_XIP_ROM_SIZE" ; exit 1; } mv $@.tmp $@ -$(objgenerated)/crt0.romstage.S: $$(crt0s) +$(objgenerated)/crt0.S: $$(crt0s) @printf " GEN $(subst $(obj)/,,$(@))\n" - printf '$(foreach crt0,$(crt0s),#include "$(crt0:$(obj)/%=%)"\n)' > $@ + printf '$(foreach crt0,$(crt0s),#include "$(crt0)"\n)' > $@ -$(objgenerated)/crt0.romstage.o: $(objgenerated)/crt0.s - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_romstage) -Wa,-acdlns -c -o $@ $< > $(basename $@).disasm +romstage-srcs += $(objgenerated)/crt0.S -$(objgenerated)/crt0.s: $(objgenerated)/crt0.romstage.S $(obj)/config.h $(obj)/build.h - @printf " CC $(subst $(obj)/,,$(@))\n" - $(CC_romstage) -MMD -x assembler-with-cpp -E -I$(src)/include -I$(src)/arch/x86/include -I$(obj) -include $(obj)/config.h -include $(obj)/build.h -I. -I$(src) $< -o $@ +# Compiling crt0 with -g seems to trigger https://sourceware.org/bugzilla/show_bug.cgi?id=6428 +romstage-S-ccopts += -I. -Wa,-acdlns=$$$$(basename $$$$(@)).disasm -g0 -endif +endif # CONFIG_ARCH_ROMSTAGE_X86_32 ############################################################################### # ramstage @@ -299,7 +286,7 @@ endif ifneq ($(wildcard src/mainboard/$(MAINBOARDDIR)/fadt.c),) ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/fadt.c endif -endif +endif # CONFIG_GENERATE_ACPI_TABLES ifeq ($(CONFIG_HAVE_SMI_HANDLER),y) ifneq ($(wildcard src/mainboard/$(MAINBOARDDIR)/smihandler.c),) smm-srcs += src/mainboard/$(MAINBOARDDIR)/smihandler.c @@ -317,27 +304,45 @@ $(eval $(call rmodule_link,$(objcbfs)/ramstage.debug, $(objgenerated)/ramstage.o $(objcbfs)/ramstage.elf: $(objcbfs)/ramstage.debug.rmod cp $< $@ -else +else # CONFIG_RELOCATABLE_RAMSTAGE -$(objcbfs)/ramstage.debug: $(objgenerated)/ramstage.o $(src)/arch/x86/ramstage.ld +ramstage-srcs += $(src)/arch/x86/ramstage.ld + +$(objcbfs)/ramstage.debug: $(objgenerated)/ramstage.o @printf " CC $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_ramstage) -m elf_i386 -o $@ -L$(obj) $< -T $(src)/arch/x86/ramstage.ld -else - $(CC_ramstage) $(CFLAGS_ramstage) -nostartfiles -static -o $@ -L$(obj) -T $(src)/arch/x86/ramstage.ld $< -endif + $(call link,ramstage,$(<),-o $(@) -L$(obj) -T $(obj)/arch/x86/ramstage.ramstage.ld,) -endif +endif # CONFIG_RELOCATABLE_RAMSTAGE $(objgenerated)/ramstage.o: $$(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) @printf " CC $(subst $(obj)/,,$(@))\n" -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) - $(LD_ramstage) -m elf_i386 -r -o $@ --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3 --start-group $(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) --end-group -else - $(CC_ramstage) $(CFLAGS_ramstage) -r -o $@ -Wl,--wrap,__divdi3 -Wl,--wrap,__udivdi3 -Wl,--wrap,__moddi3 -Wl,--wrap,__umoddi3 -Wl,--start-group $(ramstage-objs) $(LIBGCC_FILE_NAME_ramstage) -Wl,--end-group -endif + $(call link,ramstage,$(filter %.o %.a,$(^)),-o $(@) -L$(obj),-r $(LIBGCC_WRAP_LDFLAGS)) + +endif # CONFIG_ARCH_ROMSTAGE_X86_32 + + +################################################################################ +# ACPI ASL +################################################################################ + +# Compile ASLs in three steps: src/%.asl -CPP-> obj/%..asl -IASL-> obj/%..c -CC-> obj/%..o +generic-asl-ccopts += $(PREPROCESS_ONLY) -D__ACPI__ -I$(src)/mainboard/$(MAINBOARDDIR) + +%.c: %.asl + @printf " IASL $(subst $(top)/,,$(@))\n" + cd $(dir $(<)); $(IASL) -p $(notdir $(<)) -tc $(notdir $(<)) + mv $(<:%.asl=%.hex) $(@) +# Change array identifier in generated files for everything but dsdt to avoid conflicts +# (TODO: Shouldn't we just call that one AmlCode_dsdt as well for consistency?) + $(if $(subst dsdt,,$(basename $(basename $(notdir $(<))))),sed -ie 's/AmlCode/AmlCode_$(basename $(basename $(notdir $(<))))/' $(@)) + +# Prepend function that does equivalent of '-y += .o' for all .asl in to postprocessors +postprocessors := $$(foreach class,$$(classes), \ + $$(foreach asl,$$(filter %.asl,$$(call src-to-obj,$$(class),$$($$(class)-srcs))), \ + $$(eval ramstage-objs += $$(asl:%.asl=%.o)) \ + $$(eval ramstage-srcs += $$(asl:%.asl=%.c)))) \ + $(postprocessors) -endif ################################################################################ diff --git a/src/arch/x86/init/ldscript_failover.lb b/src/arch/x86/init/failover.ld similarity index 100% rename from src/arch/x86/init/ldscript_failover.lb rename to src/arch/x86/init/failover.ld diff --git a/src/arch/x86/lib/id.inc b/src/arch/x86/lib/id.inc index f8aba0b946..7a2876c994 100644 --- a/src/arch/x86/lib/id.inc +++ b/src/arch/x86/lib/id.inc @@ -1,3 +1,4 @@ +#include .section ".id", "a", @progbits .globl __id_start diff --git a/src/arch/x86/lib/id.lds b/src/arch/x86/lib/id.ld similarity index 100% rename from src/arch/x86/lib/id.lds rename to src/arch/x86/lib/id.ld diff --git a/src/arch/x86/ramstage.ld b/src/arch/x86/ramstage.ld index 74d1b13d5c..7473f55350 100644 --- a/src/arch/x86/ramstage.ld +++ b/src/arch/x86/ramstage.ld @@ -20,7 +20,6 @@ */ /* We use ELF as output format. So that we can debug the code in some form. */ -INCLUDE ldoptions ENTRY(_start) diff --git a/src/console/Makefile.inc b/src/console/Makefile.inc index 652e2cd640..85376b7170 100644 --- a/src/console/Makefile.inc +++ b/src/console/Makefile.inc @@ -33,8 +33,3 @@ secmon-$(CONFIG_ARCH_USE_SECURE_MONITOR) += vtxprintf.c secmon-$(CONFIG_ARCH_USE_SECURE_MONITOR) += console.c secmon-$(CONFIG_ARCH_USE_SECURE_MONITOR) += die.c secmon-$(CONFIG_ARCH_USE_SECURE_MONITOR) += printk.c - -$(obj)/console/console.ramstage.o : $(obj)/build.h -$(obj)/console/console.romstage.o : $(obj)/build.h -$(obj)/console/console.verstage.o : $(obj)/build.h -$(obj)/console/console.bootblock.o : $(obj)/build.h diff --git a/src/cpu/intel/fit/fit.lds b/src/cpu/intel/fit/fit.ld similarity index 100% rename from src/cpu/intel/fit/fit.lds rename to src/cpu/intel/fit/fit.ld diff --git a/src/cpu/x86/16bit/entry16.lds b/src/cpu/x86/16bit/entry16.ld similarity index 100% rename from src/cpu/x86/16bit/entry16.lds rename to src/cpu/x86/16bit/entry16.ld diff --git a/src/cpu/x86/16bit/reset16.lds b/src/cpu/x86/16bit/reset16.ld similarity index 100% rename from src/cpu/x86/16bit/reset16.lds rename to src/cpu/x86/16bit/reset16.ld diff --git a/src/cpu/x86/32bit/entry32.lds b/src/cpu/x86/32bit/entry32.ld similarity index 100% rename from src/cpu/x86/32bit/entry32.lds rename to src/cpu/x86/32bit/entry32.ld diff --git a/src/cpu/x86/Makefile.inc b/src/cpu/x86/Makefile.inc index 16b8c0ab47..94c1655be1 100644 --- a/src/cpu/x86/Makefile.inc +++ b/src/cpu/x86/Makefile.inc @@ -9,14 +9,11 @@ SIPI_BIN=$(SIPI_ELF:.elf=) SIPI_DOTO=$(SIPI_ELF:.elf=.o) ifeq ($(CONFIG_PARALLEL_MP),y) -ramstage-srcs += $(SIPI_BIN) +ramstage-objs += $(SIPI_BIN).ramstage.o endif rmodules_$(ARCH-RAMSTAGE-y)-$(CONFIG_PARALLEL_MP) += sipi_vector.S -$(SIPI_DOTO): $(dir $(SIPI_ELF))sipi_vector.rmodules_$(ARCH-RAMSTAGE-y).o - $(CC_ramstage) $(LDFLAGS) -nostdlib -r -o $@ $^ - -$(eval $(call rmodule_link,$(SIPI_ELF), $(SIPI_ELF:.elf=.o), 0,x86_32)) +$(eval $(call rmodule_link,$(SIPI_ELF), $(dir $(SIPI_ELF))sipi_vector.rmodules_$(ARCH-RAMSTAGE-y).o, 0,x86_32)) $(SIPI_BIN): $(SIPI_RMOD) $(OBJCOPY_ramstage) -O binary $< $@ diff --git a/src/cpu/x86/smm/Makefile.inc b/src/cpu/x86/smm/Makefile.inc index 64e1c2cd70..fdfa8e2011 100644 --- a/src/cpu/x86/smm/Makefile.inc +++ b/src/cpu/x86/smm/Makefile.inc @@ -22,6 +22,9 @@ ramstage-$(CONFIG_BACKUP_DEFAULT_SMM_REGION) += backup_default_smm.c $(eval $(call create_class_compiler,smm,x86_32)) $(eval $(call create_class_compiler,smmstub,x86_32)) +smmstub-generic-ccopts += -D__SMM__ +smm-generic-ccopts += -D__SMM__ + ifeq ($(CONFIG_SMM_MODULES),y) smmstub-y += smm_stub.S @@ -30,16 +33,11 @@ smm-y += smm_module_handler.c ramstage-y += smm_module_loader.c -ramstage-srcs += $(obj)/cpu/x86/smm/smm -ramstage-srcs += $(obj)/cpu/x86/smm/smmstub +ramstage-objs += $(obj)/cpu/x86/smm/smm.ramstage.o +ramstage-objs += $(obj)/cpu/x86/smm/smmstub.ramstage.o -# SMM Stub Module. The stub is used as a trampoline for relocation and normal -# SMM handling. -$(obj)/cpu/x86/smm/smmstub.o: $$(smmstub-objs) - $(CC_smmstub) $(LDFLAGS) -nostdlib -r -o $@ $^ - -# Link the SMM stub module with a 0-byte heap. -$(eval $(call rmodule_link,$(obj)/cpu/x86/smm/smmstub.elf, $(obj)/cpu/x86/smm/smmstub.o, 0,x86_32)) +# SMM Stub Module. The stub is used as a trampoline for relocation and normal SMM handling. +$(eval $(call rmodule_link,$(obj)/cpu/x86/smm/smmstub.elf, $$$$(smmstub-objs), 0,x86_32)) $(obj)/cpu/x86/smm/smmstub: $(obj)/cpu/x86/smm/smmstub.elf.rmod $(OBJCOPY_smmstub) -O binary $< $@ @@ -51,8 +49,8 @@ $(obj)/cpu/x86/smm/smmstub.ramstage.o: $(obj)/cpu/x86/smm/smmstub # C-based SMM handler. $(obj)/cpu/x86/smm/smm.o: $$(smm-objs) $(LIBGCC_FILE_NAME_smm) - $(CC_smm) $(LDFLAGS) -nostdlib -r -o $@ -Wl,--wrap,__divdi3 -Wl,--wrap,__udivdi3 -Wl,--wrap,__moddi3 -Wl,--wrap,__umoddi3 -Wl,--start-group $(smm-objs) $(LIBGCC_FILE_NAME_smm) -Wl,--end-group - + @printf " LINK $(subst $(obj)/,,$(@))\n" + $(call link,smm,$(filter %.a %.o,$(^)),-o $(@),-r $(LIBGCC_WRAP_LDFLAGS)) $(eval $(call rmodule_link,$(obj)/cpu/x86/smm/smm.elf, $(obj)/cpu/x86/smm/smm.o, $(CONFIG_SMM_MODULE_HEAP_SIZE),x86_32)) @@ -67,28 +65,33 @@ else # CONFIG_SMM_MODULES ramstage-$(CONFIG_HAVE_SMI_HANDLER) += smmrelocate.S ifeq ($(CONFIG_HAVE_SMI_HANDLER),y) -ramstage-srcs += $(obj)/cpu/x86/smm/smm_wrap +ramstage-objs += $(obj)/cpu/x86/smm/smm_wrap.ramstage.o endif # Use TSEG specific entry point and linker script ifeq ($(CONFIG_SMM_TSEG),y) smm-y += smmhandler_tseg.S -SMM_LDFLAGS := $(LDFLAGS) -pie -SMM_LDSCRIPT := smm_tseg.ld +smm-c-ccopts += -fpic +SMM_LDFLAGS := -pie +SMM_LDSCRIPT := smm_tseg else smm-y += smmhandler.S -SMM_LDFLAGS := $(LDFLAGFS) -SMM_LDSCRIPT := smm.ld +SMM_LDFLAGS := +SMM_LDSCRIPT := smm endif smm-y += smihandler.c smm-y += smiutil.c -$(obj)/cpu/x86/smm/smm.o: $$(smm-objs) $(LIBGCC_FILE_NAME_smm) - $(CC_smm) $(LDFLAGS) -nostdlib -r -o $@ -Wl,--wrap,__divdi3 -Wl,--wrap,__udivdi3 -Wl,--wrap,__moddi3 -Wl,--wrap,__umoddi3 -Wl,--start-group $(smm-objs) $(LIBGCC_FILE_NAME_smm) -Wl,--end-group +smm-y += $(SMM_LDSCRIPT).ld -$(obj)/cpu/x86/smm/smm_wrap: $(obj)/cpu/x86/smm/smm.o $(src)/cpu/x86/smm/$(SMM_LDSCRIPT) $(obj)/ldoptions - $(CC_smm) $(SMM_LDFLAGS) -nostdlib -nostartfiles -static -o $(obj)/cpu/x86/smm/smm.elf -T $(src)/cpu/x86/smm/$(SMM_LDSCRIPT) $(obj)/cpu/x86/smm/smm.o +$(obj)/cpu/x86/smm/smm.o: $$(smm-objs) $(LIBGCC_FILE_NAME_smm) + @printf " LINK $(subst $(obj)/,,$(@))\n" + $(call link,smm,$(filter %.a %.o,$(^)),-o $(@),-r $(LIBGCC_WRAP_LDFLAGS)) + +$(obj)/cpu/x86/smm/smm_wrap: $(obj)/cpu/x86/smm/smm.o + @printf " LINK $(subst $(obj)/,,$(@))\n" + $(call link,smm,$(<),-o $(obj)/cpu/x86/smm/smm.elf -T $(obj)/cpu/x86/smm/$(SMM_LDSCRIPT).smm.ld,$(SMM_LDFLAGS)) $(NM_smm) -n $(obj)/cpu/x86/smm/smm.elf | sort > $(obj)/cpu/x86/smm/smm.map $(OBJCOPY_smm) -O binary $(obj)/cpu/x86/smm/smm.elf $(obj)/cpu/x86/smm/smm diff --git a/src/drivers/pc80/Makefile.inc b/src/drivers/pc80/Makefile.inc index 2b80d00f06..6851d7925b 100644 --- a/src/drivers/pc80/Makefile.inc +++ b/src/drivers/pc80/Makefile.inc @@ -19,8 +19,3 @@ cmos.default-type = 0xaa smm-y += mc146818.c smm-y += mc146818rtc.c - -$(obj)/drivers/pc80/mc146818rtc.ramstage.o : $(obj)/build.h -$(obj)/drivers/pc80/mc146818.ramstage.o : $(obj)/build.h -$(obj)/drivers/pc80/mc146818rtc.smm.o : $(obj)/build.h -$(obj)/drivers/pc80/mc146818.smm.o : $(obj)/build.h diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc index 6a81b4ba4b..1faf38fe30 100644 --- a/src/lib/Makefile.inc +++ b/src/lib/Makefile.inc @@ -35,7 +35,8 @@ romstage-y += memchr.c romstage-y += memcmp.c $(foreach arch,$(ARCH_SUPPORTED),\ - $(eval rmodules_$(ARCH_TO_TOOLCHAIN_$(arch))-y += memcmp.c)) + $(eval rmodules_$(ARCH_TO_TOOLCHAIN_$(arch))-y += memcmp.c) \ + $(eval rmodules_$(ARCH_TO_TOOLCHAIN_$(arch))-y += rmodule.ld)) verstage-y += delay.c verstage-y += cbfs.c @@ -122,26 +123,11 @@ smm-$(CONFIG_CONSOLE_SERIAL8250MEM) += uart8250mem.c smm-$(CONFIG_USBDEBUG) += usbdebug.c smm-y += gcc.c -$(obj)/lib/version.ramstage.o : $(obj)/build.h - -OPTION_TABLE_H:= -ifeq ($(CONFIG_HAVE_OPTION_TABLE),y) -OPTION_TABLE_H:=$(obj)/option_table.h -endif - -$(obj)/lib/uart8250mem.smm.o : $(OPTION_TABLE_H) -$(obj)/lib/uart8250.smm.o : $(OPTION_TABLE_H) - ifeq ($(CONFIG_RELOCATABLE_MODULES),y) ramstage-y += rmodule.c # Include rmodule.c in romstage if vboot verification is selected. romstage-$(CONFIG_VBOOT_VERIFY_FIRMWARE) += rmodule.c -RMODULE_LDSCRIPT := $(src)/lib/rmodule.ld - -ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y) -RMODULE_LDFLAGS := -nostartfiles -Wl,--emit-relocs -Wl,-z,defs -Wl,-Bsymbolic -Wl,-T,$(RMODULE_LDSCRIPT) - # rmodule_link_rules is a function that should be called with: # (1) the object name to link # (2) the dependencies @@ -150,28 +136,8 @@ RMODULE_LDFLAGS := -nostartfiles -Wl,--emit-relocs -Wl,-z,defs -Wl,-Bsymbolic - # It will create the necessary Make rules to create a rmodule. The resulting # rmdoule is named $(1).rmod define rmodule_link -$(strip $(1)): $(strip $(2)) $$(RMODULE_LDSCRIPT) $$(obj)/ldoptions - $$(LD_rmodules_$(4)) -y $$(RMODULE_LDFLAGS) --defsym=__heap_size=$(strip $(3)) -o $$@ --start-group $(strip $(2)) $$(LIBGCC_FILE_NAME_rmodules_$(4)) --end-group - $$(NM_rmodules_$(4)) -n $$@ > $$(basename $$@).map - -$(strip $(1)).rmod: $(strip $(1)) - $$(RMODTOOL) -i $$^ -o $$@ - -endef - -else -RMODULE_LDFLAGS := -nostartfiles -Wl,--emit-relocs -Wl,-z,defs -Wl,-Bsymbolic -Wl,-T,$(RMODULE_LDSCRIPT) - -# rmodule_link_rules is a function that should be called with: -# (1) the object name to link -# (2) the dependencies -# (3) heap size of the relocatable module -# (4) arch for which the rmodules are to be linked -# It will create the necessary Make rules to create a rmodule. The resulting -# rmdoule is named $(1).rmod -define rmodule_link -$(strip $(1)): $(strip $(2)) $$(RMODULE_LDSCRIPT) $$(obj)/ldoptions $$(RMODTOOL) - $$(CC_rmodules_$(4)) $$(CFLAGS_rmodules_$(4)) $$(RMODULE_LDFLAGS) -Wl,--defsym=__heap_size=$(strip $(3)) -o $$@ -Wl,--start-group $(strip $(2)) $$(LIBGCC_FILE_NAME_rmodules_$(4)) -Wl,--end-group +$(strip $(1)): $(strip $(2)) $$(LIBGCC_FILE_NAME_rmodules_$(4)) $(obj)/lib/rmodule.rmodules_$(4).ld $$(RMODTOOL) + $$(call link,rmodules_$(4),$$(filter %.a %.o,$$(^)),-o $$(@) -T $(obj)/lib/rmodule.rmodules_$(4).ld,--emit-relocs -z defs -Bsymbolic --defsym=__heap_size=$(strip $(3))) $$(NM_rmodules_$(4)) -n $$@ > $$(basename $$@).map $(strip $(1)).rmod: $(strip $(1)) @@ -181,5 +147,3 @@ endef endif -endif - diff --git a/src/northbridge/intel/haswell/Makefile.inc b/src/northbridge/intel/haswell/Makefile.inc index 04b0d2fc7f..2a3e6fb7ce 100644 --- a/src/northbridge/intel/haswell/Makefile.inc +++ b/src/northbridge/intel/haswell/Makefile.inc @@ -37,5 +37,3 @@ cbfs-files-$(CONFIG_HAVE_MRC) += mrc.bin mrc.bin-file := $(call strip_quotes,$(CONFIG_MRC_FILE)) mrc.bin-position := 0xfffa0000 mrc.bin-type := 0xab - -$(obj)/northbridge/intel/haswell/acpi.ramstage.o : $(obj)/build.h diff --git a/src/northbridge/intel/sandybridge/Makefile.inc b/src/northbridge/intel/sandybridge/Makefile.inc index 01b328b4bf..516a884120 100644 --- a/src/northbridge/intel/sandybridge/Makefile.inc +++ b/src/northbridge/intel/sandybridge/Makefile.inc @@ -42,5 +42,3 @@ ifeq ($(CONFIG_NORTHBRIDGE_INTEL_SANDYBRIDGE),y) mrc.bin-position := 0xfffe0000 endif mrc.bin-type := 0xab - -$(obj)/northbridge/intel/sandybridge/acpi.ramstage.o : $(obj)/build.h diff --git a/src/northbridge/via/vx800/Makefile.inc b/src/northbridge/via/vx800/Makefile.inc index 39ebdbd998..5e34c691c2 100644 --- a/src/northbridge/via/vx800/Makefile.inc +++ b/src/northbridge/via/vx800/Makefile.inc @@ -23,5 +23,6 @@ ramstage-y += vga.c ramstage-y += lpc.c ramstage-y += ide.c +bootblock-y += romstrap.ld + chipset_bootblock_inc += $(src)/northbridge/via/vx800/romstrap.inc -chipset_bootblock_lds += $(src)/northbridge/via/vx800/romstrap.lds diff --git a/src/northbridge/via/vx800/romstrap.lds b/src/northbridge/via/vx800/romstrap.ld similarity index 100% rename from src/northbridge/via/vx800/romstrap.lds rename to src/northbridge/via/vx800/romstrap.ld diff --git a/src/southbridge/nvidia/ck804/Makefile.inc b/src/southbridge/nvidia/ck804/Makefile.inc index bfafa23e41..be365f2f1f 100644 --- a/src/southbridge/nvidia/ck804/Makefile.inc +++ b/src/southbridge/nvidia/ck804/Makefile.inc @@ -20,6 +20,6 @@ ramstage-$(CONFIG_USBDEBUG) += enable_usbdebug.c smm-$(CONFIG_USBDEBUG) += enable_usbdebug.c romstage-y += early_smbus.c -chipset_bootblock_inc += $(src)/southbridge/nvidia/ck804/romstrap.inc -chipset_bootblock_lds += $(src)/southbridge/nvidia/ck804/romstrap.lds +bootblock-y += romstrap.ld +chipset_bootblock_inc += $(src)/southbridge/nvidia/ck804/romstrap.inc diff --git a/src/southbridge/nvidia/ck804/nic.c b/src/southbridge/nvidia/ck804/nic.c index 3dccb8ea7d..ca082e7009 100644 --- a/src/southbridge/nvidia/ck804/nic.c +++ b/src/southbridge/nvidia/ck804/nic.c @@ -90,7 +90,7 @@ static void nic_init(struct device *dev) /* If that is invalid we will read that from romstrap. */ if (!eeprom_valid) { unsigned long mac_pos; - mac_pos = 0xffffffd0; /* See romstrap.inc and romstrap.lds. */ + mac_pos = 0xffffffd0; /* See romstrap.inc and romstrap.ld. */ mac_l = read32(mac_pos) + nic_index; mac_h = read32(mac_pos + 4); } diff --git a/src/southbridge/nvidia/ck804/romstrap.lds b/src/southbridge/nvidia/ck804/romstrap.ld similarity index 100% rename from src/southbridge/nvidia/ck804/romstrap.lds rename to src/southbridge/nvidia/ck804/romstrap.ld diff --git a/src/southbridge/nvidia/mcp55/Makefile.inc b/src/southbridge/nvidia/mcp55/Makefile.inc index b20804a978..358d218800 100644 --- a/src/southbridge/nvidia/mcp55/Makefile.inc +++ b/src/southbridge/nvidia/mcp55/Makefile.inc @@ -19,5 +19,6 @@ romstage-$(CONFIG_USBDEBUG) += enable_usbdebug.c ramstage-$(CONFIG_USBDEBUG) += enable_usbdebug.c smm-$(CONFIG_USBDEBUG) += enable_usbdebug.c +bootblock-y += romstrap.ld + chipset_bootblock_inc += $(src)/southbridge/nvidia/mcp55/romstrap.inc -chipset_bootblock_lds += $(src)/southbridge/nvidia/mcp55/romstrap.lds diff --git a/src/southbridge/nvidia/mcp55/nic.c b/src/southbridge/nvidia/mcp55/nic.c index 86468fd64e..30dab05731 100644 --- a/src/southbridge/nvidia/mcp55/nic.c +++ b/src/southbridge/nvidia/mcp55/nic.c @@ -161,7 +161,7 @@ static void nic_init(struct device *dev) // if that is invalid we will read that from romstrap if(!eeprom_valid) { unsigned long mac_pos; - mac_pos = 0xffffffd0; // refer to romstrap.inc and romstrap.lds + mac_pos = 0xffffffd0; // refer to romstrap.inc and romstrap.ld mac_l = read32(mac_pos) + nic_index; // overflow? mac_h = read32(mac_pos + 4); diff --git a/src/southbridge/nvidia/mcp55/romstrap.lds b/src/southbridge/nvidia/mcp55/romstrap.ld similarity index 100% rename from src/southbridge/nvidia/mcp55/romstrap.lds rename to src/southbridge/nvidia/mcp55/romstrap.ld diff --git a/src/southbridge/sis/sis966/Makefile.inc b/src/southbridge/sis/sis966/Makefile.inc index b25aa9ed87..60aa0fbfb9 100644 --- a/src/southbridge/sis/sis966/Makefile.inc +++ b/src/southbridge/sis/sis966/Makefile.inc @@ -14,5 +14,6 @@ romstage-$(CONFIG_USBDEBUG) += enable_usbdebug.c ramstage-$(CONFIG_USBDEBUG) += enable_usbdebug.c smm-$(CONFIG_USBDEBUG) += enable_usbdebug.c +bootblock-y += romstrap.ld + chipset_bootblock_inc += $(src)/southbridge/sis/sis966/romstrap.inc -chipset_bootblock_lds += $(src)/southbridge/sis/sis966/romstrap.lds diff --git a/src/southbridge/sis/sis966/romstrap.lds b/src/southbridge/sis/sis966/romstrap.ld similarity index 100% rename from src/southbridge/sis/sis966/romstrap.lds rename to src/southbridge/sis/sis966/romstrap.ld diff --git a/src/southbridge/via/k8t890/Makefile.inc b/src/southbridge/via/k8t890/Makefile.inc index 6d9407d03b..ef04e1fe48 100644 --- a/src/southbridge/via/k8t890/Makefile.inc +++ b/src/southbridge/via/k8t890/Makefile.inc @@ -8,5 +8,6 @@ ramstage-y += traf_ctrl.c ramstage-y += error.c ramstage-y += chrome.c +bootblock-y += romstrap.ld + chipset_bootblock_inc += $(src)/southbridge/via/k8t890/romstrap.inc -chipset_bootblock_lds += $(src)/southbridge/via/k8t890/romstrap.lds diff --git a/src/southbridge/via/k8t890/romstrap.lds b/src/southbridge/via/k8t890/romstrap.ld similarity index 100% rename from src/southbridge/via/k8t890/romstrap.lds rename to src/southbridge/via/k8t890/romstrap.ld diff --git a/src/vendorcode/google/chromeos/Makefile.inc b/src/vendorcode/google/chromeos/Makefile.inc index 6048644bd1..79ea77e767 100644 --- a/src/vendorcode/google/chromeos/Makefile.inc +++ b/src/vendorcode/google/chromeos/Makefile.inc @@ -66,7 +66,6 @@ INCLUDES += $(VB_INCLUDES) VBOOT_STUB_ELF = $(obj)/vendorcode/google/chromeos/vbootstub.elf VBOOT_STUB = $(VBOOT_STUB_ELF).rmod -VBOOT_STUB_DOTO = $(VBOOT_STUB_ELF:.elf=.o) # Dependency for the vboot rmodules. Ordering matters. VBOOT_STUB_DEPS += $(obj)/vendorcode/google/chromeos/vboot_wrapper.rmodules_$(ARCH-ROMSTAGE-y).o @@ -90,19 +89,16 @@ VBOOT_CFLAGS += $(patsubst -I%,-I$(top)/%,$(filter-out -include $(src)/include/k VBOOT_CFLAGS += -DVBOOT_DEBUG VBOOT_CFLAGS += $(rmodules_$(ARCH-ROMSTAGE-y)-c-ccopts) -$(VBOOT_STUB_DOTO): $(VBOOT_STUB_DEPS) - $(CC_rmodules_$(ARCH-ROMSTAGE-y)) $(CFLAGS_rmodules_$(ARCH-ROMSTAGE-y)) $(LDFLAGS) -nostdlib -r -o $@ $^ - # Link the vbootstub module with a 64KiB-byte heap. -$(eval $(call rmodule_link,$(VBOOT_STUB_ELF), $(VBOOT_STUB_DOTO), 0x10000,$(ARCH-ROMSTAGE-y))) +$(eval $(call rmodule_link,$(VBOOT_STUB_ELF), $(VBOOT_STUB_DEPS), 0x10000,$(ARCH-ROMSTAGE-y))) # Build vboot library without the default includes from coreboot proper. $(VB_LIB): @printf " MAKE $(subst $(obj)/,,$(@))\n" $(Q)FIRMWARE_ARCH=$(VB_FIRMWARE_ARCH) \ CC="$(CC_romstage)" \ - CFLAGS="$(VBOOT_CFLAGS)" \ - make -C $(VB_SOURCE) \ + CFLAGS="$(VBOOT_CFLAGS)" \ + $(MAKE) -C $(VB_SOURCE) \ $(VBOOT_MAKEFLAGS) \ BUILD=$(top)/$(dir $(VB_LIB)) \ V=$(V) \ @@ -115,8 +111,7 @@ VB_SOURCE := vboot_reference INCLUDES += -I$(VB_SOURCE)/firmware/2lib/include INCLUDES += -I$(VB_SOURCE)/firmware/include -verstage-c-ccopts += -D__PRE_RAM__ -D__VER_STAGE__ -verstage-S-ccopts += -D__PRE_RAM__ -D__VER_STAGE__ +verstage-generic-ccopts += -D__PRE_RAM__ -D__VER_STAGE__ ifeq ($(CONFIG_RETURN_FROM_VERSTAGE),y) bootblock-y += verstub.c chromeos.c @@ -134,12 +129,12 @@ VBOOT_CFLAGS += $(verstage-c-ccopts) VBOOT_CFLAGS += -include $(top)/src/include/kconfig.h -Wno-missing-prototypes VBOOT_CFLAGS += -DVBOOT_DEBUG -$(VB2_LIB): $(obj)/config.h +$(VB2_LIB): $$(generic-deps) @printf " MAKE $(subst $(obj)/,,$(@))\n" $(Q)FIRMWARE_ARCH=$(VB_FIRMWARE_ARCH) \ CC="$(CC_verstage)" \ - CFLAGS="$(VBOOT_CFLAGS)" VBOOT2="y" \ - make -C $(VB_SOURCE) \ + CFLAGS="$(VBOOT_CFLAGS)" VBOOT2="y" \ + $(MAKE) -C $(VB_SOURCE) \ BUILD=$(top)/$(dir $(VB2_LIB)) \ V=$(V) \ fwlib2 @@ -149,4 +144,4 @@ cbfs-files-y += $(call strip_quotes,$(CONFIG_CBFS_PREFIX))/verstage fallback/verstage-file = $(VERSTAGE_ELF) fallback/verstage-type = stage fallback/verstage-compression = none -endif # CONFIG_VBOOT2_VERIFY_FIRMWARE \ No newline at end of file +endif # CONFIG_VBOOT2_VERIFY_FIRMWARE