Added a workflow that runs the Cortex-R52 images on the Armv8-R AEM FVP - #688
Open
fdesbiens wants to merge 1 commit into
Open
Added a workflow that runs the Cortex-R52 images on the Armv8-R AEM FVP#688fdesbiens wants to merge 1 commit into
fdesbiens wants to merge 1 commit into
Conversation
Nothing in CI executed a single instruction of any ThreadX port. gcc_check compiles and links -- its own header says it "executes nothing" -- and its CMake stage covers one R52 configuration, the base FVP example. A change that assembles cleanly, links cleanly and then hangs on the first context switch passed every required check. This workflow builds both supported configurations and runs them on the Armv8-R AEM FVP, asserting each image's self-reported result. The feature configuration matters as much as the default one: VFP with the hard float ABI, FIQ, IRQ nesting and FIQ nesting gate whole assembly blocks that the default configuration never assembles, and it builds eight images where the default builds five. Arm distributes the model free of charge but behind a click-through licence with no stable unauthenticated URL -- the developer.arm.com permalink forms all 404 for it -- so the download location is a repository variable rather than a literal. When it is unset the build lanes still run and still gate the pull request; only execution is skipped, and it says so in the log and in the job summary rather than passing quietly. The image list is read from the generated ninja graph rather than kept in the workflow. The images are EXCLUDE_FROM_ALL, so a bare build reports "no work to do", and reading the graph means a target added to CMakeLists.txt cannot escape the check by nobody remembering to list it here. The module manager port and the S32Z280 targets are not on dev yet. Their lanes belong in this workflow when they land, not in a second one. Assisted-by: Claude Code (Opus 5) <noreply@anthropic.com>
fdesbiens
force-pushed
the
feature/r52-fvp-ci
branch
from
September 1, 2026 20:00
fcf4add to
2009893
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Nothing in CI executes a single instruction of any ThreadX port.
gcc_checkcompiles and links — its own header says it "executes nothing" — and itsCMake stage configures exactly one Cortex-R52 combination, the base FVP example with
-DTX_R52_ENABLE_MPU=ON. So a change that assembles cleanly, links cleanly and thenhangs on the first context switch passes every required check today.
This adds a workflow that builds both supported R52 configurations and runs them on the
Armv8-R AEM FVP, asserting each image's self-reported result. A missing result line is a
failure, never a pass, so a silent hang cannot masquerade as green.
The gap is wider than "nothing is executed"
gcc_check's CMake stage builds five images. The feature configuration builds eight:TX_R52_ENABLE_VFP+TX_R52_FLOAT_ABI=hard,TX_R52_ENABLE_FIQ,TX_R52_ENABLE_IRQ_NESTING,TX_R52_ENABLE_FIQ_NESTINGdemo_m5,demo_fiqanddemo_nestingare built nowhere in CI todayThose four options gate whole assembly blocks — the
VMRS/VSTMDB/VLDMIAsequences, theFIQ context paths, the nesting start/end pairs — that the default configuration never
assembles, let alone runs.
Where the model comes from
Arm distributes the Armv8-R AEM FVP free of charge but behind a click-through licence, and
there is no stable unauthenticated download URL to hard-code: the
developer.arm.com/-/cdn-downloadspermalink forms all return 404 for this model.So the location is a repository variable rather than a literal:
FVP_AEMV8R_URL— a.tgzof the model. Required for the execution lanes.FVP_AEMV8R_SHA256— optional. Set, the download is verified; unset, the run says sorather than pretending it verified anything.
When
FVP_AEMV8R_URLis unset the build lanes still run and still gate the pullrequest — only execution is skipped, and it says so with a
::warning::and a job summaryentry. A silent green there would recreate the exact hole this workflow exists to close, and
contributor pull requests from forks keep working either way.
Details worth reviewing
The image list is read from the generated ninja graph, not kept in the workflow. The
images are
EXCLUDE_FROM_ALL, so a bare build reports "no work to do" and would comparenothing. Reading the graph means a target added to
CMakeLists.txtcannot escape the checkbecause nobody remembered to list it here. Same technique, same reasoning, as
scripts/check_gcc.sh's CMake stage.One job, not one per configuration, following the note in
gcc_check.ymlabout foldingits two toolchains together: the checks list stays short and a cross-configuration
regression appears in one log rather than two.
The toolchain cache path and key match
gcc_check.yml's AArch32 entry exactly, so thetwo workflows share one cache entry instead of each holding its own copy of the same
archive. Change them together or the sharing silently stops.
find_programis overridden rather than patched. The exampleCMakeLists.txtlocatesthe model with
HINTS $ENV{HOME}/FVP_Base_AEMv8R_11.32_19/bin, which is right on adeveloper's machine and meaningless on a runner, so the resolved path is passed as
-DFVP_BASER_AEMV8R=<path>. No CMake file changes.Validation
All three paths were exercised locally against the real model, GNU Arm 14.3.1:
FVP_AEMV8R_URLunset::error::per configuration, both still reported rather than stopping at the first, step exit 1Not covered
The module manager port and the S32Z280 targets are not on
devyet — they are #639. Theirlanes belong in this workflow when they land, not in a second one; the matrix already has
the shape for them. The S32Z280 targets will be build-only in CI regardless, since a hosted
runner has no silicon.