Add LinuxBoot as a module, prep for nerf branch merge (#305)

Move board configuration into `boards/` instead of `config/`
Fix mistake in building kernel module tree before kernel was done.
Allow per-board initrd builds (#278)
Allow per-board configurations for things (#304)
This commit is contained in:
Trammell hudson 2018-02-05 11:27:45 -05:00
parent 755c9e91ea
commit cf8509e0f5
Failed to extract signature
8 changed files with 260 additions and 76 deletions

169
Makefile
View File

@ -4,16 +4,25 @@ modules-y :=
pwd := $(shell pwd)
packages := $(pwd)/packages
build := $(pwd)/build
config := $(pwd)/build
config := $(pwd)/config
INSTALL := $(pwd)/install
log_dir := $(build)/log
BOARD ?= qemu
CONFIG := $(pwd)/boards/$(BOARD).config
ifneq "y" "$(shell [ -r '$(CONFIG)' ] && echo y)"
$(error $(CONFIG): board configuration does not exist)
endif
include $(CONFIG)
# Controls how many parallel jobs are invoked in subshells
CPUS := $(shell nproc)
MAKE_JOBS ?= -j$(CPUS) --max-load 16
# Create the log directory if it doesn't already exist
BUILD_LOG := $(shell [ -d "$(log_dir)" ] || mkdir -p "$(log_dir)")
BUILD_LOG := $(shell mkdir -p "$(log_dir)" "$(build)/$(BOARD)" )
# Some things want usernames, we use the current checkout
# so that they are reproducible
@ -28,13 +37,13 @@ ifeq "$V" ""
VERBOSE_REDIRECT := > /dev/null
# Not verbose, so we only show the header
define do =
@echo "$(DATE) $1 $2"
@echo "$(DATE) $1 $(2:$(pwd)/%=%)"
@$3
endef
else
# Verbose, so we display what we are doing
define do =
@echo "$(DATE) $1 $2"
@echo "$(DATE) $1 $(2:$(pwd)/%=%)"
$3
endef
endif
@ -54,12 +63,12 @@ initrd_bin_dir := $(initrd_dir)/bin
$(shell mkdir -p "$(initrd_lib_dir)" "$(initrd_bin_dir)")
$(shell echo "Initrd: $initrd_dir")
ifeq "$(CONFIG)" ""
CONFIG := config/qemu-moc.config
$(eval $(shell echo >&2 "$(DATE) CONFIG is not set, defaulting to $(CONFIG)"))
endif
include $(CONFIG)
#ifeq "$(CONFIG)" ""
#CONFIG := config/qemu-moc.config
#$(eval $(shell echo >&2 "$(DATE) CONFIG is not set, defaulting to $(CONFIG)"))
#endif
#
#include $(CONFIG)
# We are running our own version of make,
# proceed with the build.
@ -68,9 +77,6 @@ include $(CONFIG)
SHELL := /bin/bash
.SHELLFLAGS := -o pipefail -c
# Currently supported targets are x230, chell and qemu
BOARD ?= qemu
# If musl-libc is being used in the initrd, set the heads_cc
# variable to point to it.
musl_dep := musl
@ -95,8 +101,10 @@ CROSS_TOOLS := \
ifeq "$(CONFIG_COREBOOT)" "y"
all: $(BOARD).rom
else ifeq "$(CONFIG_LINUXBOOT)" "y"
all: $(build)/$(BOARD)/linuxboot.rom
else
all: linux.intermediate initrd-$(BOARD).cpio.xz
$(error "$(BOARD): neither CONFIG_COREBOOT nor CONFIG_LINUXBOOT is set?")
endif
# Disable all built in rules
@ -134,6 +142,36 @@ $(foreach m,$1,\
)
endef
#
# Build a cpio from a directory
#
define do-cpio =
$(call do,CPIO,$1,\
( cd "$2"; \
find . \
| cpio \
--quiet \
-H newc \
-o \
) > "$1.tmp" \
)
@if ! cmp --quiet "$1.tmp" "$1" ; then \
mv "$1.tmp" "$1" ; \
else \
rm "$1.tmp" ; \
fi
endef
define do-copy =
$(call do,CP,$2,\
sha256sum "$(1:$(pwd)/%=%)" ; \
if ! cmp --quiet "$1" "$2" ; then \
cp -a "$1" "$2"; \
fi
)
endef
#
# Generate the targets for a module.
#
@ -257,7 +295,7 @@ endef
#
define initrd_bin_add =
$(initrd_bin_dir)/$(notdir $1): $1
$(call do,INSTALL-BIN,$$<,cp -a "$$<" "$$@")
$(call do,INSTALL-BIN,$$(<:$(pwd)/%=%),cp -a "$$<" "$$@")
@$(CROSS)strip --preserve-dates "$$@" 2>&-; true
initrd_bins += $(initrd_bin_dir)/$(notdir $1)
endef
@ -265,11 +303,13 @@ endef
define initrd_lib_add =
$(initrd_lib_dir)/$(notdir $1): $1
$(call do,INSTALL-LIB,$$@,$(CROSS)strip --preserve-dates -o "$$@" "$$<")
$(call do,INSTALL-LIB,$(1:$(pwd)/%=%),\
$(CROSS)strip --preserve-dates -o "$$@" "$$<")
initrd_libs += $(initrd_lib_dir)/$(notdir $1)
endef
# Only some modules have binaries that we install
# Shouldn't this be specified in the module file?
bin_modules-$(CONFIG_KEXEC) += kexec
bin_modules-$(CONFIG_TPMTOTP) += tpmtotp
bin_modules-$(CONFIG_PCIUTILS) += pciutils
@ -292,7 +332,7 @@ $(foreach m, $(modules-y), \
#$(foreach _, $(call outputs,xen), $(eval $(call initrd_bin,$_)))
# hack to install busybox into the initrd
initrd-$(BOARD).cpio: busybox.intermediate
$(build)/$(BOARD)/heads.cpio: busybox.intermediate
initrd_bins += $(initrd_bin_dir)/busybox
$(initrd_bin_dir)/busybox: $(build)/$(busybox_dir)/busybox
@ -320,22 +360,6 @@ $(build)/$(coreboot_dir)/util/cbmem/cbmem: \
$(MAKE) -C "$(dir $@)" CC="$(heads_cc)" \
)
#
# Linux kernel module installation
#
# This is special cases since we have to do a special strip operation on
# the kernel modules to make them fit into the ROM image.
#
define linux_module =
$(build)/$(linux_dir)/$1: linux.intermediate
initrd-$(BOARD).cpio: $(initrd_lib_dir)/modules/$(notdir $1)
$(initrd_lib_dir)/modules/$(notdir $1): $(build)/$(linux_dir)/$1
@-mkdir -p "$(initrd_lib_dir)/modules"
$(call do,INSTALL-MODULE,$$@,$(CROSS)strip --preserve-dates --strip-debug -o "$$@" "$$<")
endef
$(call map,linux_module,$(linux_modules-y))
#
# initrd image creation
#
@ -349,24 +373,47 @@ $(call map,linux_module,$(linux_modules-y))
# is a chance the build will not be reproducible (although
# unlikely that their device file has a different major/minor)
#
#
initrd-$(BOARD).cpio: $(initrd_bins) $(initrd_libs) blobs/dev.cpio FORCE
$(call do,OVERLAY,initrd,\
tar -C ./initrd -cf - . | tar -C "$(initrd_dir)" -xf - \
)
$(call do,INSTALL,$(CONFIG),cp "$(CONFIG)" "$(initrd_dir)/etc/config")
$(call do,CPIO,$@, \
cd "$(initrd_dir)"; \
find . \
| cpio --quiet -H newc -o \
| $(pwd)/bin/cpio-clean \
$(pwd)/blobs/dev.cpio \
- \
> "$(pwd)/$@" \
)
$(call do,RM,$(initrd_dir),$(RM) -rf "$(initrd_dir)")
initrd.intermediate: initrd-$(BOARD).cpio
initrd-y += $(pwd)/blobs/dev.cpio
initrd-y += $(build)/$(BOARD)/heads.cpio
initrd-y += $(build)/$(BOARD)/modules.cpio
initrd-y += $(build)/$(BOARD)/tools.cpio
initrd.intermediate: $(build)/$(BOARD)/initrd.cpio.xz
$(build)/$(BOARD)/initrd.cpio.xz: $(initrd-y)
$(call do,CPIO-CLEAN,$@,\
$(pwd)/bin/cpio-clean \
$^ \
| xz \
--check=crc32 \
--lzma2=dict=1MiB \
-9 \
| dd bs=512 conv=sync > "$@" \
)
@sha256sum "$(@:$(pwd)/%=%)"
#
# The heads.cpio is built from the initrd directory in the
# Heads tree.
#
$(build)/$(BOARD)/heads.cpio: FORCE
$(call do-cpio,$@,$(pwd)/initrd)
#
# The tools initrd is made from all of the things that we've
# created during the submodule build.
#
$(build)/$(BOARD)/tools.cpio: \
$(initrd_bins) \
$(initrd_libs) \
$(call do,INSTALL,$(CONFIG), \
mkdir -p "$(initrd_dir)/etc" ; \
cp "$(CONFIG)" "$(initrd_dir)/etc/config" \
)
$(call do-cpio,$@,$(initrd_dir))
@$(RM) -rf "$(initrd_dir)"
#
@ -375,26 +422,10 @@ initrd.intermediate: initrd-$(BOARD).cpio
# and the extra padding is to ensure that it can be concatenated to
# other cpio files.
#
coreboot.intermediate: $(build)/$(coreboot_dir)/initrd-$(BOARD).cpio.xz
$(build)/$(coreboot_dir)/initrd-$(BOARD).cpio.xz: initrd-$(BOARD).cpio.xz
coreboot.intermediate: $(build)/$(BOARD)/initrd.cpio.xz
coreboot.intermediate: $(build)/$(BOARD)/bzImage
#$(build)/$(coreboot_dir)/initrd-$(BOARD).cpio.xz: initrd-$(BOARD).cpio.xz
%.xz: %
$(call do,COMPRESS,$<,\
xz \
--check=crc32 \
--lzma2=dict=1MiB \
-9 \
< "$<" \
| dd bs=512 conv=sync > "$@" \
)
@sha256sum "$@"
# hack for the coreboot to find the linux kernel
$(build)/$(coreboot_dir)/bzImage: $(build)/$(linux_dir)/arch/x86/boot/bzImage
$(call do,COPY,$@,cp "$^" "$@")
@sha256sum "$@"
coreboot.intermediate: $(build)/$(coreboot_dir)/bzImage
# Each board output has its own fixup required to turn the coreboot.rom

View File

@ -0,0 +1,35 @@
# Configuration for emulating LinuxBoot+Heads with qemu
#
BOARD=qemu-linuxboot
CONFIG_LINUXBOOT=y
linuxboot-board := qemu
#CONFIG_CRYPTSETUP=y
#CONFIG_FLASHROM=y
#CONFIG_GPG=y
CONFIG_KEXEC=y
CONFIG_UTIL_LINUX=y
#CONFIG_LVM2=y
#CONFIG_MBEDTLS=y
CONFIG_PCIUTILS=y
#CONFIG_POPT=y
#CONFIG_QRENCODE=y
#CONFIG_TPMTOTP=y
#CONFIG_XEN=y
CONFIG_DROPBEAR=y
CONFIG_LINUX_USB=y
#CONFIG_LINUX_IGB=y
#CONFIG_LINUX_MEGARAID=y
#CONFIG_LINUX_E1000E=y
CONFIG_LINUX_SCSI_GDTH=y
CONFIG_LINUX_ATA=y
CONFIG_LINUX_AHCI=y
CONFIG_BOOTSCRIPT=/bin/generic-init
CONFIG_BOOT_REQ_HASH=n
CONFIG_BOOT_REQ_ROLLBACK=n
CONFIG_BOOT_DEV="/dev/sda1"
CONFIG_USB_BOOT_DEV="/dev/sdb1"

View File

@ -3,6 +3,9 @@
# and it is NERF, not coreboot.
BOARD=r630
CONFIG_LINUXBOOT=y
CONFIG_LINUXBOOT_ROM=blobs/r630-1.3.6.rom
#CONFIG_CRYPTSETUP=y
CONFIG_FLASHROM=y
#CONFIG_GPG=y

View File

@ -11,6 +11,9 @@
#
BOARD=s2600wf
CONFIG_LINUXBOOT=y
CONFIG_LINUXBOOT_ROM=blobs/s2600wf.rom
#CONFIG_CRYPTSETUP=y
#CONFIG_FLASHROM=y
CONFIG_GPG=y

View File

@ -2,6 +2,9 @@
# and it is NERF, not coreboot.
BOARD=winterfell
CONFIG_LINUXBOOT=y
CONFIG_LINUXBOOT_ROM=blobs/winterfell.rom
#CONFIG_CRYPTSETUP=y
CONFIG_FLASHROM=y
#CONFIG_GPG=y
@ -17,8 +20,6 @@ CONFIG_TPMTOTP=y
CONFIG_DROPBEAR=y
CONFIG_LINUX_USB=y
CONFIG_LINUX_IGB=y
CONFIG_LINUX_MEGARAID=y
CONFIG_LINUX_MLX4=y
CONFIG_BOOTSCRIPT=/bin/generic-init

View File

@ -16,8 +16,12 @@ linux_configure := \
CROSS_COMPILE="$(CROSS)" \
oldconfig \
linux_output := arch/x86/boot/bzImage
linux_config := linux.config
linux_output += $(build)/$(BOARD)/bzImage
# linux.intermediate: $(linux_output)
#linux_output += $(build)/$(BOARD)/modules.cpio
linux_config ?= linux.config # Allow board config to specialize Linux
# qemu
linux_modules-$(CONFIG_LINUX_E1000) += drivers/net/ethernet/intel/e1000/e1000.ko
@ -43,6 +47,10 @@ linux_modules-$(CONFIG_LINUX_AHCI) += drivers/ata/libahci_platform.ko
linux_modules-$(CONFIG_LINUX_SFC) += drivers/net/ethernet/sfc/sfc.ko
linux_modules-$(CONFIG_LINUX_SFC) += drivers/net/mdio.ko
# Mellanox ConnectX-3 (winterfell)
linux_modules-$(CONFIG_LINUX_MLX4) += drivers/net/ethernet/mellanox/mlx4/mlx4_core.ko
linux_modules-$(CONFIG_LINUX_MLX4) += drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko
# USB modules for both types of controllers
linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/host/ehci-hcd.ko
linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/host/ehci-pci.ko
@ -50,9 +58,6 @@ linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/host/xhci-hcd.ko
linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/host/xhci-pci.ko
linux_modules-$(CONFIG_LINUX_USB) += drivers/usb/storage/usb-storage.ko
linux_modules-$(CONFIG_LINUX_MLX4) += drivers/net/ethernet/mellanox/mlx4/mlx4_core.ko
linux_modules-$(CONFIG_LINUX_MLX4) += drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko
EXTRA_FLAGS := -fdebug-prefix-map=$(pwd)=heads -gno-record-gcc-switches
linux_target := \
@ -68,3 +73,46 @@ linux_target := \
# We cross compile linux now
linux_depends := musl-cross
#
# Linux kernel module installation
#
# This is special cases since we have to do a special strip operation on
# the kernel modules to make them fit into the ROM image.
#
module_initrd_dir := $(shell mktemp -d)
module_initrd_lib_dir := $(module_initrd_dir)/lib/modules
FOO := $(shell mkdir -p "$(module_initrd_lib_dir)")
define linux_module =
# Each module depends on building the Linux kernel
$(build)/$(linux_dir)/$1: linux.intermediate # $(build)/$(BOARD)/bzImage
# The cpio file will depend on every module
$(build)/$(BOARD)/modules.cpio: $(module_initrd_lib_dir)/$(notdir $1)
# Strip the modules when we install them so that they will be extra small
$(module_initrd_lib_dir)/$(notdir $1): $(build)/$(linux_dir)/$1
$(call do,INSTALL-MODULE,$1, \
$(CROSS)strip \
--preserve-dates \
--strip-debug \
-o "$$@" \
"$$<" \
)
endef
$(call map,linux_module,$(linux_modules-y))
# We can't rebuild the module initrd until the kernel has been rebuilt
$(build)/$(BOARD)/modules.cpio: linux.intermediate
$(call do-cpio,$@,$(module_initrd_dir))
@$(RM) -rf "$(module_initrd_dir)"
# hack for the coreboot to find the linux kernel
$(build)/$(BOARD)/bzImage: linux.intermediate
$(build)/$(BOARD)/bzImage: $(build)/$(linux_dir)/arch/x86/boot/bzImage
$(call do-copy,$<,$@)

63
modules/linuxboot Normal file
View File

@ -0,0 +1,63 @@
modules-$(CONFIG_LINUXBOOT) += linuxboot
linuxboot_version := git
linuxboot_repo := https://github.com/osresearch/linuxboot
linuxboot_dir := linuxboot-$(linuxboot_version)
linuxboot_configure := \
touch .config
# linuxboot builds are specialized on a per-target basis.
# They can be specialized by defining $(linuxboot-board),
# otherwise it is assumed that it will have the same name
# as the Heads BOARD.
linuxboot-board ?= $(BOARD)
linuxboot_target := \
BOARD:=$(linuxboot-board) \
KERNEL=$(build)/$(BOARD)/bzImage \
INITRD=$(build)/$(BOARD)/initrd.cpio.xz \
all
#
# Most mainboards will define a ROM file that contains the vendor ROM
# for the image. If so, we copy it into the linuxboot tree.
#
ifneq "$(CONFIG_LINUXBOOT_ROM)" ""
ifneq "y" "$(shell [ -r '$(CONFIG_LINUXBOOT_ROM)' ] && echo y)"
$(error $(CONFIG_LINUXBOOT_ROM): you must provide a ROM file)
endif
linuxboot-vendor-rom := $(build)/$(linuxboot_dir)/boards/$(linuxboot-board)/$(notdir $(CONFIG_LINUXBOOT_ROM))
linuxboot.intermediate: $(linuxboot-vendor-rom)
$(linuxboot-vendor-rom): $(CONFIG_LINUXBOOT_ROM)
$(call do-copy,$<,$@)
endif
# The output file from the LinuxBoot build is a full ROM
# ready to flash onto the mainboard. There might be partial
# firmware volumes as well, but that depends on the board
# so this only retrieves the final one
linuxboot_output := $(build)/$(linuxboot_dir)/build/$(linuxboot-board)/linuxboot.rom
$(linuxboot_output): linuxboot.intermediate
$(build)/$(BOARD)/linuxboot.rom: $(linuxboot_output)
$(call do-copy,$<,$@)
# The Linux kernel and Heads initrd must be built before linuxboot
# unless the user has specified "FAST=1" on the make command line,
# which will assume that the kernel and initrd are fresh
ifneq "$(FAST)" "1"
linuxboot_depends := linux initrd
endif
# The bzImage and initrd must be built, but the dependency
# might not be there if FAST is defined.
linuxboot.intermediate: \
$(build)/$(BOARD)/bzImage \
$(build)/$(BOARD)/initrd.cpio.xz \