From 9a52fa1d1cd1780847e66b3120179c05c693b0b2 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Sun, 12 Oct 2025 18:54:24 -0700 Subject: [PATCH] add support for xen boot via standard chainload --- hack/dev/boot/Dockerfile | 4 ++++ hack/dev/build.sh | 14 ++++++++++++-- hack/dev/configs/kernel.sprout.toml | 11 +++++++++-- hack/dev/configs/xen.cfg | 7 +++++++ hack/dev/vm/Dockerfile.xen | 6 ++++++ 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 hack/dev/configs/xen.cfg create mode 100644 hack/dev/vm/Dockerfile.xen diff --git a/hack/dev/boot/Dockerfile b/hack/dev/boot/Dockerfile index aeb4be3..0c0b355 100644 --- a/hack/dev/boot/Dockerfile +++ b/hack/dev/boot/Dockerfile @@ -9,6 +9,8 @@ COPY sprout.efi /work/${EFI_NAME}.EFI COPY sprout.toml /work/SPROUT.TOML COPY kernel.efi /work/KERNEL.EFI COPY shell.efi /work/SHELL.EFI +COPY xen.efi /work/XEN.EFI +COPY xen.cfg /work/XEN.CFG COPY initramfs /work/INITRAMFS COPY edera-splash.png /work/EDERA-SPLASH.PNG RUN truncate -s128MiB sprout.img && \ @@ -21,6 +23,8 @@ RUN truncate -s128MiB sprout.img && \ mcopy -i sprout.img ${EFI_NAME}.EFI ::/EFI/BOOT/ && \ mcopy -i sprout.img KERNEL.EFI ::/EFI/BOOT/ && \ mcopy -i sprout.img SHELL.EFI ::/EFI/BOOT/ && \ + mcopy -i sprout.img XEN.EFI ::/EFI/BOOT/ && \ + mcopy -i sprout.img XEN.CFG ::/EFI/BOOT/ && \ mcopy -i sprout.img SPROUT.TOML ::/ && \ mcopy -i sprout.img EDERA-SPLASH.PNG ::/ && \ mcopy -i sprout.img INITRAMFS ::/ && \ diff --git a/hack/dev/build.sh b/hack/dev/build.sh index 17ee58d..13bf237 100755 --- a/hack/dev/build.sh +++ b/hack/dev/build.sh @@ -68,8 +68,6 @@ if [ "${SKIP_KERNEL_BUILD}" != "1" ]; then fi copy_from_image "${DOCKER_PREFIX}/sprout-kernel-${TARGET_ARCH}" "kernel.efi" "${FINAL_DIR}/kernel.efi" - cp "hack/dev/configs/${SPROUT_CONFIG_NAME}.sprout.toml" "${FINAL_DIR}/sprout.toml" - cp "hack/dev/assets/edera-splash.png" "${FINAL_DIR}/edera-splash.png" fi if [ "${SKIP_VM_BUILD}" != "1" ]; then @@ -79,6 +77,8 @@ if [ "${SKIP_VM_BUILD}" != "1" ]; then copy_from_image "${DOCKER_PREFIX}/sprout-ovmf-${TARGET_ARCH}" "shell.efi" "${FINAL_DIR}/shell.efi" docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-initramfs-${TARGET_ARCH}:${DOCKER_TAG}" -f hack/dev/vm/Dockerfile.initramfs "${FINAL_DIR}" copy_from_image "${DOCKER_PREFIX}/sprout-initramfs-${TARGET_ARCH}" "initramfs" "${FINAL_DIR}/initramfs" + docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-xen-${TARGET_ARCH}:${DOCKER_TAG}" -f hack/dev/vm/Dockerfile.xen "${FINAL_DIR}" + copy_from_image "${DOCKER_PREFIX}/sprout-xen-${TARGET_ARCH}" "xen.efi" "${FINAL_DIR}/xen.efi" fi if [ "${SKIP_SPROUT_BUILD}" != "1" ]; then @@ -92,6 +92,10 @@ if [ "${SKIP_SPROUT_BUILD}" != "1" ]; then copy_from_image "${DOCKER_PREFIX}/sprout-${TARGET_ARCH}" "sprout.efi" "${FINAL_DIR}/sprout.efi" fi + cp "hack/dev/configs/${SPROUT_CONFIG_NAME}.sprout.toml" "${FINAL_DIR}/sprout.toml" + cp "hack/dev/configs/xen.cfg" "${FINAL_DIR}/xen.cfg" + cp "hack/dev/assets/edera-splash.png" "${FINAL_DIR}/edera-splash.png" + mkdir -p "${FINAL_DIR}/efi/EFI/BOOT" cp "${FINAL_DIR}/sprout.efi" "${FINAL_DIR}/efi/EFI/BOOT/${EFI_NAME}.EFI" if [ -f "${FINAL_DIR}/kernel.efi" ]; then @@ -100,6 +104,12 @@ if [ "${SKIP_SPROUT_BUILD}" != "1" ]; then if [ -f "${FINAL_DIR}/shell.efi" ]; then cp "${FINAL_DIR}/shell.efi" "${FINAL_DIR}/efi/EFI/BOOT/SHELL.EFI" fi + if [ -f "${FINAL_DIR}/xen.efi" ]; then + cp "${FINAL_DIR}/xen.efi" "${FINAL_DIR}/efi/EFI/BOOT/XEN.EFI" + fi + if [ -f "${FINAL_DIR}/xen.cfg" ]; then + cp "${FINAL_DIR}/xen.cfg" "${FINAL_DIR}/efi/EFI/BOOT/XEN.CFG" + fi cp "${FINAL_DIR}/sprout.toml" "${FINAL_DIR}/efi/SPROUT.TOML" cp "${FINAL_DIR}/edera-splash.png" "${FINAL_DIR}/efi/EDERA-SPLASH.PNG" cp "${FINAL_DIR}/initramfs" "${FINAL_DIR}/efi/INITRAMFS" diff --git a/hack/dev/configs/kernel.sprout.toml b/hack/dev/configs/kernel.sprout.toml index f7768f8..353efe3 100644 --- a/hack/dev/configs/kernel.sprout.toml +++ b/hack/dev/configs/kernel.sprout.toml @@ -17,11 +17,18 @@ chainload.options = ["$default-options"] [actions.chainload-shell] chainload.path = "\\EFI\\BOOT\\shell.efi" +[actions.chainload-xen] +chainload.path = "\\EFI\\BOOT\\xen.efi" + [generators.kernels.matrix] -entry.title = "Boot Kernel $name" +entry.title = "Boot Linux $name" entry.values.path = "\\EFI\\BOOT\\$name" entry.actions = ["chainload-kernel"] values.name = ["kernel.efi"] +#[entries.xen] +#title = "Boot Xen" +#actions = ["chainload-xen"] + [[phases.startup]] -actions = ["welcome", "splash"] +actions = ["welcome"] diff --git a/hack/dev/configs/xen.cfg b/hack/dev/configs/xen.cfg new file mode 100644 index 0000000..ae0ee4e --- /dev/null +++ b/hack/dev/configs/xen.cfg @@ -0,0 +1,7 @@ +[global] +default=sprout + +[sprout] +options=console=hvc0 +kernel=\EFI\BOOT\KERNEL.EFI +ramdisk=\initramfs diff --git a/hack/dev/vm/Dockerfile.xen b/hack/dev/vm/Dockerfile.xen new file mode 100644 index 0000000..19d7afd --- /dev/null +++ b/hack/dev/vm/Dockerfile.xen @@ -0,0 +1,6 @@ +FROM alpine:3.22@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1 AS build +ARG TARGETPLATFORM +RUN apk add --no-cache xen-hypervisor && cp /usr/lib/efi/xen.efi /xen.efi + +FROM scratch AS final +COPY --from=build /xen.efi /xen.efi