diff --git a/payloads/external/LinuxBoot/Kconfig b/payloads/external/LinuxBoot/Kconfig index 31b238ca4f..ccf62b8237 100644 --- a/payloads/external/LinuxBoot/Kconfig +++ b/payloads/external/LinuxBoot/Kconfig @@ -41,18 +41,16 @@ config LINUXBOOT_ARM64 endchoice -config LINUXBOOT_ARCH - string - default "amd64" if LINUXBOOT_X86_64 - default "i386" if LINUXBOOT_X86 - default "arm64" if LINUXBOOT_ARM64 - comment "Linux kernel" config LINUXBOOT_COMPILE_KERNEL bool "Compile kernel" default n +if LINUXBOOT_COMPILE_KERNEL +comment "parse linux crosscompiler with: LINUXBOOT_CROSS_COMPILE" +endif + config LINUXBOOT_KERNEL_PATH string "Path to kernel" default "Image" @@ -61,32 +59,85 @@ config LINUXBOOT_KERNEL_PATH if LINUXBOOT_COMPILE_KERNEL choice - prompt "Kernel version" + prompt "Kernel release" default LINUXBOOT_KERNEL_STABLE + help + Choose the kernel release. + + Select 'custom' if your want to define the kernel version. + For more information about the current 'mainline', 'stable' or 'longterm' + version, visit: https://www.kernel.org/ + +config LINUXBOOT_KERNEL_MAINLINE + bool "mainline" + help + Mainline kernel version config LINUXBOOT_KERNEL_STABLE - bool "4.14.67" + bool "stable" help Stable kernel version -config LINUXBOOT_KERNEL_LATEST - bool "4.18.5" +config LINUXBOOT_KERNEL_LONGTERM + bool "longterm" help - Latest kernel version + Longterm (LTS) kernel version + +config LINUXBOOT_KERNEL_CUSTOM + bool "custom" + help + Custom kernel version endchoice -config LINUXBOOT_KERNEL_VERSION - string - default "4.18.5" if LINUXBOOT_KERNEL_LATEST - default "4.14.67" if LINUXBOOT_KERNEL_STABLE +config LINUXBOOT_KERNEL_CUSTOM_VERSION + string "kernel version" + default "" + depends on LINUXBOOT_KERNEL_CUSTOM + help + Choose the Linux kernel version number. (x.x.x) + Release candidate kernels (rc) are currently are not supported. + +choice + prompt "Kernel configuration" + default LINUXBOOT_KERNEL_ARCH_DEFAULT_CONFIG + +config LINUXBOOT_KERNEL_ARCH_DEFAULT_CONFIG + bool "Default architecture configuration" + help + This option will use the default configuration for the + selected architecture. + +config LINUXBOOT_KERNEL_CUSTOM_CONFIG + bool "Custom (def)config file" + help + +endchoice config LINUXBOOT_KERNEL_CONFIGFILE - string "Kernel config file" - default "" + string "Config file path" + default "defconfig" + depends on LINUXBOOT_KERNEL_CUSTOM_CONFIG help - Add your own kernel configuration file. Otherwise a default - minimal defconfig is used. + Path to the kernel configuration file. + + Note: this can be a defconfig file or a complete .config file. + +choice LINUXBOOT_KERNEL_FORMAT + prompt "Kernel binary format" + default LINUXBOOT_KERNEL_BZIMAGE if LINUXBOOT_X86 || LINUXBOOT_X86_64 + default LINUXBOOT_KERNEL_UIMAGE if LINUXBOOT_ARM64 + +config LINUXBOOT_KERNEL_BZIMAGE + bool "bzImage" + depends on LINUXBOOT_X86 || LINUXBOOT_X86_64 + +config LINUXBOOT_KERNEL_UIMAGE + bool "uImage" + depends on LINUXBOOT_ARM64 + +endchoice + config LINUXBOOT_DTB_FILE string "Compiled devicetree file" diff --git a/payloads/external/LinuxBoot/Makefile b/payloads/external/LinuxBoot/Makefile index a67b16ae70..5840e8e211 100644 --- a/payloads/external/LinuxBoot/Makefile +++ b/payloads/external/LinuxBoot/Makefile @@ -45,6 +45,10 @@ endif ifeq ($(CONFIG_LINUXBOOT_COMPILE_KERNEL),y) ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64) kernel: initramfs + if [[ ! -f "$(top)/$(CONFIG_LINUXBOOT_DTB_FILE)" ]]; then \ + echo "<< Linux kernel devicetree is missing. >>"; \ + exit 1; \ + fi $(MAKE) -f targets/linux.mk else kernel: diff --git a/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its b/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its index 26a81207b5..3087e69a74 100644 --- a/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its +++ b/payloads/external/LinuxBoot/arm64/kernel_fdt_lzma.its @@ -46,7 +46,7 @@ }; ramdisk-1 { description = "Compressed Initramfs"; - data = /incbin/("u-initramfs"); + data = /incbin/("initramfs"); type = "ramdisk"; arch = "arm64"; os = "linux"; diff --git a/payloads/external/LinuxBoot/targets/linux.mk b/payloads/external/LinuxBoot/targets/linux.mk index 91118d4496..5632a0b923 100644 --- a/payloads/external/LinuxBoot/targets/linux.mk +++ b/payloads/external/LinuxBoot/targets/linux.mk @@ -13,83 +13,120 @@ ## 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 +ARCH-$(CONFIG_LINUXBOOT_X86_64)=x86_64 +ARCH-$(CONFIG_LINUXBOOT_X86)=x86 +ARCH-$(CONFIG_LINUXBOOT_ARM64)=arm64 -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 +TAG-$(CONFIG_LINUXBOOT_KERNEL_MAINLINE)=mainline +TAG-$(CONFIG_LINUXBOOT_KERNEL_STABLE)=stable +TAG-$(CONFIG_LINUXBOOT_KERNEL_LONGTERM)=longterm + +pwd:=$(shell pwd) +top:=../../.. +project_dir=linuxboot +tarball_dir:=$(project_dir)/tarball +decompress_flag=.done + +OBJCOPY:=$(LINUXBOOT_CROSS_COMPILE)objcopy + +ifeq ($(CONFIG_LINUXBOOT_KERNEL_CUSTOM),y) + kernel_version:=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM_VERSION) +else + kernel_version:=$(shell curl -s -k https://www.kernel.org/feeds/kdist.xml | \ + sed -n -e 's@.*\(.*\).*@\1@p' | \ + awk -F ',' '/$(TAG-y)/{ print $$3 }' | \ + head -n 1) endif -OBJCOPY:=$(LINUXBOOT_COMPILE)objcopy +kernel_dir=$(project_dir)/kernel-$(subst .,_,$(kernel_version)) +kernel_tarball=linux-$(kernel_version).tar +kernel_mirror=https://mirrors.edge.kernel.org/pub/linux/kernel + +ifeq ($(findstring x2.6.,x$(kernel_version)),x2.6.) +kernel_mirror_path := $(kernel_mirror)/v2.6 +else ifeq ($(findstring x3.,x$(kernel_version)),x3.) +kernel_mirror_path := $(kernel_mirror)/v3.x +else ifeq ($(findstring x4.,x$(kernel_version)),x4.) +kernel_mirror_path := $(kernel_mirror)/v4.x +else ifeq ($(findstring x5.,x$(kernel_version)),x5.) +kernel_mirror_path := $(kernel_mirror)/v5.x +endif all: kernel -toolchain: - if [[ ! -x "$(LINUXBOOT_COMPILE)gcc" ]]; then \ - echo "Toolchain '$(LINUXBOOT_COMPILE)*' is missing."; \ - exit 1; \ +lookup: +ifeq ($(kernel_version),) + $(error kernel version lookup failed for $(TAG-y) release) +endif + @echo " WWW Kernel [$(TAG-y)] $(kernel_version)" + +fetch: +ifneq ($(shell [[ -d "$(kernel_dir)" && -f "$(kernel_dir)/$(decompress_flag)" ]];echo $$?),0) + mkdir -p $(tarball_dir) + if [[ ! -f $(tarball_dir)/$(kernel_tarball).xz && ! -f $(tarball_dir)/$(kernel_tarball).xz ]]; then \ + echo " WWW $(kernel_tarball).xz"; \ + cd $(tarball_dir); \ + curl -OLs "$(kernel_mirror_path)/$(kernel_tarball).xz"; \ + cd $(pwd); \ 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),) +unpack: fetch + if [[ -d "$(kernel_dir)" && ! -f "$(kernel_dir)/$(decompress_flag)" ]]; then \ + rm -rf $(kernel_dir); \ + fi + if [[ ! -d "$(kernel_dir)" ]]; then \ + mkdir $(kernel_dir); \ + echo " XZ $(kernel_tarball).xz"; \ + tar xJf $(tarball_dir)/$(kernel_tarball).xz --strip 1 -C $(kernel_dir); \ + fi + touch $(kernel_dir)/$(decompress_flag) + +$(kernel_dir)/.config: unpack + @echo " CONFIG Linux $(kernel_version)" +ifeq ($(CONFIG_LINUXBOOT_KERNEL_CUSTOM_CONFIG),y) 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 +else + cp $(ARCH-y)/defconfig $(kernel_dir)/.config +endif + $(MAKE) -C $(kernel_dir) olddefconfig ARCH=$(ARCH-y) + +build: $(kernel_dir)/.config + @echo " MAKE Linux $(kernel_version)" +ifeq ($(CONFIG_LINUXBOOT_KERNEL_BZIMAGE),y) + $(MAKE) -C $(kernel_dir) CROSS_COMPILE=$(LINUXBOOT_CROSS_COMPILE) ARCH=$(ARCH-y) bzImage +else +ifeq ($(CONFIG_LINUXBOOT_KERNEL_UIMAGE),y) + $(MAKE) -C $(kernel_dir) CROSS_COMPILE=$(LINUXBOOT_CROSS_COMPILE) ARCH=$(ARCH-y) vmlinux +endif 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 +ifeq ($(CONFIG_LINUXBOOT_KERNEL_BZIMAGE),y) +$(top)/$(CONFIG_LINUXBOOT_KERNEL): build + @echo " CP bzImage" + cp $(kernel_dir)/arch/x86/boot/bzImage $@ +else +ifeq ($(CONFIG_LINUXBOOT_KERNEL_UIMAGE),y) +$(project_dir)/target.dtb: $(top)/$(CONFIG_LINUXBOOT_DTB_FILE) 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 +$(top)/$(CONFIG_LINUXBOOT_KERNEL): build $(project_dir)/vmlinux.bin.lzma $(project_dir)/target.dtb cp $(project_dir)/../arm64/kernel_fdt_lzma.its $(project_dir) - cp $(PWD)/$(CONFIG_LINUXBOOT_INITRAMFS)$(CONFIG_LINUXBOOT_INITRAMFS_SUFFIX) $(project_dir)/u-initramfs + cp $(top)/$(CONFIG_LINUXBOOT_INITRAMFS)$(CONFIG_LINUXBOOT_INITRAMFS_SUFFIX) $(project_dir)/initramfs mkimage -f $(project_dir)/kernel_fdt_lzma.its $@ +else + $(error Kernel image format not found) + exit 1 +endif endif -ifneq (,$(filter $(CONFIG_LINUXBOOT_ARCH),i386 amd64)) -kernel: $(project_dir)/bzImage -else ifeq ($(CONFIG_LINUXBOOT_ARCH),arm64) -kernel: $(project_dir)/uImage +ifneq ($(TAG-y),) +kernel: lookup $(top)/$(CONFIG_LINUXBOOT_KERNEL) +else +kernel: $(top)/$(CONFIG_LINUXBOOT_KERNEL) endif -.PHONY: kernel config toolchain +.PHONY: all kernel build unpack fetch check diff --git a/payloads/external/LinuxBoot/targets/u-root.mk b/payloads/external/LinuxBoot/targets/u-root.mk index 86c9019dce..28d7dbbb33 100644 --- a/payloads/external/LinuxBoot/targets/u-root.mk +++ b/payloads/external/LinuxBoot/targets/u-root.mk @@ -18,6 +18,10 @@ go_path_dir=$(project_dir)/go uroot_bin=$(project_dir)/u-root uroot_package=github.com/u-root/u-root +ARCH-$(CONFIG_LIBUXBOOT_X86_64)=amd64 +ARCH-$(CONFIG_LINUXBOOT_X86)=i386 +ARCH-$(CONFIG_LINUXBOOT_ARM64)=arm64 + go_version=$(shell go version | sed -nr 's/.*go([0-9]+\.[0-9]+.?[0-9]?).*/\1/p' ) go_version_major=$(shell echo $(go_version) | sed -nr 's/^([0-9]+)\.([0-9]+)\.?([0-9]*)$$/\1/p') go_version_minor=$(shell echo $(go_version) | sed -nr 's/^([0-9]+)\.([0-9]+)\.?([0-9]*)$$/\2/p') @@ -64,7 +68,7 @@ build: checkout GOPATH=$(go_path_dir) go build -o $(uroot_bin) $(uroot_package) u-root: build - GOARCH=$(CONFIG_LINUXBOOT_ARCH) GOPATH=$(go_path_dir) $(uroot_bin) \ + GOARCH=$(ARCH-y) GOPATH=$(go_path_dir) $(uroot_bin) \ $(uroot_args) -o $(project_dir)/initramfs_u-root.cpio $(uroot_cmds) .PHONY: all u-root build checkout get version diff --git a/payloads/external/Makefile.inc b/payloads/external/Makefile.inc index 5f9d8006d3..5edbb81b18 100644 --- a/payloads/external/Makefile.inc +++ b/payloads/external/Makefile.inc @@ -260,13 +260,22 @@ payloads/external/iPXE/ipxe/ipxe.rom ipxe: $(DOTCONFIG) linuxboot: $(MAKE) -C payloads/external/LinuxBoot \ CPUS=$(CPUS) \ - CONFIG_LINUXBOOT_ARCH=$(CONFIG_LINUXBOOT_ARCH) \ + CONFIG_LINUXBOOT_X86_64=$(CONFIG_LINUXBOOT_X86_64) \ + CONFIG_LINUXBOOT_X86=$(CONFIG_LINUXBOOT_X86) \ + CONFIG_LINUXBOOT_ARM64=$(CONFIG_LINUXBOOT_ARM64) \ CONFIG_LINUXBOOT_KERNEL=$(CONFIG_PAYLOAD_FILE) \ CONFIG_LINUXBOOT_INITRAMFS=$(CONFIG_LINUX_INITRD) \ CONFIG_LINUXBOOT_INITRAMFS_SUFFIX=$(CONFIG_LINUXBOOT_INITRAMFS_SUFFIX) \ CONFIG_LINUXBOOT_COMPILE_KERNEL=$(CONFIG_LINUXBOOT_COMPILE_KERNEL) \ CONFIG_LINUXBOOT_BUILD_INITRAMFS=$(CONFIG_LINUXBOOT_BUILD_INITRAMFS) \ - CONFIG_LINUXBOOT_KERNEL_VERSION=$(CONFIG_LINUXBOOT_KERNEL_VERSION) \ + CONFIG_LINUXBOOT_KERNEL_MAINLINE=$(CONFIG_LINUXBOOT_KERNEL_MAINLINE) \ + CONFIG_LINUXBOOT_KERNEL_STABLE=$(CONFIG_LINUXBOOT_KERNEL_STABLE) \ + CONFIG_LINUXBOOT_KERNEL_LONGTERM=$(CONFIG_LINUXBOOT_KERNEL_LONGTERM) \ + CONFIG_LINUXBOOT_KERNEL_CUSTOM=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM) \ + CONFIG_LINUXBOOT_KERNEL_CUSTOM_VERSION=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM_VERSION) \ + CONFIG_LINUXBOOT_KERNEL_CUSTOM_CONFIG=$(CONFIG_LINUXBOOT_KERNEL_CUSTOM_CONFIG) \ + CONFIG_LINUXBOOT_KERNEL_BZIMAGE=$(CONFIG_LINUXBOOT_KERNEL_BZIMAGE) \ + CONFIG_LINUXBOOT_KERNEL_UIMAGE=$(CONFIG_LINUXBOOT_KERNEL_UIMAGE) \ CONFIG_LINUXBOOT_KERNEL_CONFIGFILE=$(CONFIG_LINUXBOOT_KERNEL_CONFIGFILE) \ CONFIG_LINUXBOOT_INITRAMFS_COMPRESSION_XZ=$(CONFIG_LINUXBOOT_INITRAMFS_COMPRESSION_XZ) \ CONFIG_LINUXBOOT_UROOT=$(CONFIG_LINUXBOOT_UROOT) \