Files
xen/automation/gitlab-ci/build.yaml
T
Ayan Kumar Halder 24bd190cd9 xen/arm: gic: Add GIC SGI boot/self tests in Xen
Boot self-tests (also referred to as boot-time tests or power-on
self-tests) are intended to check that Xen has configured the hardware
correctly before bringing up any domains.

Introduce tests to confirm that, using a dedicated SGI (GIC_SGI_TEST):
1. A cpu can send the SGI to itself
2. A cpu can send the SGI to another specific CPU (CPU0)
3. A cpu can send the SGI to all the other CPUs

Each CPU counts the test SGIs it takes. A sender samples those counters
before sending and then waits for the count of every CPU it targeted to
change, which is how it tells that the SGI was really delivered. The
counters are never reset, so comparing against a sample rather than an
absolute value keeps concurrent senders from disturbing each other. The
snapshot is allocated rather than kept on the stack, as NR_CPUS can be
large enough for such an array to overflow it.

A test reports a failure by panic(), so Xen never continues on a
platform where SGI delivery is broken. When the tests pass, Xen carries
on booting normally.

Also introduce a config CONFIG_BOOT_SELFTEST which enables these
tests. It depends on DEBUG and is off unless explicitly enabled.

Also introduce a boolean command line parameter "gic-test", so that a
build with CONFIG_BOOT_SELFTEST enabled can be shipped but the tests
selected at boot. It is documented in
docs/misc/xen-command-line.pandoc.

In order to keep all the boot self-tests together in the binary, a
separate section "initcallboottest" is introduced. Tests are registered
using __initcallboottest() and run once on every CPU by
do_init_boottests(), bracketed by begin/end messages. They run before
any domain is created on the primary core, and before the idle loop is
entered on a secondary core.

Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
Signed-off-by: Michal Orzel <michal.orzel@amd.com>
Reviewed-by: Julien Grall <julien@xen.org>
2026-09-28 13:11:52 -07:00

843 lines
17 KiB
YAML

.build-tmpl: &build
stage: build
image: ${XEN_REGISTRY}/${CONTAINER}
script:
- ./automation/scripts/build 2>&1 | tee build.log
artifacts:
paths:
- binaries/
- intermediates/
- xen-config
- xen-cppcheck.txt
- '*.log'
- '*/*.log'
when: always
needs: []
rules:
- if: $BUILD_FOR_TESTS_ONLY
when: never
- if: $CI_JOB_NAME =~ $SELECTED_JOBS_ONLY
when: on_success
# override BUILD_FOR_TESTS_ONLY exclusion
.build-test-tpl: &build-test
rules:
- if: $CI_JOB_NAME =~ $SELECTED_JOBS_ONLY
when: on_success
.gcc-tmpl:
variables: &gcc
CC: gcc
CXX: g++
.clang-tmpl:
variables: &clang
CC: clang
CXX: clang++
clang: y
.x86_64-build-tmpl:
<<: *build
variables:
XEN_TARGET_ARCH: x86_64
tags:
- x86_64
.x86_64-build:
extends: .x86_64-build-tmpl
variables:
debug: n
.x86_64-build-debug:
extends: .x86_64-build-tmpl
variables:
debug: y
.x86_32-build-tmpl:
<<: *build
variables:
XEN_TARGET_ARCH: x86_32
tags:
- x86_32
.x86_32-build:
extends: .x86_32-build-tmpl
variables:
debug: n
.x86_32-build-debug:
extends: .x86_32-build-tmpl
variables:
debug: y
.gcc-x86_64-build:
extends: .x86_64-build
variables:
<<: *gcc
.gcc-x86_64-build-debug:
extends: .x86_64-build-debug
variables:
<<: *gcc
.gcc-x86_32-build:
extends: .x86_32-build
variables:
<<: *gcc
.gcc-x86_32-build-debug:
extends: .x86_32-build-debug
variables:
<<: *gcc
.clang-x86_64-build:
extends: .x86_64-build
variables:
<<: *clang
.clang-x86_64-build-debug:
extends: .x86_64-build-debug
variables:
<<: *clang
.clang-x86_32-build:
extends: .x86_32-build
variables:
<<: *clang
.clang-x86_32-build-debug:
extends: .x86_32-build-debug
variables:
<<: *clang
.arm32-cross-build-tmpl:
<<: *build
variables:
XEN_TARGET_ARCH: arm32
tags:
- arm64
.arm32-cross-build:
extends: .arm32-cross-build-tmpl
variables:
debug: n
.arm32-cross-build-debug:
extends: .arm32-cross-build-tmpl
variables:
debug: y
.gcc-arm32-cross-build:
extends: .arm32-cross-build
variables:
<<: *gcc
.gcc-arm32-cross-build-debug:
extends: .arm32-cross-build-debug
variables:
<<: *gcc
.arm64-build-tmpl:
<<: *build
variables:
XEN_TARGET_ARCH: arm64
tags:
- arm64
.arm64-build:
extends: .arm64-build-tmpl
variables:
debug: n
.arm64-build-debug:
extends: .arm64-build-tmpl
variables:
debug: y
.gcc-arm64-build:
extends: .arm64-build
variables:
<<: *gcc
.gcc-arm64-build-debug:
extends: .arm64-build-debug
variables:
<<: *gcc
.riscv64-cross-build-tmpl:
<<: *build
variables:
XEN_TARGET_ARCH: riscv64
tags:
- x86_64
.riscv64-cross-build:
extends: .riscv64-cross-build-tmpl
variables:
debug: n
.riscv64-cross-build-debug:
extends: .riscv64-cross-build-tmpl
variables:
debug: y
.gcc-riscv64-cross-build:
extends: .riscv64-cross-build
variables:
<<: *gcc
.gcc-riscv64-cross-build-debug:
extends: .riscv64-cross-build-debug
variables:
<<: *gcc
.ppc64le-cross-build-tmpl:
<<: *build
variables:
XEN_TARGET_ARCH: ppc64
tags:
- x86_64
.ppc64le-cross-build:
extends: .ppc64le-cross-build-tmpl
variables:
debug: n
.ppc64le-cross-build-debug:
extends: .ppc64le-cross-build-tmpl
variables:
debug: y
.gcc-ppc64le-cross-build:
extends: .ppc64le-cross-build
variables:
<<: *gcc
.gcc-ppc64le-cross-build-debug:
extends: .ppc64le-cross-build-debug
variables:
<<: *gcc
.yocto-test:
stage: build
image: ${XEN_REGISTRY}/${CONTAINER}
script:
- ./automation/build/yocto/build-yocto.sh -v --log-dir=./logs --xen-dir=`pwd` ${YOCTO_BOARD} ${YOCTO_OUTPUT}
variables:
YOCTO_VERSION: scarthgap
CONTAINER: yocto:${YOCTO_VERSION}-${YOCTO_BOARD}${YOCTO_HOST}
artifacts:
paths:
- 'logs/*'
- binaries/
when: always
needs: []
rules:
- if: $CI_JOB_NAME =~ $SELECTED_JOBS_ONLY
when: manual
allow_failure: true
.yocto-test-arm64:
extends: .yocto-test
variables:
YOCTO_HOST: -arm64v8
tags:
- arm64
.yocto-test-x86_64:
extends: .yocto-test
tags:
- x86_64
.x86_64-cross-build-tmpl:
<<: *build
variables:
XEN_TARGET_ARCH: x86_64
tags:
- arm64
.x86_64-cross-build:
extends: .x86_64-cross-build-tmpl
variables:
debug: n
.gcc-x86_64-cross-build:
extends: .x86_64-cross-build
variables:
<<: *gcc
# Jobs below this line
# Build jobs needed for tests
alpine-3.24-x86_64-gcc:
extends: .gcc-x86_64-build
<<: *build-test
variables:
CONTAINER: alpine:3.24-x86_64
alpine-3.24-x86_64-gcc-debug:
extends: .gcc-x86_64-build-debug
<<: *build-test
variables:
CONTAINER: alpine:3.24-x86_64
BUILD_QEMU_XEN: y
EXTRA_XEN_CONFIG: |
CONFIG_EXPERT=y
CONFIG_UNSUPPORTED=y
CONFIG_ARGO=y
CONFIG_UBSAN=y
CONFIG_UBSAN_FATAL=y
CONFIG_MICROCODE_SCAN_DEFAULT=y
CONFIG_XHCI=y
debian-13-x86_64-gcc-debug:
extends: .gcc-x86_64-build-debug
<<: *build-test
variables:
CONTAINER: debian:13-x86_64
EXTRA_XEN_CONFIG: |
CONFIG_SHADOW_PAGING=y
debian-13-x86_64-clang-debug:
extends: .clang-x86_64-build-debug
<<: *build-test
variables:
CONTAINER: debian:13-x86_64
EXTRA_XEN_CONFIG: |
CONFIG_SHADOW_PAGING=y
debian-13-ppc64le-gcc-debug:
extends: .gcc-ppc64le-cross-build-debug
<<: *build-test
variables:
CONTAINER: debian:13-ppc64le
KBUILD_DEFCONFIG: ppc64_defconfig
HYPERVISOR_ONLY: y
EXTRA_XEN_CONFIG: |
CONFIG_UBSAN=y
CONFIG_UBSAN_FATAL=y
debian-13-riscv64-gcc-debug:
extends: .gcc-riscv64-cross-build-debug
<<: *build-test
variables:
CONTAINER: debian:13-riscv64
KBUILD_DEFCONFIG: tiny64_defconfig
HYPERVISOR_ONLY: y
EXTRA_XEN_CONFIG: |
CONFIG_UBSAN=y
CONFIG_UBSAN_FATAL=y
# Arm32 cross-build
debian-12-arm32-gcc:
extends: .gcc-arm32-cross-build
<<: *build-test
variables:
CONTAINER: debian:12-arm64v8-arm32
HYPERVISOR_ONLY: y
debian-12-arm32-gcc-debug:
extends: .gcc-arm32-cross-build-debug
<<: *build-test
variables:
CONTAINER: debian:12-arm64v8-arm32
HYPERVISOR_ONLY: y
debian-12-arm32-gcc-randconfig:
extends: .gcc-arm32-cross-build
variables:
CONTAINER: debian:12-arm64v8-arm32
HYPERVISOR_ONLY: y
RANDCONFIG: y
debian-12-arm32-gcc-debug-staticmem:
extends: .gcc-arm32-cross-build-debug
<<: *build-test
variables:
CONTAINER: debian:12-arm64v8-arm32
HYPERVISOR_ONLY: y
EXTRA_XEN_CONFIG: |
CONFIG_EXPERT=y
CONFIG_UNSUPPORTED=y
CONFIG_STATIC_MEMORY=y
debian-12-arm32-gcc-debug-earlyprintk:
extends: .gcc-arm32-cross-build-debug
<<: *build-test
variables:
CONTAINER: debian:12-arm64v8-arm32
HYPERVISOR_ONLY: y
EXTRA_XEN_CONFIG: |
CONFIG_EARLY_UART_CHOICE_PL011=y
CONFIG_EARLY_UART_BASE_ADDRESS=0x9000000
debian-12-arm32-gcc-debug-mpu:
extends: .gcc-arm32-cross-build-debug
variables:
CONTAINER: debian:12-arm64v8-arm32
HYPERVISOR_ONLY: y
EXTRA_XEN_CONFIG: |
CONFIG_XEN_START_ADDRESS=0x0
CONFIG_MPU=y
CONFIG_UNSUPPORTED=y
# Arm builds
debian-12-arm64-gcc:
extends: .gcc-arm64-build
variables:
CONTAINER: debian:12-arm64v8
debian-12-arm64-gcc-debug:
extends: .gcc-arm64-build-debug
variables:
CONTAINER: debian:12-arm64v8
debian-13-arm64-gcc:
extends: .gcc-arm64-build
variables:
CONTAINER: debian:13-arm64v8
debian-13-arm64-gcc-debug:
extends: .gcc-arm64-build-debug
variables:
CONTAINER: debian:13-arm64v8
alpine-3.24-arm64-gcc:
extends: .gcc-arm64-build
<<: *build-test
variables:
CONTAINER: alpine:3.24-arm64v8
alpine-3.24-arm64-gcc-debug:
extends: .gcc-arm64-build-debug
<<: *build-test
variables:
CONTAINER: alpine:3.24-arm64v8
EXTRA_XEN_CONFIG: |
CONFIG_UBSAN=y
CONFIG_UBSAN_FATAL=y
alpine-3.24-arm64-gcc-debug-boot-selftest:
extends: .gcc-arm64-build-debug
<<: *build-test
variables:
CONTAINER: alpine:3.24-arm64v8
EXTRA_XEN_CONFIG: |
CONFIG_BOOT_SELFTEST=y
alpine-3.24-arm64-gcc-randconfig:
extends: .gcc-arm64-build
variables:
CONTAINER: alpine:3.24-arm64v8
RANDCONFIG: y
alpine-3.24-arm64-gcc-debug-staticmem:
extends: .gcc-arm64-build-debug
<<: *build-test
variables:
CONTAINER: alpine:3.24-arm64v8
EXTRA_XEN_CONFIG: |
CONFIG_EXPERT=y
CONFIG_UNSUPPORTED=y
CONFIG_STATIC_MEMORY=y
alpine-3.24-arm64-gcc-debug-static-shared-mem:
extends: .gcc-arm64-build-debug
<<: *build-test
variables:
CONTAINER: alpine:3.24-arm64v8
EXTRA_XEN_CONFIG: |
CONFIG_UNSUPPORTED=y
CONFIG_STATIC_MEMORY=y
CONFIG_STATIC_SHM=y
alpine-3.24-arm64-gcc-debug-boot-cpupools:
extends: .gcc-arm64-build-debug
<<: *build-test
variables:
CONTAINER: alpine:3.24-arm64v8
EXTRA_XEN_CONFIG: |
CONFIG_BOOT_TIME_CPUPOOLS=y
alpine-3.24-arm64-gcc-debug-earlyprintk:
extends: .gcc-arm64-build-debug
<<: *build-test
variables:
CONTAINER: alpine:3.24-arm64v8
EXTRA_XEN_CONFIG: |
CONFIG_EARLY_UART_CHOICE_PL011=y
CONFIG_EARLY_UART_BASE_ADDRESS=0x9000000
alpine-3.24-arm64-gcc-debug-mpu:
extends: .gcc-arm64-build-debug
variables:
CONTAINER: alpine:3.24-arm64v8
HYPERVISOR_ONLY: y
EXTRA_XEN_CONFIG: |
CONFIG_XEN_START_ADDRESS=0x0
CONFIG_MPU=y
CONFIG_UNSUPPORTED=y
# Yocto test jobs
yocto-qemuarm64:
extends: .yocto-test-arm64
variables:
YOCTO_BOARD: qemuarm64
yocto-qemuarm:
extends: .yocto-test-arm64
variables:
YOCTO_BOARD: qemuarm
YOCTO_OUTPUT: --copy-output
yocto-qemux86-64:
extends: .yocto-test-x86_64
variables:
YOCTO_BOARD: qemux86-64
# Cppcheck analysis jobs
debian-12-x86_64-gcc-cppcheck:
extends: .gcc-x86_64-cross-build
variables:
CONTAINER: debian:12-arm64v8-cppcheck
CROSS_COMPILE: /usr/bin/x86_64-linux-gnu-
CPPCHECK: y
HYPERVISOR_ONLY: y
debian-12-arm32-gcc-cppcheck:
extends: .gcc-arm32-cross-build
variables:
CONTAINER: debian:12-arm64v8-cppcheck
CROSS_COMPILE: /usr/bin/arm-linux-gnueabihf-
CPPCHECK: y
HYPERVISOR_ONLY: y
debian-12-arm64-gcc-cppcheck:
extends: .gcc-arm64-build
variables:
CONTAINER: debian:12-arm64v8-cppcheck
CPPCHECK: y
HYPERVISOR_ONLY: y
# Build jobs not needed for tests
alpine-3.24-x86_64-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: alpine:3.24-x86_64
alpine-3.24-x86_64-clang-debug:
extends: .clang-x86_64-build-debug
variables:
CONTAINER: alpine:3.24-x86_64
archlinux-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: archlinux:current-x86_64
allow_failure: true
archlinux-x86_64-gcc-debug:
extends: .gcc-x86_64-build-debug
variables:
CONTAINER: archlinux:current-x86_64
allow_failure: true
debian-12-x86_64-gcc-ibt:
extends: .gcc-x86_64-build
variables:
CONTAINER: debian:12-x86_64-gcc-ibt
RANDCONFIG: y
EXTRA_FIXED_RANDCONFIG: |
CONFIG_XEN_IBT=y
debian-12-x86_64-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: debian:12-x86_64
debian-12-x86_64-clang-debug:
extends: .clang-x86_64-build-debug
variables:
CONTAINER: debian:12-x86_64
debian-12-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: debian:12-x86_64
debian-12-x86_64-gcc-debug:
extends: .gcc-x86_64-build-debug
variables:
CONTAINER: debian:12-x86_64
debian-12-x86_32-clang-debug:
extends: .clang-x86_32-build-debug
variables:
CONTAINER: debian:12-x86_32
debian-12-x86_32-gcc-debug:
extends: .gcc-x86_32-build-debug
variables:
CONTAINER: debian:12-x86_32
debian-13-x86_64-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: debian:13-x86_64
debian-13-x86_64-clang-randconfig:
extends: .clang-x86_64-build
variables:
CONTAINER: debian:13-x86_64
RANDCONFIG: y
EXTRA_FIXED_RANDCONFIG: |
CONFIG_COVERAGE=n # Disable coverage otherwise build times out.
debian-13-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: debian:13-x86_64
debian-13-x86_64-gcc-randconfig:
extends: .gcc-x86_64-build
variables:
CONTAINER: debian:13-x86_64
RANDCONFIG: y
debian-13-x86_32-clang-debug:
extends: .clang-x86_32-build-debug
variables:
CONTAINER: debian:13-x86_32
debian-13-x86_32-gcc-debug:
extends: .gcc-x86_32-build-debug
variables:
CONTAINER: debian:13-x86_32
fedora-43-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: fedora:43-x86_64
fedora-43-x86_64-gcc-debug:
extends: .gcc-x86_64-build-debug
variables:
CONTAINER: fedora:43-x86_64
ubuntu-18.04-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: ubuntu:18.04-x86_64
ubuntu-18.04-x86_64-gcc-debug:
extends: .gcc-x86_64-build-debug
variables:
CONTAINER: ubuntu:18.04-x86_64
ubuntu-20.04-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: ubuntu:20.04-x86_64
ubuntu-22.04-x86_64-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: ubuntu:22.04-x86_64
ubuntu-22.04-x86_64-clang-debug:
extends: .clang-x86_64-build-debug
variables:
CONTAINER: ubuntu:22.04-x86_64
ubuntu-22.04-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: ubuntu:22.04-x86_64
ubuntu-24.04-x86_64-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: ubuntu:24.04-x86_64
ubuntu-24.04-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: ubuntu:24.04-x86_64
ubuntu-26.04-x86_64-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: ubuntu:26.04-x86_64
ubuntu-26.04-x86_64-clang-debug:
extends: .clang-x86_64-build-debug
variables:
CONTAINER: ubuntu:26.04-x86_64
ubuntu-26.04-x86_64-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: ubuntu:26.04-x86_64
ubuntu-26.04-x86_64-gcc-debug:
extends: .gcc-x86_64-build-debug
variables:
CONTAINER: ubuntu:26.04-x86_64
opensuse-leap-16.0-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: opensuse:leap-16.0-x86_64
opensuse-leap-16.0-clang-debug:
extends: .clang-x86_64-build-debug
variables:
CONTAINER: opensuse:leap-16.0-x86_64
opensuse-leap-16.0-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: opensuse:leap-16.0-x86_64
opensuse-leap-16.0-gcc-debug:
extends: .gcc-x86_64-build-debug
variables:
CONTAINER: opensuse:leap-16.0-x86_64
opensuse-tumbleweed-clang:
extends: .clang-x86_64-build
variables:
CONTAINER: opensuse:tumbleweed-x86_64
allow_failure: true
opensuse-tumbleweed-clang-debug:
extends: .clang-x86_64-build-debug
variables:
CONTAINER: opensuse:tumbleweed-x86_64
allow_failure: true
opensuse-tumbleweed-gcc:
extends: .gcc-x86_64-build
variables:
CONTAINER: opensuse:tumbleweed-x86_64
allow_failure: true
opensuse-tumbleweed-gcc-debug:
extends: .gcc-x86_64-build-debug
variables:
CONTAINER: opensuse:tumbleweed-x86_64
allow_failure: true
# PowerPC builds (x86 cross)
debian-11-ppc64le-gcc:
extends: .gcc-ppc64le-cross-build
variables:
CONTAINER: debian:11-ppc64le
KBUILD_DEFCONFIG: ppc64_defconfig
HYPERVISOR_ONLY: y
debian-11-ppc64le-gcc-debug:
extends: .gcc-ppc64le-cross-build-debug
variables:
CONTAINER: debian:11-ppc64le
KBUILD_DEFCONFIG: ppc64_defconfig
HYPERVISOR_ONLY: y
debian-12-ppc64le-gcc:
extends: .gcc-ppc64le-cross-build
variables:
CONTAINER: debian:12-ppc64le
KBUILD_DEFCONFIG: ppc64_defconfig
HYPERVISOR_ONLY: y
debian-12-ppc64le-gcc-debug:
extends: .gcc-ppc64le-cross-build-debug
variables:
CONTAINER: debian:12-ppc64le
KBUILD_DEFCONFIG: ppc64_defconfig
HYPERVISOR_ONLY: y
debian-13-ppc64le-gcc:
extends: .gcc-ppc64le-cross-build
variables:
CONTAINER: debian:13-ppc64le
KBUILD_DEFCONFIG: ppc64_defconfig
HYPERVISOR_ONLY: y
# RISC-V 64 cross-build
debian-12-riscv64-gcc:
extends: .gcc-riscv64-cross-build
variables:
CONTAINER: debian:12-riscv64
KBUILD_DEFCONFIG: tiny64_defconfig
HYPERVISOR_ONLY: y
debian-12-riscv64-gcc-debug:
extends: .gcc-riscv64-cross-build-debug
variables:
CONTAINER: debian:12-riscv64
KBUILD_DEFCONFIG: tiny64_defconfig
HYPERVISOR_ONLY: y
debian-13-riscv64-gcc:
extends: .gcc-riscv64-cross-build
variables:
CONTAINER: debian:13-riscv64
KBUILD_DEFCONFIG: tiny64_defconfig
HYPERVISOR_ONLY: y
.riscv-fixed-randconfig:
variables: &riscv-fixed-randconfig
EXTRA_FIXED_RANDCONFIG: |
CONFIG_BOOT_TIME_CPUPOOLS=n
CONFIG_COVERAGE=n
CONFIG_EXPERT=y
CONFIG_GRANT_TABLE=n
CONFIG_LIVEPATCH=n
CONFIG_QEMU_PLATFORM=y
CONFIG_VM_EVENT=n
CONFIG_XSM=n
debian-13-riscv64-gcc-randconfig:
extends: .gcc-riscv64-cross-build
variables:
CONTAINER: debian:13-riscv64
KBUILD_DEFCONFIG: tiny64_defconfig
RANDCONFIG: y
<<: *riscv-fixed-randconfig
# macOS build jobs
.macos-26:
<<: *build
tags:
- saas-macos-medium-m1
image: macos-26-xcode-26
variables:
HOMEBREW_NO_AUTO_UPDATE: 1
HOSTCC: clang
HYPERVISOR_ONLY: y
<<: *gcc
script:
- brew install ${CROSS_COMPILE}gcc ${CROSS_COMPILE}binutils
- alias nproc="sysctl -n hw.ncpu"
- ./automation/scripts/build 2>&1 | tee build.log
macos-26-x86_64:
extends:
- .macos-26
variables:
XEN_TARGET_ARCH: x86_64
CROSS_COMPILE: x86_64-elf-
macos-26-arm64:
extends:
- .macos-26
variables:
XEN_TARGET_ARCH: arm64
CROSS_COMPILE: aarch64-elf-