diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 652a295e..615dcc93 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -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 diff --git a/bootloader/build.sh b/bootloader/build.sh new file mode 100755 index 00000000..8d1bc160 --- /dev/null +++ b/bootloader/build.sh @@ -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 diff --git a/bootloader/config b/bootloader/config new file mode 100644 index 00000000..1a2a9f71 --- /dev/null +++ b/bootloader/config @@ -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 diff --git a/bootloader/config-arm64 b/bootloader/config-arm64 new file mode 100644 index 00000000..62569907 --- /dev/null +++ b/bootloader/config-arm64 @@ -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" diff --git a/bootloader/config-x86 b/bootloader/config-x86 new file mode 100644 index 00000000..57ebb96c --- /dev/null +++ b/bootloader/config-x86 @@ -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"