summaryrefslogtreecommitdiff
path: root/payloads/external/LinuxBoot
diff options
context:
space:
mode:
authorMarcello Sylvester Bauer <info@marcellobauer.com>2018-11-11 18:03:26 +0100
committerPhilipp Deppenwiese <zaolin.daisuki@gmail.com>2018-11-28 18:28:45 +0000
commit78d0256f1d2bb09e4430f2bd56b58df78d54311b (patch)
tree193c5725f2d51a6dba1454ccf7861566bffce6a3 /payloads/external/LinuxBoot
parent5d8f02f3ef624e9055cc48cd354497a583133b1d (diff)
LinuxBoot: refactor payload
Clean and refactor the structure of the LinuxBoot payload integration, to make it more modular and readable. The kernel and initramfs should handled in separated makefiles. tested with: - qemu-i440fx (x86, x86_64) - cavium CN8100 (arm64) Change-Id: I41d0275a5f7efb920e881f43b0acda29f41ee221 Signed-off-by: Marcello Sylvester Bauer <info@marcellobauer.com> Reviewed-on: https://review.coreboot.org/c/29581 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
Diffstat (limited to 'payloads/external/LinuxBoot')
-rw-r--r--payloads/external/LinuxBoot/Kconfig55
-rw-r--r--payloads/external/LinuxBoot/Makefile95
-rw-r--r--payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its28
-rw-r--r--payloads/external/LinuxBoot/targets/linux.mk95
-rw-r--r--payloads/external/LinuxBoot/targets/u-root.mk19
5 files changed, 191 insertions, 101 deletions
diff --git a/payloads/external/LinuxBoot/Kconfig b/payloads/external/LinuxBoot/Kconfig
index ba8b5a6d08..046faef287 100644
--- a/payloads/external/LinuxBoot/Kconfig
+++ b/payloads/external/LinuxBoot/Kconfig
@@ -1,6 +1,7 @@
## This file is part of the coreboot project.
##
## Copyright (C) 2017 Facebook Inc.
+## Copyright (C) 2018 9elements Cyber Security
##
## 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
@@ -16,6 +17,7 @@ if PAYLOAD_LINUXBOOT
choice
prompt "Architecture"
+ depends on LINUXBOOT_COMPILE_KERNEL || LINUXBOOT_BUILD_INITRAMFS
default LINUXBOOT_X86_64
config LINUXBOOT_X86_64
@@ -42,9 +44,22 @@ endchoice
config LINUXBOOT_ARCH
string
default "amd64" if LINUXBOOT_X86_64
- default "386" if LINUXBOOT_X86
+ default "i386" if LINUXBOOT_X86
default "arm64" if LINUXBOOT_ARM64
+comment "Linux kernel"
+
+config LINUXBOOT_COMPILE_KERNEL
+ bool "Compile kernel"
+ default n
+
+config LINUXBOOT_KERNEL_PATH
+ string "Path to kernel"
+ default "Image"
+ depends on !LINUXBOOT_COMPILE_KERNEL
+
+if LINUXBOOT_COMPILE_KERNEL
+
choice
prompt "Kernel version"
default LINUXBOOT_KERNEL_STABLE
@@ -73,19 +88,35 @@ config LINUXBOOT_KERNEL_CONFIGFILE
Add your own kernel configuration file. Otherwise a default
minimal defconfig is used.
+config LINUXBOOT_DTB_FILE
+ string "Compiled devicetree file"
+ depends on LINUXBOOT_ARM64
+ default ""
+
+endif #LINUXBOOT_COMPILE_KERNEL
+
config LINUX_COMMAND_LINE
string "Kernel command-line"
default ""
help
Add your own kernel command-line arguments.
-config LINUXBOOT_DTB_FILE
- string "Compiled devicetree file"
- depends on LINUXBOOT_ARM64
- default ""
-
config PAYLOAD_FILE
- default "payloads/external/LinuxBoot/linuxboot/kernel-image"
+ default "payloads/external/LinuxBoot/linuxboot/bzImage" if LINUXBOOT_COMPILE_KERNEL && ( LINUXBOOT_X86 || LINUXBOOT_X86_64 )
+ default "payloads/external/LinuxBoot/linuxboot/uImage" if LINUXBOOT_COMPILE_KERNEL && LINUXBOOT_ARM64
+ default LINUXBOOT_KERNEL_PATH if !LINUXBOOT_COMPILE_KERNEL
+
+comment "Linux initramfs"
+
+config LINUXBOOT_BUILD_INITRAMFS
+ bool "Build initramfs"
+ default n
+
+config LINUXBOOT_INITRAMFS_PATH
+ string "Path to initramfs"
+ depends on !LINUXBOOT_BUILD_INITRAMFS
+
+if LINUXBOOT_BUILD_INITRAMFS
choice
prompt "Payload Mode"
@@ -128,9 +159,13 @@ config LINUXBOOT_UROOT_FILES
Path to directory containing root structure for embedding into the
initramfs.
+endif #LINUXBOOT_UROOT
+
+endif #LINUXBOOT_BUILD_INITRAMFS
+
config LINUX_INITRD
string
- default "payloads/external/LinuxBoot/linuxboot/initramfs.cpio.xz"
+ default "payloads/external/LinuxBoot/linuxboot/initramfs_u-root.cpio.xz" if LINUXBOOT_UROOT
+ default LINUXBOOT_INITRAMFS_PATH if !LINUXBOOT_BUILD_INITRAMFS
-endif
-endif
+endif #PAYLOAD_LINUXBOOT
diff --git a/payloads/external/LinuxBoot/Makefile b/payloads/external/LinuxBoot/Makefile
index 6d852cb2df..a9b35fc120 100644
--- a/payloads/external/LinuxBoot/Makefile
+++ b/payloads/external/LinuxBoot/Makefile
@@ -1,6 +1,7 @@
## This file is part of the coreboot project.
##
## Copyright (C) 2017 Facebook Inc.
+## Copyright (C) 2018 9elements Cyber Security
##
## 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
@@ -12,90 +13,48 @@
## GNU General Public License for more details.
##
-kernel_tarball=https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-$(CONFIG_LINUXBOOT_KERNEL_VERSION).tar.xz
project_dir=linuxboot
kernel_dir=$(project_dir)/kernel
unexport $(COREBOOT_EXPORTS)
unexport MAKEFLAGS
-XGCCPATH?=$(PWD)/util/crossgcc/xgcc/bin
-ifeq ($(CONFIG_LINUXBOOT_ARCH),386)
-LINUXBOOT_COMPILE?=$(XGCCPATH)/i386-linux-
-ARCH?=x86
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),amd64)
-LINUXBOOT_COMPILE?=$(XGCCPATH)/x86_64-linux-
-ARCH?=x86_64
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
-LINUXBOOT_COMPILE?=$(XGCCPATH)/aarch64-linux-
-ARCH?=arm64
-endif
-
-OBJCOPY:=$(LINUXBOOT_COMPILE)objcopy
-
all: linuxboot
-toolchain:
- if [[ ! -x "$(LINUXBOOT_COMPILE)gcc" ]]; then \
- echo "Toolchain '$(LINUXBOOT_COMPILE)*' is missing."; \
+u-root:
+ $(MAKE) -f targets/u-root.mk
+
+ifeq ($(CONFIG_LINUXBOOT_BUILD_INITRAMFS),y)
+ifeq ($(CONFIG_LINUXBOOT_UROOT),y)
+initramfs: u-root
+endif
+else
+ifneq ($(CONFIG_LINUXBOOT_INITRAMFS),)
+initramfs:
+ if [[ ! -f "$(top)/$(CONFIG_LINUXBOOT_INITRAMFS)" ]]; then \
+ echo "<< Linux initramfs '$(CONFIG_LINUXBOOT_INITRAMFS)' is missing. >>"; \
exit 1; \
fi
-
-$(kernel_dir)/.config:
- echo " WWW Download Linux $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
- mkdir -p $(kernel_dir)
-ifeq ("$(wildcard $(kernel_dir)/README)","")
- curl -s $(kernel_tarball) | tar xJ -C $(kernel_dir) --strip 1
endif
-
-config: $(kernel_dir)/.config
- echo " CONFIG Linux $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
-ifneq ($(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE),)
- cp $(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE) $(kernel_dir)/.config
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),386)
- cp x86/defconfig $(kernel_dir)/.config
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),amd64)
- cp x86_64/defconfig $(kernel_dir)/.config
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
- cp arm64/defconfig $(kernel_dir)/.config
endif
-ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),386 amd64))
-$(kernel_dir)/arch/x86/boot/bzImage: config toolchain
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
-$(kernel_dir)/vmlinux: config toolchain
-endif
- echo " MAKE Kernel $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
- $(MAKE) -C $(kernel_dir) olddefconfig CROSS_COMPILE=$(LINUXBOOT_COMPILE) ARCH=$(ARCH)
- $(MAKE) -C $(kernel_dir) -j $(CPUS) CROSS_COMPILE=$(LINUXBOOT_COMPILE) ARCH=$(ARCH)
-
-ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),386 amd64))
-$(project_dir)/kernel-image: $(kernel_dir)/arch/x86/boot/bzImage
- cp $< $@
-else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
-$(project_dir)/vmlinux.bin: $(kernel_dir)/vmlinux
- $(OBJCOPY) -O binary $< $@
-
-$(project_dir)/target.dtb: $(PWD)/$(CONFIG_LINUXBOOT_DTB_FILE)
- cp $< $@
-
-$(project_dir)/vmlinux.bin.lzma: $(project_dir)/vmlinux.bin
- xz -c -k -f --format=lzma --lzma1=dict=1MiB,lc=3,lp=0,pb=3 $< > $@
-
-$(project_dir)/kernel-image: $(project_dir)/vmlinux.bin.lzma $(project_dir)/../arm64/kernel_fdt_lzma.its $(project_dir)/target.dtb $(PWD)/$(CONFIG_LINUX_INITRD)
- cp $(project_dir)/../arm64/kernel_fdt_lzma.its $(project_dir)
- mkimage -f $(project_dir)/kernel_fdt_lzma.its $@
+ifeq ($(CONFIG_LINUXBOOT_COMPILE_KERNEL),y)
+ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
+kernel: initramfs
+ $(MAKE) -f targets/linux.mk
+else
+kernel:
+ $(MAKE) -f targets/linux.mk
endif
-
-ifeq ($(CONFIG_LINUXBOOT_UROOT),y)
-$(PWD)/$(CONFIG_LINUX_INITRD):
- $(MAKE) -f targets/u-root.mk
else
-$(PWD)/$(CONFIG_LINUX_INITRD):
- echo "Building without u-root support"
+kernel:
+ if [[ ! -f "$(top)/$(CONFIG_LINUXBOOT_KERNEL)" ]]; then \
+ echo "<< Linux kernel '$(CONFIG_LINUXBOOT_KERNEL)' is missing. >>"; \
+ exit 1; \
+ fi
endif
-linuxboot: $(project_dir)/kernel-image $(PWD)/$(CONFIG_LINUX_INITRD)
+linuxboot: kernel initramfs
clean:
if [ -d "$(kernel_dir)" ]; then rm -rf $(kernel_dir); fi
@@ -104,4 +63,4 @@ clean:
distclean:
rm -rf $(project_dir)
-.PHONY: config patch payload clean distclean clone fetch all toolchain
+.PHONY: linuxboot kernel initramfs u-root clean distclean
diff --git a/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its b/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its
index 50f6a2f4d8..26a81207b5 100644
--- a/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its
+++ b/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its
@@ -45,20 +45,20 @@
};
};
ramdisk-1 {
- description = "Compressed Initramfs";
- data = /incbin/("initramfs.cpio.xz");
- type = "ramdisk";
- arch = "arm64";
- os = "linux";
- compression = "none";
- load = <00000000>;
- entry = <00000000>;
- hash-1 {
- algo = "sha1";
- };
- hash-2 {
- algo = "sha256";
- };
+ description = "Compressed Initramfs";
+ data = /incbin/("u-initramfs");
+ type = "ramdisk";
+ arch = "arm64";
+ os = "linux";
+ compression = "none";
+ load = <00000000>;
+ entry = <00000000>;
+ hash-1 {
+ algo = "sha1";
+ };
+ hash-2 {
+ algo = "sha256";
+ };
};
};
diff --git a/payloads/external/LinuxBoot/targets/linux.mk b/payloads/external/LinuxBoot/targets/linux.mk
new file mode 100644
index 0000000000..07700b8605
--- /dev/null
+++ b/payloads/external/LinuxBoot/targets/linux.mk
@@ -0,0 +1,95 @@
+## This file is part of the coreboot project.
+##
+## Copyright (C) 2017 Facebook Inc.
+## Copyright (C) 2018 9elements Cyber Security
+##
+## 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; version 2 of the License.
+##
+## 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.
+##
+
+kernel_tarball=https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-$(CONFIG_LINUXBOOT_KERNEL_VERSION).tar.xz
+project_dir=linuxboot
+kernel_dir=$(project_dir)/kernel
+
+XGCCPATH?=$(PWD)/util/crossgcc/xgcc/bin
+ifeq ($(CONFIG_LINUXBOOT_ARCH),i386)
+LINUXBOOT_COMPILE?=$(XGCCPATH)/i386-linux-
+ARCH?=x86
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),amd64)
+LINUXBOOT_COMPILE?=$(XGCCPATH)/x86_64-linux-
+ARCH?=x86_64
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
+LINUXBOOT_COMPILE?=$(XGCCPATH)/aarch64-linux-
+ARCH?=arm64
+endif
+
+OBJCOPY:=$(LINUXBOOT_COMPILE)objcopy
+
+all: kernel
+
+toolchain:
+ if [[ ! -x "$(LINUXBOOT_COMPILE)gcc" ]]; then \
+ echo "Toolchain '$(LINUXBOOT_COMPILE)*' is missing."; \
+ exit 1; \
+ fi
+
+$(kernel_dir)/.config:
+ echo " WWW Download Linux $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
+ mkdir -p $(kernel_dir)
+ifeq ("$(wildcard $(kernel_dir)/README)","")
+ curl -s $(kernel_tarball) | tar xJ -C $(kernel_dir) --strip 1
+endif
+
+config: $(kernel_dir)/.config
+ echo " CONFIG Linux $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
+ifneq ($(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE),)
+ cp $(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE) $(kernel_dir)/.config
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),i386)
+ cp x86/defconfig $(kernel_dir)/.config
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),amd64)
+ cp x86_64/defconfig $(kernel_dir)/.config
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
+ cp arm64/defconfig $(kernel_dir)/.config
+endif
+
+ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),i386 amd64))
+$(kernel_dir)/arch/x86/boot/bzImage: config toolchain
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
+$(kernel_dir)/vmlinux: config toolchain
+endif
+ echo " MAKE Kernel $(CONFIG_LINUXBOOT_KERNEL_VERSION)"
+ $(MAKE) -C $(kernel_dir) olddefconfig CROSS_COMPILE=$(LINUXBOOT_COMPILE) ARCH=$(ARCH)
+ $(MAKE) -C $(kernel_dir) -j $(CPUS) CROSS_COMPILE=$(LINUXBOOT_COMPILE) ARCH=$(ARCH)
+
+ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),i386 amd64))
+$(project_dir)/bzImage: $(kernel_dir)/arch/x86/boot/bzImage
+ cp $< $@
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
+$(project_dir)/vmlinux.bin: $(kernel_dir)/vmlinux
+ $(OBJCOPY) -O binary $< $@
+
+$(project_dir)/target.dtb: $(PWD)/$(CONFIG_LINUXBOOT_DTB_FILE)
+ cp $< $@
+
+$(project_dir)/vmlinux.bin.lzma: $(project_dir)/vmlinux.bin
+ xz -c -k -f --format=lzma --lzma1=dict=1MiB,lc=3,lp=0,pb=3 $< > $@
+
+$(project_dir)/uImage: $(project_dir)/vmlinux.bin.lzma $(project_dir)/../arm64/kernel_fdt_lzma.its $(project_dir)/target.dtb
+ cp $(project_dir)/../arm64/kernel_fdt_lzma.its $(project_dir)
+ cp $(PWD)/$(CONFIG_LINUXBOOT_INITRAMFS) $(project_dir)/u-initramfs
+ mkimage -f $(project_dir)/kernel_fdt_lzma.its $@
+endif
+
+ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),i386 amd64))
+kernel: $(project_dir)/bzImage
+else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64)
+kernel: $(project_dir)/uImage
+endif
+
+.PHONY: kernel config toolchain
diff --git a/payloads/external/LinuxBoot/targets/u-root.mk b/payloads/external/LinuxBoot/targets/u-root.mk
index 27f184e41a..5cb19bb339 100644
--- a/payloads/external/LinuxBoot/targets/u-root.mk
+++ b/payloads/external/LinuxBoot/targets/u-root.mk
@@ -1,6 +1,7 @@
## This file is part of the coreboot project.
##
## Copyright (C) 2017 Facebook Inc.
+## Copyright (C) 2018 9elements Cyber Security
##
## 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
@@ -22,7 +23,7 @@ project_dir=$(shell pwd)/linuxboot
project_name=u-root
go_path_dir=$(shell pwd)/linuxboot/go
-all: build
+all: u-root
check:
ifeq ("$(go_version)","")
@@ -66,29 +67,29 @@ $(uroot_dir)/u-root: $(uroot_dir)/u-root.go
echo " GO u-root"
cd $(uroot_dir); GOPATH=$(go_path_dir) go build u-root.go
-$(project_dir)/initramfs.cpio.xz: checkout $(uroot_dir)/u-root
+$(project_dir)/initramfs_u-root.cpio.xz: checkout $(uroot_dir)/u-root
echo " MAKE u-root $(CONFIG_LINUXBOOT_UROOT_VERSION)"
ifneq ($(CONFIG_LINUXBOOT_UROOT_COMMANDS),)
ifneq ($(CONFIG_LINUXBOOT_UROOT_FILES),)
cd $(uroot_dir); GOARCH=$(CONFIG_LINUXBOOT_ARCH) GOPATH=$(go_path_dir) ./u-root \
- -build=bb -files $(CONFIG_LINUXBOOT_UROOT_FILES) -o $(project_dir)/initramfs.cpio \
+ -build=bb -files $(CONFIG_LINUXBOOT_UROOT_FILES) -o $(project_dir)/initramfs_u-root.cpio \
$(patsubst %,cmds/%,$(CONFIG_LINUXBOOT_UROOT_COMMANDS))
else
cd $(uroot_dir); GOARCH=$(CONFIG_LINUXBOOT_ARCH) GOPATH=$(go_path_dir) ./u-root \
- -build=bb -o $(project_dir)/initramfs.cpio \
+ -build=bb -o $(project_dir)/initramfs_u-root.cpio \
$(patsubst %,cmds/%,$(CONFIG_LINUXBOOT_UROOT_COMMANDS))
endif
else
ifneq ($(CONFIG_LINUXBOOT_UROOT_FILES),)
cd $(uroot_dir); GOARCH=$(CONFIG_LINUXBOOT_ARCH) GOPATH=$(go_path_dir) ./u-root \
- -build=bb -files $(CONFIG_LINUXBOOT_UROOT_FILES) -o $(project_dir)/initramfs.cpio coreboot-app
+ -build=bb -files $(CONFIG_LINUXBOOT_UROOT_FILES) -o $(project_dir)/initramfs_u-root.cpio coreboot-app
else
cd $(uroot_dir); GOARCH=$(CONFIG_LINUXBOOT_ARCH) GOPATH=$(go_path_dir) ./u-root \
- -build=bb -o $(project_dir)/initramfs.cpio coreboot-app
+ -build=bb -o $(project_dir)/initramfs_u-root.cpio coreboot-app
endif
endif
- xz -f --check=crc32 -9 --lzma2=dict=1MiB --threads=$(CPUS) $(project_dir)/initramfs.cpio
+ xz -f --check=crc32 -9 --lzma2=dict=1MiB --threads=$(CPUS) $(project_dir)/initramfs_u-root.cpio
-build: $(project_dir)/initramfs.cpio.xz
+u-root: $(project_dir)/initramfs_u-root.cpio.xz
-.PHONY: build checkout fetch all check
+.PHONY: u-root checkout fetch all check