3 # User definable variables for bootstrap:
4 # - BOOTSTRAP_SEARCH_PATH
6 # - BOOTSTRAP_MODULES_LIST
7 # - BOOTSTRAP_DO_RAW_IMAGE
8 # - BOOTSTRAP_DO_UIMAGE
9 # - BOOTSTRAP_UIMAGE_COMPRESSION: set to none, gzip, or bzip2
10 # - BOOTSTRAP_CMDLINE: compiled-in command line, only used if no cmdline
11 # given via multi-boot boot loader (e.g. on arm)
13 DEFAULT_RELOC_arm := 0x01000000
14 DEFAULT_RELOC_x86 := 0x002d0000
15 DEFAULT_RELOC_amd64 := 0x002d0000
16 DEFAULT_RELOC_ppc32 := 0x002d0000
17 DEFAULT_RELOC_sparc := 0x00100000
20 EXTRA_GENERAL_D_DEP = .redo-change-tracker $(BID_RAM_BASE_DEP)
21 INCLUDE_MAKE_RULES = $(SRC_DIR)/*/Make.rules
22 BOOTSTRAP_LD_dep := $(SRC_DIR)/ldscript.inc
23 #REQUIRES_LIBS = libbsd-lite
25 include $(L4DIR)/mk/Makeconf
26 -include $(OBJ_DIR)/Makeconf.local
27 -include $(L4DIR)/conf/Makeconf.boot
28 -include $(OBJ_BASE)/conf/Makeconf.boot
30 # Checks added Nov 2010:
31 ifneq ($(wildcard $(L4DIR)/conf/Makeconf.bootstrap),)
32 $(error $(L4DIR)/conf/Makeconf.bootstrap not used anymore. Please use $(L4DIR)/conf/Makeconf.boot now)
34 ifneq ($(wildcard $(OBJ_BASE)/Makeconf.bootstrap),)
35 $(error $(OBJ_BASE)/Makeconf.bootstrap not used anymore. Please use $(OBJ_BASE)/conf/Makeconf.boot now)
38 BOOTSTRAP_SEARCH_PATH ?= .
39 BOOTSTRAP_MODULES_LIST ?= $(SRC_DIR)/modules.list
40 BOOTSTRAP_MODULE_PATH_BINLIB ?= $(OBJ_BASE)/bin/$(SYSTEM)/$(BUILD_ABI):$(OBJ_BASE)/lib/$(SYSTEM)/$(BUILD_ABI):$(OBJ_BASE)/lib/$(SYSTEM)
41 BOOTSTRAP_ELF_NAME ?= bootstrap.elf
43 BOOTSTRAP_UIMAGE_COMPRESSION ?= none
45 ifeq ($(BUILD_ARCH),$(filter $(BUILD_ARCH),arm ppc32))
46 # ARM/PPC always uses single image mode
47 # when no entry is given we build the useless auto-build target
49 BOOTSTRAP_ELF_NAME := bootstrap.auto-build-useless.elf
51 ENTRY := auto-build-entry
55 PRIVATE_INCDIR = $(SRC_DIR) $(SRC_DIR)/ARCH-$(ARCH)
57 # special include directories only needed for <l4/sys/kernel.h>
58 PRIVATE_INCDIR_init_kip_v2.o = $(OBJ_BASE)/include/$(ARCH)/l4f \
59 $(DROPS_STDDIR)/include/$(ARCH)/l4f
60 PRIVATE_INCDIR_init_arm_kip.o = $(OBJ_BASE)/include/$(ARCH)/l4f \
61 $(DROPS_STDDIR)/include/$(ARCH)/l4f
63 TARGET := $(BOOTSTRAP_ELF_NAME)
64 TARGET_BIN = $(BOOTSTRAP_ELF_NAME)
67 ifeq ($(PLATFORM_TYPE),)
68 ifeq ($(X86_PLATFORM_TYPE),)
69 X86_PLATFORM_TYPE = pc
72 PLATFORM_TYPE-arm = $(ARM_PLATFORM_TYPE)
73 PLATFORM_TYPE-ppc32 = $(PPC_PLATFORM_TYPE)
74 PLATFORM_TYPE-x86 = $(X86_PLATFORM_TYPE)
75 PLATFORM_TYPE-amd64 = $(X86_PLATFORM_TYPE)
76 PLATFORM_TYPE-sparc = $(SPARC_PLATFORM_TYPE)
77 PLATFORM_TYPE = $(PLATFORM_TYPE-$(ARCH))
80 SUPPORT_CC_arm-sa1000 := support_sa1000.cc
81 SUPPORT_CC_arm-pxa := support_pxa.cc
82 SUPPORT_CC_arm-integrator := support_integrator.cc
83 SUPPORT_CC_arm-rv := support_rv.cc
84 SUPPORT_CC_arm-omap3evm := support_omap.cc
85 SUPPORT_CC_arm-beagleboard:= support_omap.cc
86 SUPPORT_CC_arm-pandaboard := support_omap.cc
87 SUPPORT_CC_arm-tegra2 := support_tegra2.cc
88 SUPPORT_CC_arm-imx21 := support_imx.cc
89 SUPPORT_CC_arm-imx35 := support_imx.cc
90 SUPPORT_CC_arm-imx51 := support_imx.cc
91 SUPPORT_CC_arm-om := support_om.cc
92 SUPPORT_CC_arm-kirkwood := support_kirkwood.cc
93 DEFAULT_RELOC_arm-imx21 := 0x00200000 # because of blob
95 ifneq ($(DEFAULT_RELOC_arm-$(PLATFORM_TYPE)),)
96 DEFAULT_RELOC_arm := $(DEFAULT_RELOC_arm-$(PLATFORM_TYPE))
99 SUPPORT_CC_ppc32-mpc5200 := support_mpc5200.cc
101 SUPPORT_CC_x86-pc := support_x86_pc.cc
103 SUPPORT_CC_amd64-pc := support_x86_pc.cc
105 SUPPORT_CC_sparc-leon3 := support_sparc_leon3.cc
107 SRC_C += exec.c module.c
108 SRC_CC += region.cc startup.cc init_kip_v2.cc init_kip_v4.cc \
109 libc_support+.cc patch.cc koptions.cc
111 SRC_CC_x86 += ARCH-x86/reboot.cc ARCH-x86/serial.cc
112 SRC_CC_amd64 += ARCH-x86/reboot.cc ARCH-x86/serial.cc
113 SRC_C_x86 += base_critical.c
114 SRC_C_amd64 += base_critical.c
115 SRC_CC_arm += ARCH-arm/reboot.cc
116 SRC_CC_ppc32 += ARCH-ppc32/init_kip_v2-arch.cc \
118 SRC_CC_sparc += ARCH-sparc/reboot.cc
119 SRC_CC += $(SUPPORT_CC_$(ARCH)-$(PLATFORM_TYPE))
120 SRC_S += ARCH-$(ARCH)/crt0.S
122 OPTS = -g -Os $(CARCHFLAGS_$(ARCH)) $(CARCHFLAGS_$(ARCH)_$(CPU))
123 DEFINES += -DRAM_BASE=$(RAM_BASE) -DL4_MINIMAL_LIBC=1
124 DEFINES += -DCMDLINE="\"$(BOOTSTRAP_CMDLINE)\""
125 DEFINES += -DPLATFORM_TYPE=\"$(PLATFORM_TYPE)\"
126 DEFINES += -DPLATFORM_TYPE_$(PLATFORM_TYPE)
128 MOD_ADDR = 0x02000000
130 CPPFLAGS += $(BID_PKG_CONFIG_CFLAGS)
132 ifeq ($(SUPPORT_CC_$(ARCH)-$(PLATFORM_TYPE)),)
133 $(error A proper PLATFORM_TYPE must be set for a build.)
136 DRV_LIBS-ppc32 = -ldrivers_of
137 DRV_LIBS = -ldrivers_uart $(DRV_LIBS-$(ARCH))
139 LDSCRIPT = bootstrap.ld
142 vpath bootstrap.ld.in $(SRC_DIR)/ARCH-$(ARCH)
144 # can be overwritten by Makeconf.local
147 REALMODE_LOADING ?= 0
150 ifneq ($(REALMODE_LOADING)$(RML),00)
151 REALMODE_LOADING := 1
152 $(error Info: Default reloc needs to be 0x00100000)
153 # And if you have done so you probably need to relink sigma0 and/or moe
158 CPPFLAGS += -DSINGLE_SECTION
167 ENTRY_FN := $(shell echo "$(ENTRY)" | tr '[ ]' '[_]' )
169 # we need to re-do if some things change
170 # we do not need to track BOOTSTRACE_CMDLINE as it's only used in startup.cc
171 # and that is regenerated every time
172 REDO_TEXT_CMD = echo "$(ENTRY) '$(COMPRESS)' '$(RAM_SIZE_MB)' '$(PLATFORM_TYPE)' '$(LOADER_MBI)'"
173 .redo-change-tracker: FORCE
174 $(VERBOSE)if test ! -r "$@" || \
175 ! $(REDO_TEXT_CMD) | cmp -s "$@"; then \
176 $(REDO_TEXT_CMD) > $@; \
181 INSTALL_TARGET = $(BOOTSTRAP_ELF_NAME) bootstrap_$(ENTRY_FN) bootstrap_$(ENTRY_FN).elf
183 INSTALL_TARGET += bootstrap32.elf
184 BOOTSTRAP_LINK_SOURCE = bootstrap32.elf
186 BOOTSTRAP_LINK_SOURCE = $(BOOTSTRAP_ELF_NAME)
189 bootstrap_$(ENTRY_FN): $(BOOTSTRAP_LINK_SOURCE)
190 $(VERBOSE)$(LN) -f $< $@
192 bootstrap_$(ENTRY_FN).elf: $(BOOTSTRAP_LINK_SOURCE)
193 $(VERBOSE)$(LN) -f $< $@
195 bootstrap_$(ENTRY_FN).raw: bootstrap.raw
196 $(VERBOSE)$(LN) -f $< $@
198 bootstrap_$(ENTRY_FN).uimage: bootstrap.uimage
199 $(VERBOSE)$(LN) -f $< $@
201 ifeq ($(ARCH),$(filter $(ARCH),arm ppc32))
202 BID_POST_PROG_LINK_MSG_$(BOOTSTRAP_ELF_NAME) = echo -e " ==> Stripping $@"
203 BID_POST_PROG_LINK_$(BOOTSTRAP_ELF_NAME) = \
204 $(VERBOSE)LANG=C $(NM) -C $@ | \
205 LANG=C $(GREP) -q "V vtable for Platform_base" || \
206 { echo -e "\nERROR: Missing at least one platform instantiation.\n"; \
207 exit 1; } ; $(STRIP) $@
209 ifneq ($(BOOTSTRAP_DO_RAW_IMAGE)$(BOOTSTRAP_DO_UIMAGE),)
210 BOOTSTRAP_RAW := bootstrap.raw
211 INSTALL_TARGET += bootstrap.raw bootstrap_$(ENTRY_FN).raw
212 ifneq ($(BOOTSTRAP_DO_UIMAGE),)
213 ifneq ($(shell command -v $(MKIMAGE)),)
214 BOOTSTRAP_UIMAGE := bootstrap.uimage
215 INSTALL_TARGET += bootstrap.uimage bootstrap_$(ENTRY_FN).uimage
217 $(info mkimage($(MKIMAGE)) missing, not building bootstrap.uimage)
223 all:: $(addprefix $(IMAGES_DIR)/,$(INSTALL_TARGET))
224 $(VERBOSE)echo " Image size(s) in bytes:"
225 $(VERBOSE)for f in $(filter bootstrap_$(ENTRY_FN).elf bootstrap.raw bootstrap.uimage, $(INSTALL_TARGET)); do \
226 find . -name $$f -printf " %30f: %s\n"; \
228 $(if $(BOOTSTRAP_DO_RAW_IMAGE),$(VERBOSE)echo " Start address: $(patsubst -Ttext=%,%,$(LDFLAGS_bootstrap.elf))")
229 $(VERBOSE)echo " --> Build-Nr: $$(cat .build_nr)"
231 # install images into easy to reach directory in build dir
232 $(IMAGES_DIR)/%: % $(IMAGES_DIR)/Makefile
233 $(VERBOSE)if [ "$(ENTRY)" != "auto-build-entry" ]; then \
234 echo " ==> Installing $< in image directory"; \
235 $(LN) -sf $(PWD)/$< $(dir $@); \
238 $(IMAGES_DIR)/Makefile: $(SRC_DIR)/Make.rules
239 @echo " ==> Preparing image directory"
240 $(VERBOSE)install -d $(dir $@)
241 $(VERBOSE)$(ECHO) "# Automatically generated by bootstrap" > $@
242 $(VERBOSE)$(ECHO) "\$$(if \$$(MAKECMDGOALS),%,a):" >> $@
243 $(VERBOSE)$(ECHO) " \$$(MAKE) -C .. image \$$(if \$$(MAKECMDGOALS),E=\"\$$@\")" >> $@
245 INSTALL_TARGET = bootstrap
248 ifneq ($(REALMODE_LOADING),0)
250 CPPFLAGS += -DREALMODE_LOADING -DSINGLE_SECTION
251 # don't install bootstrap_$(ENTRY_FN).elf
252 INSTALL_TARGET = bootstrap.load
255 ifneq ($(LOADER_MBI),0)
256 SRC_CC += loader_mbi.cc
257 MOD_ADDR = 0x00150000
258 CPPFLAGS += -DLOADER_MBI
261 ifneq ($(COMPRESS),0)
262 SRC_C += uncompress.c gunzip.c
263 CPPFLAGS += -DCOMPRESS
265 CPPFLAGS += -DPLACE_MODULES_AT_MODADDR
268 ifneq ($(RAM_SIZE_MB),)
269 CPPFLAGS += -DRAM_SIZE_MB=$(RAM_SIZE_MB)
272 CXXFLAGS += -fno-rtti -fno-exceptions
273 CXXFLAGS += $(call checkcxx,-fno-threadsafe-statics)
276 ifeq ($(filter clean cleanall,$(MAKECMDGOALS)),)
277 $(info Building entry "$(ENTRY)".)
278 BUILD_DUMMY := $(shell SEARCHPATH="$(BOOTSTRAP_SEARCH_PATH):$(BOOTSTRAP_MODULE_PATH_BINLIB)" \
279 CROSS_COMPILE=$(SYSTEM_TARGET) \
281 OPT_COMPRESS=$(COMPRESS) \
283 $(SRC_DIR)/build.pl $(BOOTSTRAP_MODULES_LIST) "$(ENTRY)" 1>&2 \
284 || echo X-build-failed-X)
285 ifeq ($(BUILD_DUMMY),X-build-failed-X)
286 $(error Processing of module list failed!)
288 BUILD_DUMMY := $(shell echo $(BUILD_DUMMY))
290 # mod.make.inc is generated by build.pl
294 OBJS_$(BOOTSTRAP_ELF_NAME) += $(MODULE_OBJECT_FILES)
295 CPPFLAGS += -DIMAGE_MODE
296 BOOTSTRAP_LD_dep += mod.make.inc
297 STARTUP_C_dep := mod.make.inc
300 CPPFLAGS += -DMODADDR=$(MOD_ADDR)
303 L4_LIBS = -static -nostdlib $(DRV_LIBS) -lcxx_base -lcxx_io
304 L4_LIBS += -luc_c_minimal $(GCCLIB)
306 all:: $(BOOTSTRAP_RAW)
308 # image for use with pxelinux
309 bootstrap.load: $(TARGET_BIN) bootsect.o.img setup.o.img
311 $(VERBOSE)objcopy -O binary -R .note -R .comment -S $< $<.load.bin
312 $(VERBOSE)cat bootsect.o.img setup.o.img $<.load.bin > $@
314 bootsect.o.img: ARCH-x86/bootsect.S Makefile
316 $(VERBOSE)$(CC) -traditional -nostdinc -nostdlib -c $<
317 $(VERBOSE)$(LD) -m elf_i386 -Ttext 0x0 -o $@ -s --oformat binary \
319 $(VERBOSE)chmod -x $@
321 setup.o.img: ARCH-x86/setup.S Makefile
323 $(VERBOSE)$(CC) -traditional -nostdinc -nostdlib -DARCH_$(ARCH) -c $<
324 $(VERBOSE)$(LD) -m elf_i386 -Ttext 0x0 -o $@ -s --oformat binary \
326 $(VERBOSE)dd if=/dev/zero bs=1 count=$$((3072 - `wc -c < setup.o.img`)) >> setup.o.img 2> /dev/null
327 $(VERBOSE)chmod -x $@
329 # raw version without ELF, primarily useful for ARM
330 $(BOOTSTRAP_RAW): $(TARGET_BIN)
332 $(VERBOSE)cp $< $@.tmp
333 $(VERBOSE)$(OBJCOPY) -O binary $@.tmp $@
334 $(VERBOSE)chmod -x $@
335 $(VERBOSE)$(RM) $@.tmp
346 MKIMAGE_ARCH = $(if $(filter ppc32,$(ARCH)),ppc,$(ARCH))
348 # u-boot image, based on raw-version
349 $(BOOTSTRAP_UIMAGE): $(BOOTSTRAP_RAW).$(BOOTSTRAP_UIMAGE_COMPRESSION)
351 $(VERBOSE)$(MKIMAGE) -e $(call default_reloc,$(ARCH)) \
352 -a $(call default_reloc,$(ARCH)) -A $(MKIMAGE_ARCH) \
353 -C $(BOOTSTRAP_UIMAGE_COMPRESSION) \
354 -n "L4 Image #$$(cat .build_nr)" \
357 $(TARGET): $(LDSCRIPT) $(OBJS_$(TARGET))
360 increment_build_nr = \
361 $(shell if [ -e .build_nr ]; then \
362 nr=$$(($$(cat .build_nr) + 1)); \
366 echo $$nr > .build_nr; echo $$nr)
369 startup.o: $(STARTUP_C_dep)
370 startup.o: CPPFLAGS += -DBUILD_DATE="\"$(shell date)\"" -DBUILD_NR=\"$(call increment_build_nr)\"
372 $(LDSCRIPT): $(LDSCRIPT).in $(GENERAL_D_LOC) $(BOOTSTRAP_LD_dep)
374 $(VERBOSE)cpp -P $(CPPFLAGS) -DLINKADDR=$(strip $(call default_reloc,$(ARCH))) $< $@;
377 $(VERBOSE)$(RM) mod.make.inc mod*.bin mbi_modules.bin $(LDSCRIPT)
378 $(VERBOSE)$(RM) setup.o.img bootsect.o.img
379 $(VERBOSE)$(RM) mod*.bin
380 $(VERBOSE)$(RM) $(SRC32_C:.c=.o32) $(SRC32_S:.S=.o32)
381 $(VERBOSE)$(RM) .redo-change-tracker
384 $(VERBOSE)$(RM) bootstrap_* bootstrap.*
388 vpath %.c $(SRC_DIR)/ARCH-amd64
389 vpath %.S $(SRC_DIR)/ARCH-amd64
390 vpath %.c $(SRC_DIR)/ARCH-amd64/boot32
391 vpath %.S $(SRC_DIR)/ARCH-amd64/boot32
392 vpath bootstrap.ld.in $(SRC_DIR)/ARCH-x86
394 SRC32_C = boot_cpu.c boot_kernel.c load_elf.c minilibc_support.c
395 SRC32_S = boot.S boot_idt.S
396 OBJ32 = $(SRC32_S:.S=.o32) $(SRC32_C:.c=.o32)
397 CC32 = $(filter-out -m64, $(CC)) -m32
398 CFLAGS32 := $(filter-out -m64, $(CFLAGS)) -m32
400 $(OBJ_DIR)/ARCH-amd64/libc32/OBJ-$(ARCH)_$(CPU)/libc32.a: FORCE
401 $(VERBOSE)$(MAKE) O=$(OBJ_BASE) -C $(SRC_DIR)/ARCH-amd64/libc32
403 bootstrap32.elf: $(OBJ32) bootstrap32.bin $(OBJ_DIR)/ARCH-amd64/libc32/OBJ-$(ARCH)_$(CPU)/libc32.a
405 $(VERBOSE)$(CC32) -o $@ -nostdlib -static \
406 -Wl,-T,$(SRC_DIR)/ARCH-amd64/boot32/bootstrap32.ld,--gc-sections $^ -lgcc
407 $(VERBOSE)chmod 755 $@
409 bootstrap: bootstrap32.elf
410 $(VERBOSE)$(LN) -f $^ $@
412 bootstrap32.bin: $(BOOTSTRAP_ELF_NAME)
414 $(VERBOSE)$(OBJCOPY) -S $< bootstrap64.bin
415 $(VERBOSE)chmod -x bootstrap64.bin
416 $(VERBOSE)$(OBJCOPY) -B i386 -I binary -O elf32-i386 bootstrap64.bin $@
420 $(VERBOSE)$(CC32) -o $@ -c $(DEPEND_FLAG) \
421 $(CPPFLAGS) $(CFLAGS32) $(call absfilename,$<)
425 $(VERBOSE)$(CC32) -o $@ -c $(DEPEND_FLAG) \
426 $(CPPFLAGS) $(CFLAGS32) $(call absfilename,$<)
429 $(VERBOSE)PWD=$(call absfilename,$(SRC_DIR)/ARCH-amd64/libc32) \
430 $(MAKE) -C $(SRC_DIR)/ARCH-amd64/libc32 $@
433 bootstrap: $(BOOTSTRAP_ELF_NAME)
434 $(VERBOSE)$(LN) -f $^ $@