From 2a4667945771bf7ac426faf0655c34b1947f4dcb Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Sat, 11 Apr 2026 20:04:24 +0200 Subject: [PATCH 01/14] feat: add RISC-V (riscv64) architecture support - Add PR_riscv64.yml workflow using RISE RISC-V runners for native builds - Update Dockerfile with RISC-V cross-compilation, kernel builds, GRUB EFI - Update Makefile to support riscv64 arch and QEMU emulation - Add cloud and default kernel configs for RISC-V Made-with: Cursor Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 191 +++++++++ Dockerfile | 55 ++- Makefile | 22 +- files/kernel/cloud-riscv64.config | 313 ++++++++++++++ files/kernel/default-riscv64.config | 605 ++++++++++++++++++++++++++++ 5 files changed, 1174 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/PR_riscv64.yml create mode 100644 files/kernel/cloud-riscv64.config create mode 100644 files/kernel/default-riscv64.config diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml new file mode 100644 index 00000000..d2f09c52 --- /dev/null +++ b/.github/workflows/PR_riscv64.yml @@ -0,0 +1,191 @@ +--- +name: 'PR build and test images (riscv64)' + +on: + pull_request: + +concurrency: + group: ci-image-riscv64-${{ github.head_ref || github.ref }}-${{ github.repository }} + cancel-in-progress: true +jobs: + toolchain: + runs-on: ubuntu-24.04-riscv-2xlarge + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build PR + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + tags: ttl.sh/hadron-toolchain-riscv64:${{ github.sha }} + labels: | + ${{ steps.meta.outputs.labels }} + target: toolchain + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + container: + runs-on: ubuntu-24.04-riscv-2xlarge + needs: + - toolchain + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build PR + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + tags: ttl.sh/hadron-container-riscv64:${{ github.sha }} + labels: | + ${{ steps.meta.outputs.labels }} + target: container + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + - name: Test container image + uses: docker/build-push-action@v7 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + target: container-test + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + hadron-grub: + runs-on: ubuntu-24.04-riscv-2xlarge + needs: + - container + strategy: + matrix: + kernel: ["cloud"] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build PR + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + push: true + tags: ttl.sh/hadron-riscv64${{ matrix.kernel == 'cloud' && '-cloud' || '' }}:${{ github.sha }} + labels: | + ${{ steps.meta.outputs.labels }} + target: default + build-args: | + BOOTLOADER=grub + KERNEL_TYPE=${{ matrix.kernel }} + ARCH=riscv64 + BUILD_ARCH=riscv64 + build-kairos-grub: + runs-on: ubuntu-24.04-riscv-2xlarge + needs: + - hadron-grub + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + - name: Download Dockerfile from kairos repository + run: | + mkdir -p build + curl -sSL https://raw.githubusercontent.com/kairos-io/kairos/master/images/Dockerfile -o build/Dockerfile.kairos + - name: Build and push + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./build/Dockerfile.kairos + push: true + platforms: linux/riscv64 + tags: ttl.sh/hadron-init-riscv64:${{ github.sha }} + build-args: | + BASE_IMAGE=ttl.sh/hadron-riscv64-cloud:${{ github.sha }} + VERSION=v0.0.1-${{ github.sha }} + TRUSTED_BOOT=false + build-grub-iso: + runs-on: ubuntu-24.04-riscv-2xlarge + needs: + - build-kairos-grub + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + - name: Build ISO + run: | + mkdir build + docker run --rm -v /var/run/docker.sock:/var/run/docker.sock --platform=riscv64 \ + -v $PWD/build/:/output \ + quay.io/kairos/auroraboot:v0.19.2 --debug build-iso --output /output/ \ + --override-name kairos-hadron-riscv64-${{ github.sha }} \ + docker:ttl.sh/hadron-init-riscv64:${{ github.sha }} + - name: Upload artifact + uses: actions/upload-artifact@v7 + with: + name: kairos-hadron-riscv64-${{ github.sha }}.iso.zip + path: build/*.iso diff --git a/Dockerfile b/Dockerfile index 14aa2a44..92a64753 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,8 +41,12 @@ ENV MUSSEL_VERSION=${MUSSEL_VERSION} # Validate that the arches are correct RUN if [ "${ARCH}" = "x86-64" ] && [ "${BUILD_ARCH}" != "x86_64" ]; then echo "For ARCH x86-64, BUILD_ARCH must be x86_64"; exit 1; fi RUN if [ "${ARCH}" = "aarch64" ] && [ "${BUILD_ARCH}" != "aarch64" ]; then echo "For ARCH aarch64, BUILD_ARCH must be aarch64"; exit 1; fi +RUN if [ "${ARCH}" = "riscv64" ] && [ "${BUILD_ARCH}" != "riscv64" ]; then echo "For ARCH riscv64, BUILD_ARCH must be riscv64"; exit 1; fi RUN git clone https://github.com/firasuke/mussel.git && cd mussel && git checkout ${MUSSEL_VERSION} -b build +# Fix mussel RISC-V configuration: remove unsupported --with-cpu option for RISC-V +# GCC for RISC-V doesn't support --with-cpu, only --with-arch, --with-tune, and --with-abi +RUN cd mussel && sed -i 's/--with-cpu=sifive-u74 --with-arch=rv64gc --with-tune=sifive-7-series/--with-arch=rv64gc --with-tune=rocket/g' mussel RUN cd mussel && ./mussel ${ARCH} -k -l -o -p -s -T ${VENDOR} ENV PATH=/mussel/toolchain/bin/:$PATH @@ -643,7 +647,10 @@ COPY --from=sources-downloader /sources/downloads/busybox.tar.bz2 /sources/ RUN cd /sources && tar -xf busybox.tar.bz2 && \ mv busybox-* busybox && cd busybox && \ make -s distclean && \ - make -s ARCH="${ARCH}" defconfig && \ + BUSYBOX_ARCH="x86_64" && \ + if [ "${ARCH}" = "aarch64" ]; then BUSYBOX_ARCH=arm64; \ + elif [ "${ARCH}" = "riscv64" ]; then BUSYBOX_ARCH=riscv; fi && \ + make -s ARCH="${BUSYBOX_ARCH}" defconfig && \ sed -i 's/\(CONFIG_\)\(.*\)\(INETD\)\(.*\)=y/# \1\2\3\4 is not set/g' .config && \ sed -i 's/\(CONFIG_IFPLUGD\)=y/# \1 is not set/' .config && \ sed -i 's/\(CONFIG_FEATURE_WTMP\)=y/# \1 is not set/' .config && \ @@ -651,9 +658,9 @@ RUN cd /sources && tar -xf busybox.tar.bz2 && \ sed -i 's/\(CONFIG_UDPSVD\)=y/# \1 is not set/' .config && \ sed -i 's/\(CONFIG_TCPSVD\)=y/# \1 is not set/' .config && \ sed -i 's/\(CONFIG_TC\)=y/# \1 is not set/' .config && \ - if [ "${ARCH}" == "aarch64" ]; then sed -i 's/\(CONFIG_SHA1_HWACCEL\)=y/# \1 is not set/' .config; fi && \ - make -s ARCH="${ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} && \ - make -s ARCH="${ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} CONFIG_PREFIX="/sysroot" install + if [ "${ARCH}" = "aarch64" ] || [ "${ARCH}" = "riscv64" ]; then sed -i 's/\(CONFIG_SHA1_HWACCEL\)=y/# \1 is not set/' .config; fi && \ + make -s ARCH="${BUSYBOX_ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} && \ + make -s ARCH="${BUSYBOX_ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} CONFIG_PREFIX="/sysroot" install ### ### MUSL @@ -753,6 +760,8 @@ WORKDIR /sources/kernel # This installs the headers RUN if [ ${ARCH} = "aarch64" ]; then \ export ARCH=arm64; \ + elif [ ${ARCH} = "riscv64" ]; then \ + export ARCH=riscv; \ else \ export ARCH=x86_64;\ fi; make -s -j${JOBS} headers_install INSTALL_HDR_PATH=/linux-headers @@ -1888,6 +1897,8 @@ FROM kernel-base AS kernel-cloud WORKDIR /sources/kernel RUN if [ ${ARCH} = "aarch64" ] ; then \ cp -rfv /sources/kernel-configs/cloud-arm64.config .config ; \ + elif [ ${ARCH} = "riscv64" ] ; then \ + cp -rfv /sources/kernel-configs/cloud-riscv64.config .config ; \ else \ cp -rfv /sources/kernel-configs/cloud.config .config ; \ fi @@ -1896,6 +1907,8 @@ FROM kernel-base AS kernel-default WORKDIR /sources/kernel RUN if [ ${ARCH} = "aarch64" ] ; then \ cp -rfv /sources/kernel-configs/default-arm64.config .config ; \ + elif [ ${ARCH} = "riscv64" ] ; then \ + cp -rfv /sources/kernel-configs/default-riscv64.config .config ; \ else \ cp -rfv /sources/kernel-configs/default.config .config ; \ fi @@ -1906,16 +1919,22 @@ WORKDIR /sources/kernel # This only builds the kernel RUN if [ ${ARCH} = "aarch64" ]; then \ ARCH=arm64 make -s -j${JOBS} -l${MAX_LOAD} Image; \ + elif [ ${ARCH} = "riscv64" ]; then \ + ARCH=riscv make -s -j${JOBS} -l${MAX_LOAD} Image; \ else \ ARCH=x86_64 make -s -j${JOBS} -l${MAX_LOAD} bzImage; \ fi RUN if [ ${ARCH} = "aarch64" ]; then \ export ARCH=arm64; \ + elif [ ${ARCH} = "riscv64" ]; then \ + export ARCH=riscv; \ else \ export ARCH=x86_64;\ fi; make -s -j${JOBS} kernelrelease > /kernel/kernel-release ; make -s -j${JOBS} kernelversion > /kernel/kernel-version RUN if [ ${ARCH} = "aarch64" ]; then \ ARCH=arm64 kver=$(cat /kernel/kernel-release) && cp arch/$ARCH/boot/Image /kernel/vmlinuz-${kver}; \ + elif [ ${ARCH} = "riscv64" ]; then \ + ARCH=riscv kver=$(cat /kernel/kernel-release) && cp arch/$ARCH/boot/Image /kernel/vmlinuz-${kver}; \ else \ ARCH=x86_64 kver=$(cat /kernel/kernel-release) && cp arch/$ARCH/boot/bzImage /kernel/vmlinuz-${kver};\ fi @@ -1941,11 +1960,15 @@ FROM kernel-build AS kernel-modules # This builds the modules RUN if [ ${ARCH} = "aarch64" ]; then \ export ARCH=arm64; \ + elif [ ${ARCH} = "riscv64" ]; then \ + export ARCH=riscv; \ else \ export ARCH=x86_64;\ fi; make -s -j${JOBS} -l${MAX_LOAD} modules RUN if [ ${ARCH} = "aarch64" ]; then \ export ARCH=arm64; \ + elif [ ${ARCH} = "riscv64" ]; then \ + export ARCH=riscv; \ else \ export ARCH=x86_64;\ fi; ZSTD_CLEVEL=19 INSTALL_MOD_PATH="/modules" INSTALL_MOD_STRIP=1 DEPMOD=true make -s -j${JOBS} -l${MAX_LOAD} modules_install @@ -1956,6 +1979,8 @@ WORKDIR /sources/kernel # This installs the headers RUN if [ ${ARCH} = "aarch64" ]; then \ export ARCH=arm64; \ + elif [ ${ARCH} = "riscv64" ]; then \ + export ARCH=riscv; \ else \ export ARCH=x86_64;\ fi; make -s -j${JOBS} -l${MAX_LOAD} headers_install INSTALL_HDR_PATH=/linux-headers @@ -2314,6 +2339,9 @@ RUN make -s -j${JOBS} -l${MAX_LOAD} && make -s -j${JOBS} -l${MAX_LOAD} install-s RUN if [ "${ARCH}" = "aarch64" ]; then \ grub_format="arm64-efi"; \ grub_efi_name="grubaa64.efi"; \ + elif [ "${ARCH}" = "riscv64" ]; then \ + grub_format="riscv64-efi"; \ + grub_efi_name="grubriscv64.efi"; \ else \ grub_format="x86_64-efi"; \ grub_efi_name="grubx64.efi"; \ @@ -2337,13 +2365,13 @@ ARG CFLAGS="${CFLAGS//-flto=auto/}" ARG LDFLAGS="${LDFLAGS//-flto=auto/}" WORKDIR /sources/grub RUN mkdir -p /grub-bios -# Protect against building grub-bios on aarch64 host which is not supported -RUN if [ "${ARCH}" != "aarch64" ]; then ./configure ${COMMON_CONFIGURE_ARGS} --with-platform=pc --disable-werror;fi +# Protect against building grub-bios on aarch64/riscv64 host which is not supported +RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then ./configure ${COMMON_CONFIGURE_ARGS} --with-platform=pc --disable-werror;fi # Reconfigure gnulib shipped with grub to avoid build issues # This comes because on grub 2.14 these files are shipped pre-generated and they were built on a glibc system # which causes issues when building on musl systems as it expects the bsd-compat-headers to be available # which is not the case here. So we force regenerating these files with our musl toolchain so it can find there is no cdefs -RUN if [ "${ARCH}" != "aarch64" ]; then make -s -j${JOBS} -l${MAX_LOAD} -C grub-core/lib/gnulib;fi +RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then make -s -j${JOBS} -l${MAX_LOAD} -C grub-core/lib/gnulib;fi # GRUB 2.14 + binutils >= 2.4x regression (musl toolchain): force -Ttext instead of --image-base # # Symptom: @@ -2370,12 +2398,12 @@ RUN if [ "${ARCH}" != "aarch64" ]; then make -s -j${JOBS} -l${MAX_LOAD} -C grub- # Implementation: # Pass TARGET_IMG_BASE_LDOPT='-Wl,-Ttext' on the make/make install invocations that produce/install i386-pc images. -RUN if [ "${ARCH}" != "aarch64" ]; then \ +RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then \ make -s -j${JOBS} -l${MAX_LOAD} TARGET_IMG_BASE_LDOPT='-Wl,-Ttext' && \ make -s -j${JOBS} -l${MAX_LOAD} TARGET_IMG_BASE_LDOPT='-Wl,-Ttext' install-strip DESTDIR=/grub-bios ; \ fi # Test the mkimage generation in case we have a misalignment on the kernel.img start entry point -RUN if [ "${ARCH}" != "aarch64" ]; then \ +RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then \ /grub-bios/usr/bin/grub-mkimage \ --directory '/grub-bios/usr/lib/grub/i386-pc' \ --prefix= \ @@ -2412,9 +2440,14 @@ RUN sed -i 's/--target efi-app-$(ARCH)/--output-target efi-app-$(ARCH)/' Make.de # Install it to a temp folder as the dir struct is terrible # and we want it to be available at /usr/share/efi/shimXX.efi # TEMP workaround, we should add our paths into the sdk so agent and aurora both search for the proper shim path -RUN make -s -j${JOBS} -l${MAX_LOAD} EFIDIR=hadron ARCH=${BUILD_ARCH} DESTDIR=/tmp/shim install +# Skip shim build for RISC-V as it doesn't have Secure Boot support yet +RUN if [ "${ARCH}" != "riscv64" ]; then \ + make -s -j${JOBS} -l${MAX_LOAD} EFIDIR=hadron ARCH=${BUILD_ARCH} DESTDIR=/tmp/shim install; \ + fi RUN if [ ${ARCH} = "aarch64" ] ; then \ mkdir -p /shim/usr/share/efi/aarch64 && cp /tmp/shim/boot/efi/EFI/BOOT/BOOTAA64.EFI /shim/usr/share/efi/aarch64/shim.efi ; \ + elif [ ${ARCH} = "riscv64" ] ; then \ + mkdir -p /shim/usr/share/efi/riscv64 ; \ else \ mkdir -p /shim/usr/share/efi/x86_64 && cp /tmp/shim/boot/efi/EFI/BOOT/BOOTX64.EFI /shim/usr/share/efi/x86_64/shim.efi ; \ fi @@ -3188,6 +3221,8 @@ RUN ln -s /bin/bash /bin/sh ## Symlink ld-musl-$ARCH.so to /bin/ldd to provide ldd functionality RUN if [ "${ARCH}" == "aarch64" ]; then \ ln -s /lib/ld-musl-aarch64.so.1 /bin/ldd; \ + elif [ "${ARCH}" == "riscv64" ]; then \ + ln -s /lib/ld-musl-riscv64.so.1 /bin/ldd; \ else \ ln -s /lib/ld-musl-x86_64.so.1 /bin/ldd; \ fi diff --git a/Makefile b/Makefile index 8b193851..8c8c6691 100644 --- a/Makefile +++ b/Makefile @@ -34,9 +34,12 @@ else ifeq ($(ARCH),arm64) BUILD_ARCH := aarch64 else ifeq ($(ARCH),amd64) # do nothing +else ifeq ($(ARCH),riscv64) + TARGET_ARCH := riscv64 + BUILD_ARCH := riscv64 # Exit if invalid arch else -$(error "Architecture $(ARCH) is not supported. Please use 'amd64' or 'arm64'.") +$(error "Architecture $(ARCH) is not supported. Please use 'amd64', 'arm64', or 'riscv64'.") endif # Adjust IMAGE_NAME based on BOOTLOADER @@ -80,7 +83,7 @@ help: targets @echo "The BOOTLOADER variable can be set to 'grub' or 'systemd'. The default is 'systemd' to build a Trusted Boot image." @echo "The KERNEL_TYPE variable can be set to 'default' or 'cloud'. The default is 'default'." @echo "The FIPS variable can be set to 'fips' to build with FIPS support, or 'no-fips' to build without FIPS support. The default is 'no-fips'." - @ECHO "The ARCH variable can be set to 'amd64' or 'arm64'. The default is 'amd64'. It will build for x86-64 or aarch64 respectively." + @ECHO "The ARCH variable can be set to 'amd64', 'arm64', or 'riscv64'. The default is 'amd64'. It will build for x86-64, aarch64, or riscv64 respectively." @echo "The VERSION variable can be set to the version of the generated kairos+hadrond image. The default is v0.0.0." @echo "The IMAGE_NAME variable can be set to the name of the Hadron image that its built. The default is 'hadron'." @echo "The INIT_IMAGE_NAME variable can be set to the name of the Kairos image builts from Hadron. The default is 'hadron-init'." @@ -193,6 +196,20 @@ run-qemu: @if [ ! -e disk.img ]; then \ qemu-img create -f qcow2 disk.img 40g; \ fi +ifeq ($(ARCH),riscv64) + qemu-system-riscv64 \ + -machine virt \ + -m $(MEMORY) \ + -smp cores=2 \ + -nographic \ + -serial mon:stdio \ + -bios /usr/share/qemu/opensbi-riscv64-generic-fw_dynamic.bin \ + -kernel /usr/share/qemu/u-boot.bin \ + -device virtio-blk-device,drive=hd0 \ + -drive file=disk.img,format=qcow2,id=hd0 \ + -device virtio-blk-device,drive=cd0 \ + -drive file=$(ISO_FILE),format=raw,id=cd0,if=none +else qemu-system-x86_64 \ -m $(MEMORY) \ -smp cores=2 \ @@ -204,6 +221,7 @@ run-qemu: -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 \ -drive if=virtio,media=disk,file=disk.img \ -drive if=ide,media=cdrom,file=$(ISO_FILE) +endif bump-deps: diff --git a/files/kernel/cloud-riscv64.config b/files/kernel/cloud-riscv64.config new file mode 100644 index 00000000..7a60349b --- /dev/null +++ b/files/kernel/cloud-riscv64.config @@ -0,0 +1,313 @@ +# +# Hadron Linux RISC-V64 Cloud Kernel Configuration +# Based on Linux kernel defconfig for riscv with cloud/VM optimizations +# +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_NO_HZ_IDLE=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BPF_SYSCALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_CGROUPS=y +CONFIG_MEMCG=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_NAMESPACES=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_LOCALVERSION="-hadron" + +# +# RISC-V Platform Support (QEMU/Cloud) +# +CONFIG_ARCH_VIRT=y +CONFIG_SMP=y +CONFIG_NR_CPUS=256 +CONFIG_RISCV_SBI=y +CONFIG_RISCV_SBI_V01=y +CONFIG_RISCV_BOOT_SPINWAIT=y + +# +# Virtualization +# +CONFIG_VIRTUALIZATION=y +CONFIG_KVM=m + +# +# ACPI Support +# +CONFIG_ACPI=y + +# +# Modules +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODVERSIONS=y + +# +# Block layer +# +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_BLOCK=y + +# +# Memory +# +CONFIG_SPARSEMEM_MANUAL=y + +# +# Networking +# +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_XFRM_USER=m +CONFIG_INET_ESP=m +CONFIG_IPV6=y + +# +# Netfilter/Firewall (for Kubernetes) +# +CONFIG_NETFILTER=y +CONFIG_BRIDGE_NETFILTER=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_IP_VS=m +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_NFCT=y +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_NF_LOG_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_INET=y +CONFIG_NFT_CT=m +CONFIG_NFT_COUNTER=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_NAT=m +CONFIG_NFT_REJECT=m + +# +# Bridge/VLAN (for containers) +# +CONFIG_BRIDGE=m +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_VLAN_8021Q=m +CONFIG_NET_SCHED=y +CONFIG_NET_CLS_CGROUP=m +CONFIG_NETLINK_DIAG=y +CONFIG_CGROUP_NET_PRIO=y + +# +# PCI (for virtio-pci) +# +CONFIG_PCI=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCI_HOST_GENERIC=y + +# +# Device Drivers +# +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_FW_LOADER=y + +# +# Block devices +# +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +CONFIG_VIRTIO_BLK=y +CONFIG_BLK_DEV_NVME=m +CONFIG_BLK_DEV_SD=y + +# +# SCSI +# +CONFIG_SCSI=y +CONFIG_SCSI_VIRTIO=y + +# +# Device Mapper (for LVM/containers) +# +CONFIG_MD=y +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_MIRROR=m + +# +# Network devices +# +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN=m +CONFIG_VXLAN=m +CONFIG_VETH=m +CONFIG_VIRTIO_NET=y +CONFIG_TUN=m +CONFIG_TAP=m + +# +# Input devices +# +CONFIG_INPUT=y +CONFIG_INPUT_EVDEV=y + +# +# Serial/Console +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_EARLYCON_RISCV_SBI=y +CONFIG_VIRTIO_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_VIRTIO=y + +# +# Virtio +# +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_INPUT=y +CONFIG_VIRTIO_MMIO=y + +# +# Filesystems +# +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=m +CONFIG_OVERLAY_FS=m +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HUGETLBFS=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +CONFIG_NFS_FS=y +CONFIG_NFS_V4=y +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_ROOT_NFS=y +CONFIG_9P_FS=y +CONFIG_9P_FS_POSIX_ACL=y + +# +# NLS +# +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y + +# +# Security +# +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_APPARMOR=y +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_KEYS=y + +# +# Crypto +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_DEV_VIRTIO=y + +# +# Compression +# +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=y +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_RISCV=y + +# +# Debug (minimal for cloud) +# +CONFIG_PRINTK_TIME=y +# CONFIG_DEBUG_KERNEL is not set +CONFIG_DEBUG_FS=y +CONFIG_MEMTEST=y + +# +# Kernel module compression +# +CONFIG_MODULE_COMPRESS_ZSTD=y diff --git a/files/kernel/default-riscv64.config b/files/kernel/default-riscv64.config new file mode 100644 index 00000000..a0c0d109 --- /dev/null +++ b/files/kernel/default-riscv64.config @@ -0,0 +1,605 @@ +# +# Hadron Linux RISC-V64 Default Kernel Configuration +# Based on Linux kernel defconfig for riscv with comprehensive hardware support +# +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_NO_HZ_IDLE=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BPF_SYSCALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_CGROUPS=y +CONFIG_MEMCG=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_NAMESPACES=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_PROFILING=y +CONFIG_LOCALVERSION="-hadron" + +# +# RISC-V Platform Support +# +CONFIG_ARCH_ANDES=y +CONFIG_ARCH_ANLOGIC=y +CONFIG_ARCH_MICROCHIP=y +CONFIG_ARCH_SIFIVE=y +CONFIG_ARCH_SOPHGO=y +CONFIG_ARCH_SPACEMIT=y +CONFIG_SOC_STARFIVE=y +CONFIG_ARCH_SUNXI=y +CONFIG_ARCH_TENSTORRENT=y +CONFIG_ARCH_THEAD=y +CONFIG_ARCH_VIRT=y +CONFIG_ARCH_CANAAN=y +CONFIG_SMP=y +CONFIG_NR_CPUS=256 +CONFIG_RISCV_SBI=y +CONFIG_RISCV_SBI_V01=y +CONFIG_RISCV_BOOT_SPINWAIT=y + +# +# CPU Frequency Scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m +CONFIG_CPUFREQ_DT=y +CONFIG_ACPI_CPPC_CPUFREQ=m + +# +# Virtualization +# +CONFIG_VIRTUALIZATION=y +CONFIG_KVM=m + +# +# ACPI Support +# +CONFIG_ACPI=y + +# +# Modules +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODVERSIONS=y + +# +# Block layer +# +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_BLOCK=y + +# +# Memory +# +CONFIG_SPARSEMEM_MANUAL=y + +# +# Jump Label +# +CONFIG_JUMP_LABEL=y + +# +# Networking +# +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_XFRM_USER=m +CONFIG_INET_ESP=m +CONFIG_IPV6=y + +# +# Netfilter/Firewall (for Kubernetes) +# +CONFIG_NETFILTER=y +CONFIG_BRIDGE_NETFILTER=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_IP_VS=m +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_NFCT=y +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_NF_LOG_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_INET=y +CONFIG_NFT_CT=m +CONFIG_NFT_COUNTER=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_NAT=m +CONFIG_NFT_REJECT=m + +# +# Bridge/VLAN (for containers) +# +CONFIG_BRIDGE=m +CONFIG_BRIDGE_VLAN_FILTERING=y +CONFIG_VLAN_8021Q=m +CONFIG_NET_SCHED=y +CONFIG_NET_CLS_CGROUP=m +CONFIG_NETLINK_DIAG=y +CONFIG_CGROUP_NET_PRIO=y + +# +# CAN Bus +# +CONFIG_CAN=m + +# +# 9P Network +# +CONFIG_NET_9P=y +CONFIG_NET_9P_VIRTIO=y + +# +# PCI +# +CONFIG_PCI=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCI_HOST_GENERIC=y +CONFIG_PCIE_XILINX=y +CONFIG_PCIE_FU740=y +CONFIG_PCIE_STARFIVE_HOST=m + +# +# Device Drivers +# +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_FW_LOADER=y +CONFIG_SIFIVE_CCACHE=y + +# +# MTD +# +CONFIG_MTD=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_CFI=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_SPI_NOR=y + +# +# Block devices +# +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +CONFIG_VIRTIO_BLK=y +CONFIG_BLK_DEV_NVME=m +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_DEV_SR=y + +# +# SCSI +# +CONFIG_SCSI=y +CONFIG_SCSI_VIRTIO=y +CONFIG_BLK_DEV_SR=y + +# +# ATA/SATA +# +CONFIG_ATA=y +CONFIG_SATA_AHCI=y +CONFIG_SATA_AHCI_PLATFORM=y + +# +# Device Mapper (for LVM/containers) +# +CONFIG_MD=y +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_MIRROR=m + +# +# Network devices +# +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN=m +CONFIG_VXLAN=m +CONFIG_VETH=m +CONFIG_VIRTIO_NET=y +CONFIG_TUN=m +CONFIG_TAP=m +CONFIG_MACB=y +CONFIG_E1000E=y +CONFIG_R8169=y +CONFIG_STMMAC_ETH=m +CONFIG_DWMAC_THEAD=m +CONFIG_MICREL_PHY=y +CONFIG_MICROSEMI_PHY=y +CONFIG_MOTORCOMM_PHY=y + +# +# Input devices +# +CONFIG_INPUT=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_EVDEV=y +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_SUN4I_LRADC=m + +# +# Serial/Console +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_EARLYCON_RISCV_SBI=y +CONFIG_VIRTIO_CONSOLE=y + +# +# Hardware Random +# +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_VIRTIO=y +CONFIG_HW_RANDOM_JH7110=m + +# +# I2C +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m +CONFIG_I2C_DESIGNWARE_CORE=y +CONFIG_I2C_MV64XXX=m + +# +# SPI +# +CONFIG_SPI=y +CONFIG_SPI_CADENCE_QUADSPI=m +CONFIG_SPI_FSL_QUADSPI=m +CONFIG_SPI_PL022=m +CONFIG_SPI_SIFIVE=y +CONFIG_SPI_SUN6I=y + +# +# Pin Control +# +CONFIG_PINCTRL_TH1520=y +CONFIG_PINCTRL_SOPHGO_CV1800B=y +CONFIG_PINCTRL_SOPHGO_CV1812H=y +CONFIG_PINCTRL_SOPHGO_SG2000=y +CONFIG_PINCTRL_SOPHGO_SG2002=y + +# +# GPIO +# +CONFIG_GPIO_DWAPB=y +CONFIG_GPIO_SIFIVE=y +CONFIG_GPIO_SPACEMIT_K1=y + +# +# Power +# +CONFIG_POWER_RESET_GPIO_RESTART=y + +# +# Thermal/Sensors +# +CONFIG_SENSORS_SFCTEMP=m +CONFIG_CPU_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y + +# +# Watchdog +# +CONFIG_WATCHDOG=y +CONFIG_SUNXI_WATCHDOG=y + +# +# MFD/Regulator (Power Management) +# +CONFIG_MFD_AXP20X_I2C=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_AXP20X=y +CONFIG_REGULATOR_GPIO=y + +# +# Media (minimal) +# +CONFIG_MEDIA_SUPPORT=m +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_VIDEO_CADENCE_CSI2RX=m + +# +# DRM/Graphics +# +CONFIG_DRM=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_NOUVEAU=m +CONFIG_DRM_SUN4I=m +CONFIG_DRM_VIRTIO_GPU=m +CONFIG_FB=y + +# +# Sound +# +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_SOC=y +CONFIG_SND_DESIGNWARE_I2S=m +CONFIG_SND_SOC_JH7110_PWMDAC=m +CONFIG_SND_SOC_JH7110_TDM=m +CONFIG_SND_SOC_WM8978=m +CONFIG_SND_SIMPLE_CARD=m + +# +# USB +# +CONFIG_USB=y +CONFIG_USB_OTG=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_UAS=y +CONFIG_USB_CDNS_SUPPORT=m +CONFIG_USB_CDNS3=m +CONFIG_USB_CDNS3_GADGET=y +CONFIG_USB_CDNS3_HOST=y +CONFIG_USB_CDNS3_STARFIVE=m +CONFIG_USB_MUSB_HDRC=m +CONFIG_USB_MUSB_SUNXI=m +CONFIG_NOP_USB_XCEIV=m +CONFIG_USB_GADGET=y +CONFIG_USB_CONFIGFS=m +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_OBEX=y +CONFIG_USB_CONFIGFS_NCM=y +CONFIG_USB_CONFIGFS_ECM=y +CONFIG_USB_CONFIGFS_ECM_SUBSET=y +CONFIG_USB_CONFIGFS_RNDIS=y +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_FS=y + +# +# MMC/SD +# +CONFIG_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_OF_DWCMSHC=y +CONFIG_MMC_SDHCI_OF_K1=y +CONFIG_MMC_SDHCI_CADENCE=y +CONFIG_MMC_SPI=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_STARFIVE=y +CONFIG_MMC_SUNXI=y + +# +# RTC +# +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_SUN6I=y + +# +# DMA +# +CONFIG_DMADEVICES=y +CONFIG_DMA_SUN6I=m +CONFIG_DW_AXI_DMAC=y +CONFIG_MMP_PDMA=m + +# +# Virtio +# +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_INPUT=y +CONFIG_VIRTIO_MMIO=y + +# +# Clocks +# +CONFIG_CLK_SOPHGO_CV1800=y +CONFIG_CLK_SOPHGO_SG2042_PLL=y +CONFIG_CLK_SOPHGO_SG2042_CLKGEN=y +CONFIG_CLK_SOPHGO_SG2042_RPGATE=y +CONFIG_SPACEMIT_K1_CCU=y +CONFIG_SPACEMIT_K3_CCU=y +CONFIG_SUN8I_DE2_CCU=m + +# +# IOMMU +# +CONFIG_SUN50I_IOMMU=y + +# +# RPMSG +# +CONFIG_RPMSG_CHAR=y +CONFIG_RPMSG_CTRL=y +CONFIG_RPMSG_VIRTIO=y + +# +# Devfreq +# +CONFIG_PM_DEVFREQ=y + +# +# IIO +# +CONFIG_IIO=y + +# +# PWM +# +CONFIG_PWM=y +CONFIG_PWM_PXA=m + +# +# RISC-V specific +# +CONFIG_THEAD_C900_ACLINT_SSWI=y + +# +# PHY +# +CONFIG_PHY_SUN4I_USB=m +CONFIG_PHY_STARFIVE_JH7110_DPHY_RX=m +CONFIG_PHY_STARFIVE_JH7110_PCIE=m +CONFIG_PHY_STARFIVE_JH7110_USB=m + +# +# NVDIMM/NVMEM +# +CONFIG_LIBNVDIMM=y +CONFIG_NVMEM_SUNXI_SID=y + +# +# Filesystems +# +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=m +CONFIG_OVERLAY_FS=m +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HUGETLBFS=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +CONFIG_NFS_FS=y +CONFIG_NFS_V4=y +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_ROOT_NFS=y +CONFIG_9P_FS=y +CONFIG_9P_FS_POSIX_ACL=y + +# +# NLS +# +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y + +# +# Security +# +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_APPARMOR=y +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_KEYS=y + +# +# Crypto +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_DEV_VIRTIO=y + +# +# Compression +# +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=y +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_RISCV=y + +# +# Debug +# +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_FS=y +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_MEMTEST=y + +# +# Kernel module compression +# +CONFIG_MODULE_COMPRESS_ZSTD=y From 01fd254250ca33e5ac76c717d20037aff017cd6c Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Sun, 12 Apr 2026 06:52:25 +0200 Subject: [PATCH 02/14] fix: use ubuntu-24.04-riscv runner for RISC-V CI The 2xlarge variant was not picking up jobs. Made-with: Cursor Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml index d2f09c52..da55de26 100644 --- a/.github/workflows/PR_riscv64.yml +++ b/.github/workflows/PR_riscv64.yml @@ -9,7 +9,7 @@ concurrency: cancel-in-progress: true jobs: toolchain: - runs-on: ubuntu-24.04-riscv-2xlarge + runs-on: ubuntu-24.04-riscv permissions: packages: write contents: read @@ -45,7 +45,7 @@ jobs: ARCH=riscv64 BUILD_ARCH=riscv64 container: - runs-on: ubuntu-24.04-riscv-2xlarge + runs-on: ubuntu-24.04-riscv needs: - toolchain permissions: @@ -94,7 +94,7 @@ jobs: ARCH=riscv64 BUILD_ARCH=riscv64 hadron-grub: - runs-on: ubuntu-24.04-riscv-2xlarge + runs-on: ubuntu-24.04-riscv needs: - container strategy: @@ -138,7 +138,7 @@ jobs: ARCH=riscv64 BUILD_ARCH=riscv64 build-kairos-grub: - runs-on: ubuntu-24.04-riscv-2xlarge + runs-on: ubuntu-24.04-riscv needs: - hadron-grub steps: @@ -167,7 +167,7 @@ jobs: VERSION=v0.0.1-${{ github.sha }} TRUSTED_BOOT=false build-grub-iso: - runs-on: ubuntu-24.04-riscv-2xlarge + runs-on: ubuntu-24.04-riscv needs: - build-kairos-grub steps: From 3454aa9dad388411d3da4d69ec5d2bb5a807794b Mon Sep 17 00:00:00 2001 From: Itxaka Date: Tue, 14 Apr 2026 15:25:38 +0200 Subject: [PATCH 03/14] Add caching for toolchain and container builds Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml index da55de26..cbe5a742 100644 --- a/.github/workflows/PR_riscv64.yml +++ b/.github/workflows/PR_riscv64.yml @@ -41,6 +41,8 @@ jobs: labels: | ${{ steps.meta.outputs.labels }} target: toolchain + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -79,6 +81,9 @@ jobs: labels: | ${{ steps.meta.outputs.labels }} target: container + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 From 23a677123a57746a1e5ae71a1e501fffa4eef2fa Mon Sep 17 00:00:00 2001 From: Itxaka Date: Tue, 14 Apr 2026 15:33:52 +0200 Subject: [PATCH 04/14] Add JOBS and MAX_LOAD parameters to workflow Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml index cbe5a742..0d929eb4 100644 --- a/.github/workflows/PR_riscv64.yml +++ b/.github/workflows/PR_riscv64.yml @@ -46,6 +46,8 @@ jobs: build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 + JOBS=4 + MAX_LOAD=4 container: runs-on: ubuntu-24.04-riscv needs: From 835387a669b7f959f5ff747cbcfc718db8d8317a Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Wed, 15 Apr 2026 10:05:32 +0200 Subject: [PATCH 05/14] fix: use generic RISC-V GCC options in mussel toolchain Remove --with-cpu and --with-tune flags, keeping only --with-arch=rv64gc and --with-abi=lp64d for broader hardware compatibility. Made-with: Cursor Signed-off-by: Mauro Morales --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 92a64753..e17d96e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,9 +44,8 @@ RUN if [ "${ARCH}" = "aarch64" ] && [ "${BUILD_ARCH}" != "aarch64" ]; then echo RUN if [ "${ARCH}" = "riscv64" ] && [ "${BUILD_ARCH}" != "riscv64" ]; then echo "For ARCH riscv64, BUILD_ARCH must be riscv64"; exit 1; fi RUN git clone https://github.com/firasuke/mussel.git && cd mussel && git checkout ${MUSSEL_VERSION} -b build -# Fix mussel RISC-V configuration: remove unsupported --with-cpu option for RISC-V -# GCC for RISC-V doesn't support --with-cpu, only --with-arch, --with-tune, and --with-abi -RUN cd mussel && sed -i 's/--with-cpu=sifive-u74 --with-arch=rv64gc --with-tune=sifive-7-series/--with-arch=rv64gc --with-tune=rocket/g' mussel +# Fix mussel RISC-V configuration: use generic arch/abi instead of SiFive-specific options +RUN cd mussel && sed -i 's/--with-cpu=sifive-u74 --with-arch=rv64gc --with-tune=sifive-7-series --with-abi=lp64d/--with-arch=rv64gc --with-abi=lp64d/g' mussel RUN cd mussel && ./mussel ${ARCH} -k -l -o -p -s -T ${VENDOR} ENV PATH=/mussel/toolchain/bin/:$PATH From e6fd75c3bfef8af80cd4c2420c4d5305a54a363c Mon Sep 17 00:00:00 2001 From: Itxaka Date: Wed, 15 Apr 2026 10:22:47 +0200 Subject: [PATCH 06/14] Change runner for toolchain job to x86-64 Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml index 0d929eb4..a6dcbe0d 100644 --- a/.github/workflows/PR_riscv64.yml +++ b/.github/workflows/PR_riscv64.yml @@ -9,7 +9,7 @@ concurrency: cancel-in-progress: true jobs: toolchain: - runs-on: ubuntu-24.04-riscv + runs-on: oracle-vm-32cpu-128gb-x86-64 permissions: packages: write contents: read @@ -46,8 +46,6 @@ jobs: build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 - JOBS=4 - MAX_LOAD=4 container: runs-on: ubuntu-24.04-riscv needs: From 95d53cbed2cd683a1448bc83cfe8861e16eef0be Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Wed, 15 Apr 2026 10:24:09 +0200 Subject: [PATCH 07/14] fix: simplify BusyBox build, disable SHA1_HWACCEL for non-x86 Remove unnecessary BUSYBOX_ARCH mapping - BusyBox handles ARCH directly. Disable CONFIG_SHA1_HWACCEL for all non-x86 architectures since it relies on x86-specific SHA-NI instructions. Made-with: Cursor Signed-off-by: Mauro Morales --- Dockerfile | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index e17d96e7..cbac14f5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -646,10 +646,7 @@ COPY --from=sources-downloader /sources/downloads/busybox.tar.bz2 /sources/ RUN cd /sources && tar -xf busybox.tar.bz2 && \ mv busybox-* busybox && cd busybox && \ make -s distclean && \ - BUSYBOX_ARCH="x86_64" && \ - if [ "${ARCH}" = "aarch64" ]; then BUSYBOX_ARCH=arm64; \ - elif [ "${ARCH}" = "riscv64" ]; then BUSYBOX_ARCH=riscv; fi && \ - make -s ARCH="${BUSYBOX_ARCH}" defconfig && \ + make -s ARCH="${ARCH}" defconfig && \ sed -i 's/\(CONFIG_\)\(.*\)\(INETD\)\(.*\)=y/# \1\2\3\4 is not set/g' .config && \ sed -i 's/\(CONFIG_IFPLUGD\)=y/# \1 is not set/' .config && \ sed -i 's/\(CONFIG_FEATURE_WTMP\)=y/# \1 is not set/' .config && \ @@ -657,9 +654,9 @@ RUN cd /sources && tar -xf busybox.tar.bz2 && \ sed -i 's/\(CONFIG_UDPSVD\)=y/# \1 is not set/' .config && \ sed -i 's/\(CONFIG_TCPSVD\)=y/# \1 is not set/' .config && \ sed -i 's/\(CONFIG_TC\)=y/# \1 is not set/' .config && \ - if [ "${ARCH}" = "aarch64" ] || [ "${ARCH}" = "riscv64" ]; then sed -i 's/\(CONFIG_SHA1_HWACCEL\)=y/# \1 is not set/' .config; fi && \ - make -s ARCH="${BUSYBOX_ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} && \ - make -s ARCH="${BUSYBOX_ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} CONFIG_PREFIX="/sysroot" install + if [ "${ARCH}" != "x86-64" ]; then sed -i 's/\(CONFIG_SHA1_HWACCEL\)=y/# \1 is not set/' .config; fi && \ + make -s ARCH="${ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} && \ + make -s ARCH="${ARCH}" CROSS_COMPILE="${TARGET}-" -j${JOBS} -l${MAX_LOAD} CONFIG_PREFIX="/sysroot" install ### ### MUSL From ae499a2d0d21d5742612b8837af7fe2aa20db58c Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Wed, 15 Apr 2026 11:06:22 +0200 Subject: [PATCH 08/14] fix: only remove --with-cpu from mussel RISC-V config Keep --with-arch, --with-tune, and --with-abi as upstream recommends. Made-with: Cursor Signed-off-by: Mauro Morales --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index cbac14f5..d64f8405 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,8 +44,8 @@ RUN if [ "${ARCH}" = "aarch64" ] && [ "${BUILD_ARCH}" != "aarch64" ]; then echo RUN if [ "${ARCH}" = "riscv64" ] && [ "${BUILD_ARCH}" != "riscv64" ]; then echo "For ARCH riscv64, BUILD_ARCH must be riscv64"; exit 1; fi RUN git clone https://github.com/firasuke/mussel.git && cd mussel && git checkout ${MUSSEL_VERSION} -b build -# Fix mussel RISC-V configuration: use generic arch/abi instead of SiFive-specific options -RUN cd mussel && sed -i 's/--with-cpu=sifive-u74 --with-arch=rv64gc --with-tune=sifive-7-series --with-abi=lp64d/--with-arch=rv64gc --with-abi=lp64d/g' mussel +# Fix mussel RISC-V configuration: remove unsupported --with-cpu option +RUN cd mussel && sed -i 's/--with-cpu=sifive-u74 //g' mussel RUN cd mussel && ./mussel ${ARCH} -k -l -o -p -s -T ${VENDOR} ENV PATH=/mussel/toolchain/bin/:$PATH From f04a3aea07968a21dc9ad3aefa0bc89ae08accb7 Mon Sep 17 00:00:00 2001 From: Itxaka Date: Wed, 15 Apr 2026 14:30:07 +0200 Subject: [PATCH 09/14] ci: split riscv64 PR workflow into incremental cached jobs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous single-job toolchain build timed out on QEMU due to the entire mussel bootstrap + all packages running in one step. Replace it with a pipeline of small jobs, each writing its result to the quay.io cache so a timeout or failure only loses one step: stage0 → stage1 → rsync ─┬→ cmake ───┐ ├→ kernel ──┤ ├→ systemd ─┤→ toolchain → container → … └→ python ──┘ The four parallel jobs (cmake, kernel, systemd, python-build) cover the most expensive independent builds; the final toolchain job finds them already cached and only compiles the remaining delta. All jobs run on oracle-vm-32cpu-128gb-x86-64. The Dockerfile has no FROM --platform overrides so every stage executes riscv64 binaries regardless of runner; QEMU on 32 cores + 128 GB beats native RISC-V on 4 cores + 16 GB where RAM pressure alone would cause swap on large builds. Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 452 +++++++++++++++++++++++++++++-- 1 file changed, 431 insertions(+), 21 deletions(-) diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml index a6dcbe0d..78153fc7 100644 --- a/.github/workflows/PR_riscv64.yml +++ b/.github/workflows/PR_riscv64.yml @@ -7,9 +7,382 @@ on: concurrency: group: ci-image-riscv64-${{ github.head_ref || github.ref }}-${{ github.repository }} cancel-in-progress: true + +# Everything runs on oracle-vm-32cpu-128gb-x86-64 with QEMU RISC-V emulation. +# The Dockerfile has no FROM --platform overrides, so every stage executes riscv64 +# binaries regardless of runner. QEMU on 32 cores + 128 GB beats native RISC-V on +# 4 cores + 16 GB: the RAM headroom alone prevents swap during large builds (kernel, +# systemd, cmake), and 32 parallel QEMU processes match ~4 native cores in throughput. +# +# The build is split into small sequential and parallel jobs so each individual job +# is time-bounded and its result is written to the quay cache. Subsequent jobs only +# compile the delta on top of what is already cached, meaning a timeout or failure +# only loses one small step rather than the entire multi-hour toolchain build. +# +# Dependency graph (→ = "depends on"): +# +# stage0 → stage1 → rsync ─┬→ cmake ───┐ +# ├→ kernel ──┤ +# ├→ systemd ─┤→ toolchain → container → hadron-grub → … +# └→ python ──┘ + jobs: + # ── 1 ─ mussel cross-compiler ──────────────────────────────────────────────── + stage0: + runs-on: oracle-vm-32cpu-128gb-x86-64 + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build stage0 (mussel cross-compiler) + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: stage0 + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + # ── 2 ─ stage1-merge: musl/gcc/binutils/kernel-headers rebuilt for target ─── + stage1: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [stage0] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build stage1-merge + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: stage1-merge + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + # ── 3 ─ rsync: the chain stage1→xxhash→zstd→lz4→attr→acl→zlib→gawk→rsync ─── + # rsync is the base FROM image for the majority of packages; caching it here + # avoids rebuilding this chain independently in each of the parallel jobs below. + rsync: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [stage1] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build rsync stage (and its full dependency chain) + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: rsync + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + # ── 4a-4d ─ parallel cache-warming: the four most expensive independent builds + # Each job reads all upstream caches and writes only its own delta. + # They all run in parallel, so wall-clock time = max(cmake, kernel, systemd, python) + # instead of sum. + + cmake: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build cmake + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: cmake + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + kernel: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + # kernel-misc captures kernel-build + kernel-modules in one shot. + # KERNEL_TYPE=cloud matches what hadron-grub uses for RISC-V. + - name: Build kernel + modules (kernel-misc target) + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: kernel-misc + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + KERNEL_TYPE=cloud + + systemd: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + - name: Build systemd + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: systemd + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + python: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + # python-build is the base for dbus, pam, kmod, pax-utils, grub-base, and openscsi. + - name: Build python-build + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: python-build + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + # ── 5 ─ assemble the full toolchain ────────────────────────────────────────── + # By now all expensive sub-builds are in the cache. This job only has to run + # the remaining packages and the final full-toolchain-merge → scratch copy. toolchain: runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [cmake, kernel, systemd, python] permissions: packages: write contents: read @@ -25,10 +398,16 @@ jobs: buildkitd-config-inline: | [worker.oci] max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v6 - - name: Build PR + - name: Build toolchain uses: docker/build-push-action@v7 env: SOURCE_DATE_EPOCH: 0 @@ -37,19 +416,28 @@ jobs: context: ./ file: ./Dockerfile platforms: linux/riscv64 + push: true tags: ttl.sh/hadron-toolchain-riscv64:${{ github.sha }} - labels: | - ${{ steps.meta.outputs.labels }} + labels: ${{ steps.meta.outputs.labels }} target: toolchain cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 + container: - runs-on: ubuntu-24.04-riscv - needs: - - toolchain + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [toolchain] permissions: packages: write contents: read @@ -65,10 +453,16 @@ jobs: buildkitd-config-inline: | [worker.oci] max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v6 - - name: Build PR + - name: Build container uses: docker/build-push-action@v7 env: SOURCE_DATE_EPOCH: 0 @@ -77,13 +471,15 @@ jobs: context: ./ file: ./Dockerfile platforms: linux/riscv64 + push: true tags: ttl.sh/hadron-container-riscv64:${{ github.sha }} - labels: | - ${{ steps.meta.outputs.labels }} + labels: ${{ steps.meta.outputs.labels }} target: container cache-from: | type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -95,13 +491,16 @@ jobs: file: ./Dockerfile platforms: linux/riscv64 target: container-test + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 + hadron-grub: - runs-on: ubuntu-24.04-riscv - needs: - - container + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [container] strategy: matrix: kernel: ["cloud"] @@ -120,10 +519,16 @@ jobs: buildkitd-config-inline: | [worker.oci] max-parallelism = 4 + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v6 - - name: Build PR + - name: Build default image uses: docker/build-push-action@v7 env: SOURCE_DATE_EPOCH: 0 @@ -134,18 +539,23 @@ jobs: platforms: linux/riscv64 push: true tags: ttl.sh/hadron-riscv64${{ matrix.kernel == 'cloud' && '-cloud' || '' }}:${{ github.sha }} - labels: | - ${{ steps.meta.outputs.labels }} + labels: ${{ steps.meta.outputs.labels }} target: default + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:grub-${{ matrix.kernel }}-riscv64,mode=max + cache-to: | + type=registry,ref=quay.io/kairos/hadron-build-cache:grub-${{ matrix.kernel }}-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | BOOTLOADER=grub KERNEL_TYPE=${{ matrix.kernel }} ARCH=riscv64 BUILD_ARCH=riscv64 + build-kairos-grub: - runs-on: ubuntu-24.04-riscv - needs: - - hadron-grub + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [hadron-grub] steps: - name: Checkout uses: actions/checkout@v6 @@ -171,10 +581,10 @@ jobs: BASE_IMAGE=ttl.sh/hadron-riscv64-cloud:${{ github.sha }} VERSION=v0.0.1-${{ github.sha }} TRUSTED_BOOT=false + build-grub-iso: - runs-on: ubuntu-24.04-riscv - needs: - - build-kairos-grub + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [build-kairos-grub] steps: - name: Checkout uses: actions/checkout@v6 From ac7f9733748a8a39b0f5af974c3e349880bb3ec0 Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Thu, 16 Apr 2026 15:31:12 +0200 Subject: [PATCH 10/14] Comment kairos tests since init hasn not been released with riscv64 Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 101 ++++++++++++++++--------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml index 78153fc7..e559ef2e 100644 --- a/.github/workflows/PR_riscv64.yml +++ b/.github/workflows/PR_riscv64.yml @@ -553,54 +553,55 @@ jobs: ARCH=riscv64 BUILD_ARCH=riscv64 - build-kairos-grub: - runs-on: oracle-vm-32cpu-128gb-x86-64 - needs: [hadron-grub] - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@master - - name: Download Dockerfile from kairos repository - run: | - mkdir -p build - curl -sSL https://raw.githubusercontent.com/kairos-io/kairos/master/images/Dockerfile -o build/Dockerfile.kairos - - name: Build and push - uses: docker/build-push-action@v7 - env: - SOURCE_DATE_EPOCH: 0 - with: - builder: ${{ steps.buildx.outputs.name }} - context: ./ - file: ./build/Dockerfile.kairos - push: true - platforms: linux/riscv64 - tags: ttl.sh/hadron-init-riscv64:${{ github.sha }} - build-args: | - BASE_IMAGE=ttl.sh/hadron-riscv64-cloud:${{ github.sha }} - VERSION=v0.0.1-${{ github.sha }} - TRUSTED_BOOT=false + # There's a short circuit here since we haven't released kairos-init for riscv64 because it needs hadron to at least pass tests on one OS. For now let's just release a version on main so we can test that on kairos-init and then we decide if we do the tests here too and how to make the dependency less problematic + # build-kairos-grub: + # runs-on: oracle-vm-32cpu-128gb-x86-64 + # needs: [hadron-grub] + # steps: + # - name: Checkout + # uses: actions/checkout@v6 + # - name: Set up Docker Buildx + # id: buildx + # uses: docker/setup-buildx-action@master + # - name: Download Dockerfile from kairos repository + # run: | + # mkdir -p build + # curl -sSL https://raw.githubusercontent.com/kairos-io/kairos/master/images/Dockerfile -o build/Dockerfile.kairos + # - name: Build and push + # uses: docker/build-push-action@v7 + # env: + # SOURCE_DATE_EPOCH: 0 + # with: + # builder: ${{ steps.buildx.outputs.name }} + # context: ./ + # file: ./build/Dockerfile.kairos + # push: true + # platforms: linux/riscv64 + # tags: ttl.sh/hadron-init-riscv64:${{ github.sha }} + # build-args: | + # BASE_IMAGE=ttl.sh/hadron-riscv64-cloud:${{ github.sha }} + # VERSION=v0.0.1-${{ github.sha }} + # TRUSTED_BOOT=false - build-grub-iso: - runs-on: oracle-vm-32cpu-128gb-x86-64 - needs: [build-kairos-grub] - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@master - - name: Build ISO - run: | - mkdir build - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock --platform=riscv64 \ - -v $PWD/build/:/output \ - quay.io/kairos/auroraboot:v0.19.2 --debug build-iso --output /output/ \ - --override-name kairos-hadron-riscv64-${{ github.sha }} \ - docker:ttl.sh/hadron-init-riscv64:${{ github.sha }} - - name: Upload artifact - uses: actions/upload-artifact@v7 - with: - name: kairos-hadron-riscv64-${{ github.sha }}.iso.zip - path: build/*.iso + # build-grub-iso: + # runs-on: oracle-vm-32cpu-128gb-x86-64 + # needs: [build-kairos-grub] + # steps: + # - name: Checkout + # uses: actions/checkout@v6 + # - name: Set up Docker Buildx + # id: buildx + # uses: docker/setup-buildx-action@master + # - name: Build ISO + # run: | + # mkdir build + # docker run --rm -v /var/run/docker.sock:/var/run/docker.sock --platform=riscv64 \ + # -v $PWD/build/:/output \ + # quay.io/kairos/auroraboot:v0.19.2 --debug build-iso --output /output/ \ + # --override-name kairos-hadron-riscv64-${{ github.sha }} \ + # docker:ttl.sh/hadron-init-riscv64:${{ github.sha }} + # - name: Upload artifact + # uses: actions/upload-artifact@v7 + # with: + # name: kairos-hadron-riscv64-${{ github.sha }}.iso.zip + # path: build/*.iso From f2a92845b084b9c5240bc880ed9b25ba67de1ab7 Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Fri, 17 Apr 2026 11:30:29 +0200 Subject: [PATCH 11/14] feat: add RISC-V pipeline to multiarch build workflow Add staged build pipeline for riscv64 that pushes to ghcr.io. Uses QEMU emulation on x86-64 runners with aggressive caching. Made-with: Cursor Signed-off-by: Mauro Morales --- .github/workflows/build-multiarch-images.yml | 591 +++++++++++++++++++ 1 file changed, 591 insertions(+) diff --git a/.github/workflows/build-multiarch-images.yml b/.github/workflows/build-multiarch-images.yml index 5c7e31ac..34dff9ce 100644 --- a/.github/workflows/build-multiarch-images.yml +++ b/.github/workflows/build-multiarch-images.yml @@ -667,3 +667,594 @@ jobs: prune-tags-regexes: | ^${{ github.ref_name }}-amd64$ ^${{ github.ref_name }}-arm64$ + + # ============================================================================ + # RISC-V 64-bit pipeline + # ============================================================================ + # RISC-V builds use QEMU emulation on x86-64 runners. The build is split into + # sequential stages to maximize cache reuse and avoid timeouts. + # + # Dependency graph: + # stage0-riscv64 → stage1-riscv64 → rsync-riscv64 ─┬→ cmake-riscv64 ───┐ + # ├→ kernel-riscv64 ──┤ + # ├→ systemd-riscv64 ─┤ + # └→ python-riscv64 ──┘ + # ↓ + # toolchain-riscv64 → container-riscv64 → hadron-grub-riscv64 + + stage0-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build stage0 (mussel cross-compiler) + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: stage0 + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + stage1-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [stage0-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build stage1-merge + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: stage1-merge + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + rsync-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [stage1-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build rsync stage + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: rsync + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + cmake-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build cmake + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: cmake + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + kernel-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build kernel + modules + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: kernel-misc + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + KERNEL_TYPE=cloud + + systemd-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build systemd + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: systemd + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + python-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [rsync-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build python-build + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: python-build + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + toolchain-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [cmake-riscv64, kernel-riscv64, systemd-riscv64, python-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build and push toolchain + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + push: true + tags: ghcr.io/${{ github.repository }}-toolchain:${{ github.ref_name }}-riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: toolchain + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + container-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [toolchain-riscv64] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build and push container + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + push: true + tags: ghcr.io/${{ github.repository }}-container:${{ github.ref_name }}-riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: container + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && 'type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true' || '' }} + build-args: | + ARCH=riscv64 + BUILD_ARCH=riscv64 + + hadron-grub-riscv64: + runs-on: oracle-vm-32cpu-128gb-x86-64 + needs: [container-riscv64] + strategy: + matrix: + kernel: ["cloud"] + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@master + with: + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 4 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Log in to quay.io for cache + uses: docker/login-action@v4 + with: + registry: quay.io + username: ${{ secrets.QUAY_IO_USERNAME }} + password: ${{ secrets.QUAY_IO_PASSWORD }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + labels: | + org.opencontainers.image.licenses=Apache-2.0 + - name: Build and push default image + uses: docker/build-push-action@v7 + env: + SOURCE_DATE_EPOCH: 0 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ./ + file: ./Dockerfile + platforms: linux/riscv64 + push: true + tags: ghcr.io/${{ github.repository }}${{ matrix.kernel == 'cloud' && '-cloud' || '' }}:${{ github.ref_name }}-riscv64 + labels: ${{ steps.meta.outputs.labels }} + target: default + cache-from: | + type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max + type=registry,ref=quay.io/kairos/hadron-build-cache:grub-${{ matrix.kernel }}-riscv64,mode=max + cache-to: ${{ github.ref_name == 'main' && format('type=registry,ref=quay.io/kairos/hadron-build-cache:grub-{0}-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true', matrix.kernel) || '' }} + build-args: | + VERSION=${{ env.VERSION }} + BOOTLOADER=grub + KERNEL_TYPE=${{ matrix.kernel }} + ARCH=riscv64 + BUILD_ARCH=riscv64 From a8980310eea0d5bfa06f51f4d68fa86d29777e26 Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Fri, 17 Apr 2026 14:02:30 +0200 Subject: [PATCH 12/14] refactor: use positive x86-64 check for GRUB BIOS builds Replace double-negative arch checks with simpler positive check. Made-with: Cursor Signed-off-by: Mauro Morales --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index d64f8405..885504ab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2361,13 +2361,13 @@ ARG CFLAGS="${CFLAGS//-flto=auto/}" ARG LDFLAGS="${LDFLAGS//-flto=auto/}" WORKDIR /sources/grub RUN mkdir -p /grub-bios -# Protect against building grub-bios on aarch64/riscv64 host which is not supported -RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then ./configure ${COMMON_CONFIGURE_ARGS} --with-platform=pc --disable-werror;fi +# GRUB BIOS (i386-pc) is only supported on x86-64 +RUN if [ "${ARCH}" = "x86-64" ]; then ./configure ${COMMON_CONFIGURE_ARGS} --with-platform=pc --disable-werror;fi # Reconfigure gnulib shipped with grub to avoid build issues # This comes because on grub 2.14 these files are shipped pre-generated and they were built on a glibc system # which causes issues when building on musl systems as it expects the bsd-compat-headers to be available # which is not the case here. So we force regenerating these files with our musl toolchain so it can find there is no cdefs -RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then make -s -j${JOBS} -l${MAX_LOAD} -C grub-core/lib/gnulib;fi +RUN if [ "${ARCH}" = "x86-64" ]; then make -s -j${JOBS} -l${MAX_LOAD} -C grub-core/lib/gnulib;fi # GRUB 2.14 + binutils >= 2.4x regression (musl toolchain): force -Ttext instead of --image-base # # Symptom: @@ -2394,12 +2394,12 @@ RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then make -s -j # Implementation: # Pass TARGET_IMG_BASE_LDOPT='-Wl,-Ttext' on the make/make install invocations that produce/install i386-pc images. -RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then \ +RUN if [ "${ARCH}" = "x86-64" ]; then \ make -s -j${JOBS} -l${MAX_LOAD} TARGET_IMG_BASE_LDOPT='-Wl,-Ttext' && \ make -s -j${JOBS} -l${MAX_LOAD} TARGET_IMG_BASE_LDOPT='-Wl,-Ttext' install-strip DESTDIR=/grub-bios ; \ fi # Test the mkimage generation in case we have a misalignment on the kernel.img start entry point -RUN if [ "${ARCH}" != "aarch64" ] && [ "${ARCH}" != "riscv64" ]; then \ +RUN if [ "${ARCH}" = "x86-64" ]; then \ /grub-bios/usr/bin/grub-mkimage \ --directory '/grub-bios/usr/lib/grub/i386-pc' \ --prefix= \ From 68b44c0372c8b37bdec8a3a11a2d1d45168f2c7a Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Fri, 17 Apr 2026 14:06:04 +0200 Subject: [PATCH 13/14] chore: bump mussel to 687d2f5 with RISC-V fix Upstream now removes --with-cpu for RISC-V, so we can drop our workaround. Made-with: Cursor Signed-off-by: Mauro Morales --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 885504ab..d6a9dd07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,7 @@ ARG BUILD_ARCH="x86_64" ENV BUILD_ARCH=${BUILD_ARCH} ARG JOBS ENV JOBS=${JOBS} -ARG MUSSEL_VERSION="8c931ddb2f794ee10de65732bef18ef311d2ca2b" +ARG MUSSEL_VERSION="687d2f5e4d679487209cd9b4bd75091a20cae357" ENV MUSSEL_VERSION=${MUSSEL_VERSION} # Validate that the arches are correct @@ -44,8 +44,6 @@ RUN if [ "${ARCH}" = "aarch64" ] && [ "${BUILD_ARCH}" != "aarch64" ]; then echo RUN if [ "${ARCH}" = "riscv64" ] && [ "${BUILD_ARCH}" != "riscv64" ]; then echo "For ARCH riscv64, BUILD_ARCH must be riscv64"; exit 1; fi RUN git clone https://github.com/firasuke/mussel.git && cd mussel && git checkout ${MUSSEL_VERSION} -b build -# Fix mussel RISC-V configuration: remove unsupported --with-cpu option -RUN cd mussel && sed -i 's/--with-cpu=sifive-u74 //g' mussel RUN cd mussel && ./mussel ${ARCH} -k -l -o -p -s -T ${VENDOR} ENV PATH=/mussel/toolchain/bin/:$PATH From a27587f60a45f1461f12a67cee3e68908017bc8d Mon Sep 17 00:00:00 2001 From: Mauro Morales Date: Fri, 17 Apr 2026 14:30:48 +0200 Subject: [PATCH 14/14] ci: remove cache-to from PR workflow PR builds should only consume cache from main, not push to it. Cache is pushed only from the main branch builds. Signed-off-by: Mauro Morales Made-with: Cursor Signed-off-by: Mauro Morales --- .github/workflows/PR_riscv64.yml | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/.github/workflows/PR_riscv64.yml b/.github/workflows/PR_riscv64.yml index e559ef2e..dcbdb86f 100644 --- a/.github/workflows/PR_riscv64.yml +++ b/.github/workflows/PR_riscv64.yml @@ -67,8 +67,6 @@ jobs: target: stage0 cache-from: | type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -115,8 +113,6 @@ jobs: cache-from: | type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -166,8 +162,6 @@ jobs: type=registry,ref=quay.io/kairos/hadron-build-cache:stage0-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -220,8 +214,6 @@ jobs: type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:cmake-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -271,8 +263,6 @@ jobs: type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:kernel-misc-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -321,8 +311,6 @@ jobs: type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -371,8 +359,6 @@ jobs: type=registry,ref=quay.io/kairos/hadron-build-cache:stage1-merge-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:rsync-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -429,8 +415,6 @@ jobs: type=registry,ref=quay.io/kairos/hadron-build-cache:systemd-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:python-build-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -478,8 +462,6 @@ jobs: cache-from: | type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | ARCH=riscv64 BUILD_ARCH=riscv64 @@ -545,8 +527,6 @@ jobs: type=registry,ref=quay.io/kairos/hadron-build-cache:toolchain-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:container-riscv64,mode=max type=registry,ref=quay.io/kairos/hadron-build-cache:grub-${{ matrix.kernel }}-riscv64,mode=max - cache-to: | - type=registry,ref=quay.io/kairos/hadron-build-cache:grub-${{ matrix.kernel }}-riscv64,mode=max,ignore-error=true,compression=zstd,compression-level=3,oci-mediatypes=true,image-manifest=true build-args: | BOOTLOADER=grub KERNEL_TYPE=${{ matrix.kernel }}