## ## This file is part of the LinuxBIOS project. ## ## Copyright (C) 2006-2007 coresystems GmbH ## Written by Stefan Reinauer for coresystems GmbH. ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ## ifeq ($(CONFIG_ARCH_X86),y) INITCFLAGS := $(CFLAGS) -I$(src)/include/cpu/generic/x86 -I$(src)/include \ -fno-builtin SILENT := &> /dev/null # # Build the ROM Image / LAR archive # # LinuxBIOS v3 is completely modular. One module, the bootblock (stage0), # is mandatory. All modules are packed together in a LAR archive. # The LAR archive may contain any number of stages, payloads and option ROMs. # ROM_SIZE := $(shell expr $(CONFIG_LINUXBIOS_ROMSIZE_KB) \* 1024 ) $(obj)/linuxbios.rom: $(obj)/linuxbios.bootblock $(obj)/util/lar/lar lzma $(obj)/linuxbios.initram $(obj)/linuxbios.stage2 payload $(Q)rm -rf $(obj)/lar.tmp $(Q)mkdir $(obj)/lar.tmp $(Q)mkdir $(obj)/lar.tmp/normal $(Q)cp $(obj)/linuxbios.initram $(obj)/lar.tmp/normal/initram $(Q)cp $(obj)/linuxbios.stage2 $(obj)/lar.tmp/normal/stage2 $(Q)cp $(CONFIG_PAYLOAD) $(obj)/lar.tmp/normal/payload $(Q)printf " LAR $(subst $(shell pwd)/,,$(@))\n" $(Q)cd $(obj)/lar.tmp && ../util/lar/lar -c ../linuxbios.rom . \ -s $(ROM_SIZE) -b $(obj)/linuxbios.bootblock $(Q)# QEMU wants bios.bin: $(Q)# Run "qemu -L build/ -nographic -hda /dev/zero". $(Q)printf " CP $(subst $(shell pwd)/,,$(obj)/bios.bin)\n" $(Q)cp $@ $(obj)/bios.bin $(obj)/linuxbios.bootblock: $(obj)/linuxbios.vpd $(obj)/stage0.init $(Q)printf " BUILD $(subst $(shell pwd)/,,$(@))\n" $(Q)cat $^ > $@ # # LinuxBIOS stage0. This is the LinuxBIOS "boot block code". # It enables Cache-as-RAM and parses the LAR archive for an # initram module and the various stages and payload files. # STAGE0_CONSOLE_OBJ = vtxprintf.o vsprintf.o console.o STAGE0_LIB_OBJ = uart8250.o mem.o elfboot.o lar.o STAGE0_ARCH_X86_OBJ = cachemain.o serial.o archelfboot.o ifeq ($(CONFIG_CAR_TYPE_I586),y) STAGE0_CAR_OBJ = stage0_i586.o else STAGE0_CAR_OBJ = stage0_i586.o endif STAGE0_OBJ := $(patsubst %,$(obj)/console/%,$(STAGE0_CONSOLE_OBJ)) \ $(patsubst %,$(obj)/lib/%,$(STAGE0_LIB_OBJ)) \ $(patsubst %,$(obj)/arch/x86/%,$(STAGE0_ARCH_X86_OBJ)) \ $(patsubst %,$(obj)/arch/x86/%,$(STAGE0_CAR_OBJ)) $(obj)/stage0.init: $(STAGE0_OBJ) $(Q)# We need to be careful. If stage0.o gets bigger than $(Q)# 0x4000 - 0x100, we will end up with a 4 gig file. $(Q)# I wonder if that behavior is on purpose. $(Q)printf " CC $(subst $(shell pwd)/,,$(@))\n" $(Q)$(CC) -nostdlib -static -T $(src)/arch/x86/ldscript.ld \ $(STAGE0_OBJ) -o $(obj)/stage0.o $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" $(Q)objcopy -O binary $(obj)/stage0.o $(obj)/stage0.init $(Q)printf " TEST $(subst $(shell pwd)/,,$(@))\n" $(Q)test `wc -c < $(obj)/stage0.init` -gt 16128 && \ printf "Error. Bootblock got too big.\n" || true # # This is the rest of LinuxBIOS (v2: linuxbios_ram.rom). # Is this maybe platform independent, except for the "drivers"? # Where should it be built, maybe in device/? # # TODO: This should be compressed with the default compressor. # STAGE2_LIB_OBJ = stage2.o clog2.o mem.o malloc.o tables.o delay.o compute_ip_checksum.o STAGE2_ARCH_X86_OBJ = archtables.o linuxbios_table.o udelay_io.o STAGE2_ARCH_X86_OBJ += pci_ops_auto.o pci_ops_conf1.o pci_ops_conf2.o STAGE2_ARCH_X86_OBJ += keyboard.o i8259.o isa-dma.o STAGE2_DYNAMIC_OBJ = statictree.o STAGE2_OBJ := $(patsubst %,$(obj)/lib/%,$(STAGE2_LIB_OBJ)) \ $(patsubst %,$(obj)/arch/x86/%,$(STAGE2_ARCH_X86_OBJ)) \ $(patsubst %,$(obj)/device/%,$(STAGE2_DEVICE_OBJ)) \ $(patsubst %,$(obj)/mainboard/$(MAINBOARDDIR)/%,$(STAGE2_MAINBOARD_OBJ)) \ $(patsubst %,$(obj)/mainboard/$(MAINBOARDDIR)/%,$(STAGE2_DYNAMIC_OBJ)) STAGE2_OBJ += $(STAGE2_CHIPSET_OBJ) # x86emu wants libgcc LIBGCC_FILE_NAME := $(shell $(CC) -print-libgcc-file-name) STAGE2_OBJ += $(obj)/util/x86emu/libx86emu.a $(LIBGCC_FILE_NAME) $(obj)/linuxbios.stage2: $(obj)/stage0.init $(STAGE2_OBJ) $(Q)# leave a .o with full symbols in it for debugging. $(Q)printf " LD $(subst $(shell pwd)/,,$(@))\n" $(Q)$(LD) -R $(obj)/stage0.o -Ttext 0x1000 --entry=stage2 \ -o $(obj)/linuxbios.stage2.o $(STAGE2_OBJ) $(Q)printf " OBJCOPY $(subst $(shell pwd)/,,$(@))\n" $(Q)objcopy -O binary $(obj)/linuxbios.stage2.o $(obj)/linuxbios.stage2 # # The payload as we love it. Get it from somewhere. # Is this a place to incorporate buildrom? # # TODO: This is not implemented yet. # TODO: This needs to be compressed with the default compressor. # payload: $(Q)printf " BUILD PAYLOAD (skipped)\n" # # Build rules. # $(obj)/arch/x86/%.o: $(src)/arch/x86/%.c $(Q)mkdir -p $(obj)/arch/x86 $(Q)printf " CC $(subst $(shell pwd)/,,$(@))\n" $(Q)$(CC) $(INITCFLAGS) -c $< -o $@ $(obj)/mainboard/$(MAINBOARDDIR)/%.o: $(src)/mainboard/$(MAINBOARDDIR)/%.c $(Q)mkdir -p $(obj)/mainboard/$(MAINBOARDDIR) $(Q)printf " CC $(subst $(shell pwd)/,,$(@))\n" $(Q)$(CC) $(INITCFLAGS) -c $< -o $@ # Building asm stub. $(obj)/arch/x86/stage0%.o: $(src)/arch/x86/stage0%.S $(Q)printf " CC $(subst $(shell pwd)/,,$(@))\n" $(Q)$(CC) -E $(LINUXBIOSINCLUDE) $< \ -o $(obj)/arch/x86/stage0_asm.s -DBOOTBLK=0x1f00 -DRESRVED=0xf0 \ -DDATE=\"`date +%Y/%m/%d`\" $(Q)printf " AS $(subst $(shell pwd)/,,$(@))\n" $(Q)$(AS) $(obj)/arch/x86/stage0_asm.s -o $@ endif