From 234cea6d486affde51a5a5c5a6ec6692d4a686a8 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Thu, 16 Apr 2026 15:47:49 +0200 Subject: [PATCH 1/3] Workaround for test-build-kontron hanging apt + renode tests moved to wolfboot-ci --- .../test-build-kontron-vx3060-s2.yml | 34 +++++++++++++++++-- .github/workflows/test-x86-fsp-qemu.yml | 34 +++++++++++++++++-- tools/renode/docker-test.sh | 6 ++-- 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test-build-kontron-vx3060-s2.yml b/.github/workflows/test-build-kontron-vx3060-s2.yml index 5e0fb3311a..29e4b5889f 100644 --- a/.github/workflows/test-build-kontron-vx3060-s2.yml +++ b/.github/workflows/test-build-kontron-vx3060-s2.yml @@ -12,10 +12,40 @@ jobs: - uses: actions/checkout@v4 with: submodules: true + - name: Workaround for sources.list + run: | + set -euxo pipefail + + apt-cache policy + grep -RInE '^(deb|Types|URIs)' /etc/apt || true + + shopt -s nullglob + + sudo sed -i \ + -e "s|https\?://azure\.archive\.ubuntu\.com/ubuntu/?|http://mirror.arizona.edu/ubuntu/|g" \ + /etc/apt/sources.list || true + + for f in /etc/apt/sources.list.d/*.list; do + sudo sed -i \ + -e "s|https\?://azure\.archive\.ubuntu\.com/ubuntu/?|http://mirror.arizona.edu/ubuntu/|g" \ + "$f" + done + + for f in /etc/apt/sources.list.d/*.sources; do + sudo sed -i \ + -e "s|https\?://azure\.archive\.ubuntu\.com/ubuntu/?|http://mirror.arizona.edu/ubuntu/|g" \ + -e "s|https\?://azure\.archive\.ubuntu\.com|http://mirror.arizona.edu|g" \ + "$f" + done + + if grep -qE '^[[:space:]]*https?://azure\.archive\.ubuntu\.com/ubuntu/?' /etc/apt/apt-mirrors.txt; then + sudo sed -i 's|https\?://azure\.archive\.ubuntu\.com/ubuntu/|http://mirror.arizona.edu/ubuntu/|g' /etc/apt/apt-mirrors.txt + fi - name: install req run: | - sudo apt-get update - sudo apt-get install --no-install-recommends -y -q nasm gcc-multilib + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update -o Acquire::Retries=3 + sudo apt-get install --no-install-recommends -y -q -o Acquire::Retries=3 nasm gcc-multilib - name: setup git run: | git config --global user.email "you@example.com" diff --git a/.github/workflows/test-x86-fsp-qemu.yml b/.github/workflows/test-x86-fsp-qemu.yml index 2574123939..bc4b00b6b8 100644 --- a/.github/workflows/test-x86-fsp-qemu.yml +++ b/.github/workflows/test-x86-fsp-qemu.yml @@ -12,10 +12,40 @@ jobs: - uses: actions/checkout@v4 with: submodules: true + - name: Workaround for sources.list + run: | + set -euxo pipefail + + apt-cache policy + grep -RInE '^(deb|Types|URIs)' /etc/apt || true + + shopt -s nullglob + + sudo sed -i \ + -e "s|https\?://azure\.archive\.ubuntu\.com/ubuntu/?|http://mirror.arizona.edu/ubuntu/|g" \ + /etc/apt/sources.list || true + + for f in /etc/apt/sources.list.d/*.list; do + sudo sed -i \ + -e "s|https\?://azure\.archive\.ubuntu\.com/ubuntu/?|http://mirror.arizona.edu/ubuntu/|g" \ + "$f" + done + + for f in /etc/apt/sources.list.d/*.sources; do + sudo sed -i \ + -e "s|https\?://azure\.archive\.ubuntu\.com/ubuntu/?|http://mirror.arizona.edu/ubuntu/|g" \ + -e "s|https\?://azure\.archive\.ubuntu\.com|http://mirror.arizona.edu|g" \ + "$f" + done + + if grep -qE '^[[:space:]]*https?://azure\.archive\.ubuntu\.com/ubuntu/?' /etc/apt/apt-mirrors.txt; then + sudo sed -i 's|https\?://azure\.archive\.ubuntu\.com/ubuntu/|http://mirror.arizona.edu/ubuntu/|g' /etc/apt/apt-mirrors.txt + fi - name: install req run: | - sudo apt-get update - sudo apt-get install --no-install-recommends -y -q nasm gcc-multilib qemu-system-x86 swtpm uuid-dev + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update -o Acquire::Retries=3 + sudo apt-get install --no-install-recommends -y -q -o Acquire::Retries=3 nasm gcc-multilib qemu-system-x86 swtpm uuid-dev - name: setup git run: | git config --global user.email "you@example.com" diff --git a/tools/renode/docker-test.sh b/tools/renode/docker-test.sh index fb2061dd60..63e9177344 100755 --- a/tools/renode/docker-test.sh +++ b/tools/renode/docker-test.sh @@ -4,13 +4,13 @@ declare -r HOST_TEST_RESULTS_PATH=${HOST_ROOT_DIR}/test_results declare -r HOST_LOG_PATH=${HOST_TEST_RESULTS_PATH} declare -r HOST_LOG_FILENAME=${HOST_LOG_PATH}/logs.txt -declare -r DOCKER_TAG=renode_nrf52 +declare -r DOCKER_IMAGE="${DOCKER_IMAGE:-ghcr.io/wolfssl/wolfboot-ci-renode:latest}" declare -r DOCKER_WORKSPACE=/workspace declare -r DOCKER_TEST_RESULTS_PATH=/tmp/test_results mkdir -p ${HOST_LOG_PATH} -docker build -t ${DOCKER_TAG} -f ${HOST_ROOT_DIR}/tools/renode/Dockerfile . +docker pull ${DOCKER_IMAGE} >/dev/null 2>&1 || true # running in `if` to avoid setting +e @@ -22,7 +22,7 @@ if ! docker run \ --env SCRIPT=${DOCKER_WORKSPACE}/renode-config.resc \ --env RENODE_CHECKOUT=/home/developer/renode \ --workdir ${DOCKER_WORKSPACE} \ - ${DOCKER_TAG} \ + ${DOCKER_IMAGE} \ /bin/bash -c "tools/scripts/renode-test-update.sh $@ 2>&1 > ${DOCKER_TEST_RESULTS_PATH}/logs.txt" then echo "FAILED" From 856ffc59fe6ce1511062fd55c3a6ba69babe5ce4 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Thu, 16 Apr 2026 15:55:00 +0200 Subject: [PATCH 2/3] Proper migration of renode tests --- .../workflows/test-renode-fastmath-smallstack.yml | 12 +++++++++++- .github/workflows/test-renode-fastmath.yml | 11 +++++++++++ .github/workflows/test-renode-noasm-smallstack.yml | 12 +++++++++++- .github/workflows/test-renode-noasm.yml | 12 +++++++++++- .github/workflows/test-renode-nrf52.yml | 12 +++++++++++- .github/workflows/test-renode-sha3.yml | 11 +++++++++++ .github/workflows/test-renode-sha384.yml | 12 +++++++++++- .github/workflows/test-renode-smallstack.yml | 12 +++++++++++- tools/renode/docker-test.sh | 2 -- 9 files changed, 88 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test-renode-fastmath-smallstack.yml b/.github/workflows/test-renode-fastmath-smallstack.yml index 3a94cf60ef..bb66e302b0 100644 --- a/.github/workflows/test-renode-fastmath-smallstack.yml +++ b/.github/workflows/test-renode-fastmath-smallstack.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_fastmath_smallstack: runs-on: ubuntu-22.04 @@ -15,6 +19,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h @@ -55,4 +66,3 @@ jobs: with: name: Renode Test Results path: test_results/ - diff --git a/.github/workflows/test-renode-fastmath.yml b/.github/workflows/test-renode-fastmath.yml index fe7ba529d1..9ccf62563d 100644 --- a/.github/workflows/test-renode-fastmath.yml +++ b/.github/workflows/test-renode-fastmath.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_fastmath: runs-on: ubuntu-22.04 @@ -16,6 +20,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h diff --git a/.github/workflows/test-renode-noasm-smallstack.yml b/.github/workflows/test-renode-noasm-smallstack.yml index 4cdcb84af6..9f3bf274bb 100644 --- a/.github/workflows/test-renode-noasm-smallstack.yml +++ b/.github/workflows/test-renode-noasm-smallstack.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_noasm_smallstack: runs-on: ubuntu-22.04 @@ -16,6 +20,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h @@ -56,4 +67,3 @@ jobs: with: name: Renode Test Results path: test_results/ - diff --git a/.github/workflows/test-renode-noasm.yml b/.github/workflows/test-renode-noasm.yml index 45adf14aaa..9dc670886e 100644 --- a/.github/workflows/test-renode-noasm.yml +++ b/.github/workflows/test-renode-noasm.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_noasm: runs-on: ubuntu-22.04 @@ -16,6 +20,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h @@ -65,4 +76,3 @@ jobs: with: name: Renode Test Results path: test_results/ - diff --git a/.github/workflows/test-renode-nrf52.yml b/.github/workflows/test-renode-nrf52.yml index 99180be2e4..4320065427 100644 --- a/.github/workflows/test-renode-nrf52.yml +++ b/.github/workflows/test-renode-nrf52.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_base: runs-on: ubuntu-22.04 @@ -16,6 +20,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h SIGN=NONE @@ -84,4 +95,3 @@ jobs: with: name: Renode Test Results path: test_results/ - diff --git a/.github/workflows/test-renode-sha3.yml b/.github/workflows/test-renode-sha3.yml index 1c564140ae..d7368b3fcb 100644 --- a/.github/workflows/test-renode-sha3.yml +++ b/.github/workflows/test-renode-sha3.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_multi_sha: runs-on: ubuntu-22.04 @@ -16,6 +20,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h diff --git a/.github/workflows/test-renode-sha384.yml b/.github/workflows/test-renode-sha384.yml index 6a1e4ea47b..c18d267d3b 100644 --- a/.github/workflows/test-renode-sha384.yml +++ b/.github/workflows/test-renode-sha384.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_multi_sha: runs-on: ubuntu-22.04 @@ -16,6 +20,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h @@ -68,4 +79,3 @@ jobs: with: name: Renode Test Results path: test_results/ - diff --git a/.github/workflows/test-renode-smallstack.yml b/.github/workflows/test-renode-smallstack.yml index 4e583d0c29..7dcdcadbba 100644 --- a/.github/workflows/test-renode-smallstack.yml +++ b/.github/workflows/test-renode-smallstack.yml @@ -6,6 +6,10 @@ on: pull_request: branches: [ '*' ] +permissions: + contents: read + packages: read + jobs: renode_automated_smallstack: runs-on: ubuntu-22.04 @@ -16,6 +20,13 @@ jobs: with: submodules: true + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Select config run: | cp config/examples/nrf52840.config .config && make include/target.h @@ -71,4 +82,3 @@ jobs: with: name: Renode Test Results path: test_results/ - diff --git a/tools/renode/docker-test.sh b/tools/renode/docker-test.sh index 63e9177344..772a62da2f 100755 --- a/tools/renode/docker-test.sh +++ b/tools/renode/docker-test.sh @@ -12,8 +12,6 @@ mkdir -p ${HOST_LOG_PATH} docker pull ${DOCKER_IMAGE} >/dev/null 2>&1 || true -# running in `if` to avoid setting +e - exit_code=0 if ! docker run \ --log-driver=none -a stdout -a stderr \ From 602fe829dd148b896cb9c021c4dc240654cc06b8 Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Thu, 16 Apr 2026 18:38:56 +0200 Subject: [PATCH 3/3] Fix NRF52 UART DMA and Renode test infrastructure hal/nrf52.c: - Use static volatile buffer for UARTE DMA source instead of stack variable address. GCC 15.2 with -Os optimized away the store to the stack slot, causing the DMA to read zeros. - Set UART0_ENABLE to 4 (UARTE mode) per NRF52840 datasheet. tools/test-expect-version/test-expect-version.c: - Replace deprecated termio.h and linux/serial.h with sys/ioctl.h for compatibility with newer glibc. tools/renode/docker-test.sh: - Remove unused RENODE_CHECKOUT env var. tools/scripts/renode-test-update.sh: - Add robust UART wait functions with timeouts and liveness checks. - Log Renode output to /tmp/renode.log for diagnostics on failure. - Use run_expect_version helper with configurable timeout. --- hal/nrf52.c | 8 +- tools/renode/docker-test.sh | 1 - tools/scripts/renode-test-update.sh | 90 +++++++++++++++++-- .../test-expect-version/test-expect-version.c | 3 +- 4 files changed, 89 insertions(+), 13 deletions(-) diff --git a/hal/nrf52.c b/hal/nrf52.c index 4204c18d30..b606a41c46 100644 --- a/hal/nrf52.c +++ b/hal/nrf52.c @@ -29,14 +29,16 @@ void uart_init(void) { UART0_BAUDRATE = BAUD_115200; - UART0_ENABLE = 1; + UART0_ENABLE = 4; } +static volatile uint8_t uart_tx_buf; + static void uart_write_char(char c) { + uart_tx_buf = c; UART0_EVENT_ENDTX = 0; - - UART0_TXD_PTR = (uint32_t)(&c); + UART0_TXD_PTR = (uint32_t)&uart_tx_buf; UART0_TXD_MAXCOUNT = 1; UART0_TASK_STARTTX = 1; while(UART0_EVENT_ENDTX == 0) diff --git a/tools/renode/docker-test.sh b/tools/renode/docker-test.sh index 772a62da2f..c2e6d0d1ff 100755 --- a/tools/renode/docker-test.sh +++ b/tools/renode/docker-test.sh @@ -18,7 +18,6 @@ if ! docker run \ --volume ${HOST_ROOT_DIR}:${DOCKER_WORKSPACE} \ --volume ${HOST_TEST_RESULTS_PATH}:${DOCKER_TEST_RESULTS_PATH} \ --env SCRIPT=${DOCKER_WORKSPACE}/renode-config.resc \ - --env RENODE_CHECKOUT=/home/developer/renode \ --workdir ${DOCKER_WORKSPACE} \ ${DOCKER_IMAGE} \ /bin/bash -c "tools/scripts/renode-test-update.sh $@ 2>&1 > ${DOCKER_TEST_RESULTS_PATH}/logs.txt" diff --git a/tools/scripts/renode-test-update.sh b/tools/scripts/renode-test-update.sh index 71de4198e7..f06788abfd 100755 --- a/tools/scripts/renode-test-update.sh +++ b/tools/scripts/renode-test-update.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -u export RENODE_UART=/tmp/wolfboot.uart export RENODE_PIDFILE=/tmp/renode.pid @@ -8,6 +9,18 @@ export RENODE_PORT=55155 export RENODE_OPTIONS="--pid-file=$RENODE_PIDFILE --disable-xwt -P $RENODE_PORT" export EXPVER=tools/test-expect-version/test-expect-version export TEST_OPTIONS=$@ +export RENODE_START_TIMEOUT=30 +export UART_OPEN_TIMEOUT=10 +export EXPVER_TIMEOUT=75 +export RENODE_LOG=/tmp/renode.log +RENODE_BG_PID= + +show_renode_log() { + if [ -f "$RENODE_LOG" ]; then + echo "----- Renode log -----" + tail -n 80 "$RENODE_LOG" + fi +} quit_renode() { if (which nc); then @@ -15,10 +28,72 @@ quit_renode() { fi } +renode_is_alive() { + if [ -n "${RENODE_BG_PID:-}" ] && kill -0 "$RENODE_BG_PID" 2>/dev/null; then + return 0 + fi + if [ -f "$RENODE_PIDFILE" ] && kill -0 "$(cat "$RENODE_PIDFILE")" 2>/dev/null; then + return 0 + fi + return 1 +} + +wait_for_uart_node() { + local waited=0 + while [ "$waited" -lt "$RENODE_START_TIMEOUT" ]; do + if [ -e "$RENODE_UART" ]; then + return 0 + fi + if ! renode_is_alive; then + echo "Renode exited before creating UART PTY" + show_renode_log + return 1 + fi + sleep 1 + waited=$((waited + 1)) + done + + echo "Timed out waiting for Renode UART PTY: $RENODE_UART" + show_renode_log + return 1 +} +wait_for_uart_ready() { + local waited=0 + + while [ "$waited" -lt "$UART_OPEN_TIMEOUT" ]; do + if bash -lc 'exec 3<>"$1"' _ "$RENODE_UART" 2>/dev/null; then + return 0 + fi + if ! renode_is_alive; then + echo "Renode exited before UART became ready" + show_renode_log + return 1 + fi + sleep 1 + waited=$((waited + 1)) + done + + echo "Timed out waiting for Renode UART readiness: $RENODE_UART" + show_renode_log + return 1 +} + +run_expect_version() { + local expected="$1" + local ret + + ret=$(timeout "$EXPVER_TIMEOUT" "$EXPVER" "$RENODE_UART") + if [ "$ret" = "$expected" ]; then + return 0 + fi + + echo "Unexpected version from UART: got ${ret}, expected ${expected}" + return 1 +} -rm -f $RENODE_UART +rm -f $RENODE_UART $RENODE_LOG make keysclean make keytools @@ -31,13 +106,15 @@ cp wolfboot.elf /tmp/renode-wolfboot.elf || exit 3 cp test-app/image_v1_signed.bin /tmp/renode-test-v1.bin || exit 3 cp test-app/renode-test-update.bin /tmp || exit 3 echo "Launching Renode" -renode $RENODE_OPTIONS $RENODE_CONFIG >/dev/null & -while ! (test -e $RENODE_UART); do sleep .1; done +renode $RENODE_OPTIONS $RENODE_CONFIG >"$RENODE_LOG" 2>&1 & +RENODE_BG_PID=$! +wait_for_uart_node || { quit_renode; exit 1; } echo "Renode up: uart port activated" +wait_for_uart_ready || { quit_renode; exit 1; } +sleep 1 echo "Renode running: renode has been started." -RET=$($EXPVER $RENODE_UART) -if (test $RET -eq 1); then +if run_expect_version 1; then echo "Factory img: OK" else echo "FAILURE" @@ -45,8 +122,7 @@ else exit 1 fi -RET=$($EXPVER $RENODE_UART) -if (test $RET -eq 2); then +if run_expect_version 2; then echo "Update: OK" else echo "FAILURE" diff --git a/tools/test-expect-version/test-expect-version.c b/tools/test-expect-version/test-expect-version.c index effc8e89a2..8c45c21f10 100644 --- a/tools/test-expect-version/test-expect-version.c +++ b/tools/test-expect-version/test-expect-version.c @@ -41,8 +41,7 @@ #include #ifndef __MACH__ -#include -#include +#include typedef void (*sighandler_t)(int); sighandler_t sigset(int sig, sighandler_t disp); #endif