Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@ permissions: read-all
on:
push:
branches: ["main"]
paths-ignore:
- 'bootloader/**'
pull_request:
branches: ["main"]
paths-ignore:
- 'bootloader/**'

env:
CARGO_TERM_COLOR: always
Expand Down
101 changes: 101 additions & 0 deletions bootloader/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#!/bin/bash

set -eu

readonly ARCH=${ARCH:=$(uname -m)}
readonly TARGET_DIR=target/bootloader-${ARCH}
readonly LINUX_SRC=https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.18.5.tar.xz

function fetch_source() {
if [[ -d ${TARGET_DIR}/linux ]]; then
return 0
fi

pushd ${TARGET_DIR}

echo "Fetching Linux source..."
wget ${LINUX_SRC} -O linux.tar.xz
tar xf linux.tar.xz
mv linux-* linux

popd
}

function build_linux() {
case ${ARCH} in
x86|x86_64|amd64)
local arch=x86
local image=arch/x86/boot/bzImage
;;
arm|arm64|aarch64)
local arch=arm64
local image=arch/arm64/boot/Image
;;
esac

local kconfig="${TARGET_DIR}/linux/.config"

cp bootloader/config ${kconfig}
cat bootloader/config-${arch} >> ${kconfig}
echo 'CONFIG_INITRAMFS_SOURCE="../initramfs/initramfs.cpio"' \
>> ${kconfig}

make -C ${TARGET_DIR}/linux olddefconfig LLVM=1 ARCH=${arch}

# Validate the configuration
sort -b -o ${kconfig}.old.sorted ${kconfig}.old
local missing=$(comm -23 ${kconfig}.old.sorted <(sort -b ${kconfig}))
if [[ -n ${missing} ]]; then
echo "Missing configuration options:"
echo "${missing}"
exit 1
fi

echo "Building Linux kernel..."
make -C ${TARGET_DIR}/linux -j$((2 * $(nproc))) LLVM=1 ARCH=${arch}

echo "Image: ${PWD}/${TARGET_DIR}/linux/${image}"
}


function build_initramfs() {
mkdir -p ${TARGET_DIR}/initramfs
pushd ${TARGET_DIR}/initramfs

go install github.com/u-root/u-root@latest
if [[ ! -f go.mod ]]; then
go mod init initramfs

go get github.com/u-root/u-root/cmds/boot/boot
go get github.com/u-root/u-root/cmds/core/init
fi

case ${ARCH} in
x86|x86_64|amd64)
local goarch=amd64
local cmdline="console=ttyS0 reboot=acpi"
;;
arm|aarch64|arm64)
local goarch=arm64
local cmdline=console=ttyAMA0
;;
esac

echo "Building initramfs..."

GOARCH=${goarch} u-root -o initramfs.cpio \
-defaultsh '' -uinitcmd "boot -append '${cmdline}'" \
github.com/u-root/u-root/cmds/boot/boot \
github.com/u-root/u-root/cmds/core/init

popd
}

function main() {
build_initramfs

fetch_source
build_linux
}

main
51 changes: 51 additions & 0 deletions bootloader/config
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
CONFIG_WERROR=y
# CONFIG_MODULES is not set

CONFIG_SMP=y

CONFIG_DEFAULT_HOSTNAME="bootloader"
CONFIG_BLK_DEV_INITRD=y

# CONFIG_NET is not set

CONFIG_TMPFS=y
CONFIG_DEVTMPFS=y
CONFIG_EXT4_FS=y

CONFIG_RTC_CLASS=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_NO_HZ=y

CONFIG_COMMON_CLK=y
CONFIG_PCI=y
CONFIG_PCI_MSI=y
# CONFIG_USB_SUPPORT is not set
# CONFIG_HID_SUPPORT is not set
# CONFIG_VFIO is not set

CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_SERIAL_EARLYCON=y

CONFIG_TTY=y
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_INPUT_MOUSE is not set

CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_TIME_ACCOUNTING=y
CONFIG_VIRT_DRIVERS=y
# CONFIG_VIRTIO_MMIO is not set

CONFIG_VIRTIO_PCI=y
CONFIG_HW_RANDOM_VIRTIO=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_CONSOLE=y
CONFIG_PVPANIC=y
CONFIG_PVPANIC_PCI=y

CONFIG_PRINTK_TIME=y

CONFIG_KEXEC_CORE=y
CONFIG_KEXEC_FILE=y

CONFIG_INITRAMFS_COMPRESSION_ZSTD=y
10 changes: 10 additions & 0 deletions bootloader/config-arm64
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CONFIG_OF=y

CONFIG_PCI_HOST_COMMON=y
CONFIG_PCI_HOST_GENERIC=y

CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_RTC_DRV_PL031=y

CONFIG_CMDLINE="quiet console=ttyAMA0"
16 changes: 16 additions & 0 deletions bootloader/config-x86
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
CONFIG_KERNEL_ZSTD=y

CONFIG_ACPI=y

# CONFIG_X86_MCE is not set
CONFIG_ACPI_MADT_WAKEUP=y

CONFIG_HYPERVISOR_GUEST=y
CONFIG_KVM_GUEST=y
CONFIG_PARAVIRT_SPINLOCKS=y

CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250=y

CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="quiet console=ttyS0"