Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
3b07a22
Added the ZoneX repository foundation, build system and EL2 reference
fdesbiens Sep 2, 2026
9a3e3ba
Brought stage 2 to first light on the FVP and on S32Z280 silicon
fdesbiens Sep 2, 2026
709a31b
Replaced WILL_FAIL with an explicit expected verdict in the FVP runner
fdesbiens Sep 2, 2026
ee7b3ae
Added a check for local paths and unreachable references
fdesbiens Sep 2, 2026
ca39876
Added the partition manifest types
fdesbiens Sep 2, 2026
63812ab
Recorded the manifest's type vocabulary and corrected D12
fdesbiens Sep 2, 2026
2721dcd
Added the manifest validator and its host test suite
fdesbiens Sep 2, 2026
82ea6c8
Added the region readback, the switch mask and the layout planner
fdesbiens Sep 2, 2026
589cccd
Proved two partitions deny each other, and measured the switch
fdesbiens Sep 2, 2026
9c6bc39
Recorded the PMU encodings, the mailbox and the switch cost
fdesbiens Sep 2, 2026
1504c7c
Booted a real ThreadX kernel inside a stage-2 partition
fdesbiens Sep 2, 2026
5e59329
Gave a partition a clock, and had its kernel preempted under stage 2
fdesbiens Sep 2, 2026
4697e2b
Put ZoneX's guest support under a warnings-as-errors lane
fdesbiens Sep 2, 2026
35635be
Corrected D24: a partition tick needs FIQ routing, not interrupt inje…
fdesbiens Sep 2, 2026
d2dde14
Caught a pinned ThreadX too old for the option the guest is built with
fdesbiens Sep 2, 2026
1024e6e
Closed three defects a partition switch would have made visible
fdesbiens Sep 3, 2026
f87705f
Gave ZoneX a static major frame, and put it on the coverage floor
fdesbiens Sep 3, 2026
7800223
Ended a partition's window with an interrupt it cannot mask
fdesbiens Sep 3, 2026
1e01c48
Ran two ThreadX partitions under one static frame, on both targets
fdesbiens Sep 3, 2026
72dbb1e
Recorded D25, the switch measurements and the encodings they needed
fdesbiens Sep 3, 2026
f094a71
Taught the reference check to catch a roadmap identifier
fdesbiens Sep 3, 2026
2664f3d
Measured the core clock, and found the figures qualified both ways
fdesbiens Sep 3, 2026
4f886bf
Brought the README up to what the repository actually does
fdesbiens Sep 3, 2026
e5a5bc8
Proved neither partition can reach the other, nor disturb its clock
fdesbiens Sep 3, 2026
6d6fb45
Hardened the fault paths, and took the console off the window boundary
fdesbiens Sep 3, 2026
b9e4cf8
Recorded the hardening pass: the ABI shape, the errata, coverage and …
fdesbiens Sep 3, 2026
795bd5b
Provoked the guards on the vectors that cannot resume, and fixed a name
fdesbiens Sep 3, 2026
c488444
Measured what a printing neighbour costs, and bounded the console spins
fdesbiens Sep 8, 2026
78df114
Removed the references a reader outside this repository cannot check
fdesbiens Sep 8, 2026
a5eebcb
Narrowed the reference check to what a reader of this repository needs
fdesbiens Sep 8, 2026
82acaa4
Brought the README's claim and its numbers up to what was measured
fdesbiens Sep 8, 2026
3cb4ad8
Gave ZoneX the build and hotfix version constants the suite carries
fdesbiens Sep 8, 2026
5403c5f
Moved the memory-type vocabulary out of the port and into the manifest
fdesbiens Sep 8, 2026
5ab2ba1
Moved the region granule in beside the rules that enforce it
fdesbiens Sep 8, 2026
f69952d
Requoted the README from a run of the shipped revision
fdesbiens Sep 8, 2026
b473614
Made CONTRIBUTING.md true about the checks, the floor and the compiler
fdesbiens Sep 9, 2026
dcf5b32
Took the project's resourcing out of the source comments
fdesbiens Sep 9, 2026
7637fda
Fixed the two lanes the first pull request run failed
fdesbiens Sep 9, 2026
53f4b9f
Titled the MISRA blocks by what each of them actually contains
fdesbiens Sep 9, 2026
9097d6f
Added the Phase-0 evidence summary and the MISRA deviation index
fdesbiens Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
###############################################################################
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available under the
# terms of the MIT License which is available at
# https://opensource.org/licenses/MIT.
#
# AI Disclosure: This file was largely AI-generated by Claude Code (Opus 5).
# The AI-generated portions may be considered public domain (CC0-1.0)
# and not subject to the project's licence. The human contributor has
# reviewed and verified that the code is correct.
#
# SPDX-License-Identifier: MIT and CC0-1.0
###############################################################################

.git* export-ignore

# Custom attribute marking sources that follow the project's C code style.
[attr]our-c-style whitespace=tab-in-indent eol=lf

# Line endings. ZoneX is built on Linux and on the Armv8-R AEM FVP; the
# PowerShell entries are here so that a Windows story, should ZoneX ever gain
# one (see docs/decisions.md D13), does not arrive with mixed endings.
*.sh eol=lf
*.py eol=lf
*.ps1 eol=crlf
*.bat eol=crlf

*.c our-c-style
*.h our-c-style
*.S our-c-style

*.cmake whitespace=tab-in-indent
*.txt whitespace=tab-in-indent
*.lds whitespace=tab-in-indent
16 changes: 16 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
###############################################################################
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available under the
# terms of the MIT License which is available at
# https://opensource.org/licenses/MIT.
#
# AI Disclosure: This file was largely AI-generated by Claude Code (Opus 5).
# The AI-generated portions may be considered public domain (CC0-1.0)
# and not subject to the project's licence. The human contributor has
# reviewed and verified that the code is correct.
#
# SPDX-License-Identifier: MIT and CC0-1.0
###############################################################################

@eclipse-threadx/admins
41 changes: 41 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<!--
Copyright (c) 2026 Eclipse ThreadX contributors

This program and the accompanying materials are made available under the
terms of the MIT License which is available at
https://opensource.org/licenses/MIT.

AI Disclosure: This file was largely AI-generated by Claude Code (Opus 5).
The AI-generated portions may be considered public domain (CC0-1.0)
and not subject to the project's licence. The human contributor has
reviewed and verified that the code is correct.

SPDX-License-Identifier: MIT and CC0-1.0
-->

## What this changes, and why

<!-- One paragraph. What was wrong or missing, and what this does about it. -->

## How it was verified

<!-- Name the target and how you ran it: host suite, FVP, S32Z280 silicon.
"It builds" is not verification. If you could not verify part of it, say
which part and why. -->

## Checklist

<!-- Put an `x` in each box that applies. -->

- [ ] Branched from `dev`, and targets `dev`.
- [ ] Commit subject starts with a past-tense verb.
- [ ] AI assistance, if any, is attributed: `Assisted-by:` in the commit and the
AI Disclosure paragraph in every new file header. No `Co-Authored-By:`.
- [ ] New files carry the full Eclipse header with the current year.
- [ ] Regression tests added or updated, or a stated reason why not.
- [ ] Builds clean under the strict warning set (`--preset ci-strict`).
- [ ] No A-profile or RISC-V terminology (`scripts/check_terminology.sh` passes).
- [ ] No local paths, and no comment citing a document that is not in the
repository (`scripts/check_references.sh` passes).
- [ ] API or behaviour changes have a matching documentation pull request
against `rtos-docs-asciidoc`.
102 changes: 102 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
###############################################################################
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available under the
# terms of the MIT License which is available at
# https://opensource.org/licenses/MIT.
#
# AI Disclosure: This file was largely AI-generated by Claude Code (Opus 5).
# The AI-generated portions may be considered public domain (CC0-1.0)
# and not subject to the project's licence. The human contributor has
# reviewed and verified that the code is correct.
#
# SPDX-License-Identifier: MIT and CC0-1.0
###############################################################################

version: 2

# Keeps the pinned action SHAs moving.
#
# Every action reference under .github/workflows is a 40-character commit SHA
# with the version in a trailing comment. A SHA pin *without* this file is
# worse than a floating tag: it freezes CI on whatever was current the day it
# was written. ThreadX discovered that with actions/cache@v1 still sitting in
# a workflow until GitHub began auto-failing every request that used it, and
# with four other actions between two and four majors behind -- none of it
# reported anywhere, because there was no configuration like this one.
#
# Dependabot understands the SHA form and rewrites the trailing version comment
# together with the pin, so the comment cannot drift away from the SHA it
# describes. That is what keeps "which exact code ran in our CI" answerable
# from the repository, which the certification and SBOM work for ZoneX needs on
# its own account.
#
# Two things this does not fix. It reports drift, not silence: a workflow that
# never triggers rots unnoticed no matter what is pinned in it, which is why
# every ZoneX workflow triggers on pull_request against dev and main and on
# push to both. And a new pull_request trigger does not reach a pull request
# that is already open -- only a rebase makes new checks appear on one.
#
# There is no entry for any other ecosystem, and that is a decision rather than
# an oversight: the project forbids external dependencies, there are no
# submodules, and the pinned tools -- gcovr in scripts/install.sh, the Arm GNU
# Toolchain and ATfE versions in the workflows -- live where no Dependabot
# ecosystem can parse them. Those pins move by hand.
updates:
- package-ecosystem: "github-actions"
# "/" is the only accepted value for this ecosystem; it covers
# .github/workflows and .github/actions.
directory: "/"

schedule:
interval: "weekly"
day: "monday"
time: "06:00"
timezone: "Etc/UTC"

# Dependabot reads this file from the repository's DEFAULT branch, which is
# main. But main holds the latest release and pull requests belong on dev,
# which is where the checks gate them. target-branch sends the pull
# requests to dev and makes Dependabot read the workflows it is updating
# from dev as well.
#
# The consequence to plan for: landing this file on dev ARMS it, it does not
# fire it. Nothing happens until a release merge carries it to main.
#
# Setting target-branch also opts out of Dependabot *security* updates,
# which only ever run against the default branch. For this ecosystem the
# cost is small -- an action advisory arrives as an ordinary version bump on
# the weekly run -- but it is a real trade and not a detail to rediscover
# later.
target-branch: "dev"

groups:
# Patch and minor arrive together in one pull request: they are the
# routine traffic, and reviewing them one at a time is how an update
# queue starts being ignored, which is the failure mode this file exists
# to prevent. Majors stay ungrouped, one pull request each, because
# every breaking change ThreadX met in an action set was a major --
# download-artifact v8 defaulting digest-mismatch to error, and
# upload-artifact v6 requiring runner 2.327.1 or newer.
actions-minor-and-patch:
patterns:
- "*"
update-types:
- "minor"
- "patch"

# Three distinct actions are in use today (checkout, cache,
# upload-artifact). Ten leaves room for a wave of majors without becoming
# a silent cap, and matches what ThreadX settled on.
open-pull-requests-limit: 10

labels:
- "dependencies"

# Reviewers are not listed here. .github/CODEOWNERS already routes every
# path to @eclipse-threadx/admins and Dependabot honours it.
#
# Commit subjects are left at Dependabot's own "Bump x from a to b"
# wording. The project asks for a past-tense subject and still gets one:
# these pull requests are squash-merged, and the subject is set at that
# point.
178 changes: 178 additions & 0 deletions .github/workflows/clang_check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
###############################################################################
# Copyright (c) 2026 Eclipse ThreadX contributors
#
# This program and the accompanying materials are made available under the
# terms of the MIT License which is available at
# https://opensource.org/licenses/MIT.
#
# AI Disclosure: This file was largely AI-generated by Claude Code (Opus 5).
# The AI-generated portions may be considered public domain (CC0-1.0)
# and not subject to the project's licence. The human contributor has
# reviewed and verified that the code is correct.
#
# SPDX-License-Identifier: MIT and CC0-1.0
###############################################################################

name: clang_check

# Cross-builds ZoneX for the Cortex-R52 with Arm Toolchain for Embedded, which
# is LLVM based and is the successor to Arm Compiler 6.
#
# Why a second toolchain on a repository this small: GNU as accepts several
# non-canonical assembly forms that LLVM's assembler rejects, and ZoneX will be
# substantially assembly by the time that starts to bite. Catching each one as
# it is written costs a minute; finding forty of them the first time somebody
# tries an LLVM build costs a week, which is what ThreadX's ports did before
# clang_check existed there.
#
# It compiles and links and executes nothing.

on:
push:
branches: [ dev, main ]
paths:
- ".github/workflows/clang_check.yml"
- "CMakeLists.txt"
- "CMakePresets.json"
- "cmake/**"
- "common/**"
- "core/**"
- "platform/**"
- "examples/**"
pull_request:
branches: [ dev, main ]
# Duplicated deliberately; see the note in host_tests.yml. **Edit both.**
paths:
- ".github/workflows/clang_check.yml"
- "CMakeLists.txt"
- "CMakePresets.json"
- "cmake/**"
- "common/**"
- "core/**"
- "platform/**"
- "examples/**"

jobs:
atfe:
runs-on: ubuntu-24.04

env:
# Pinned deliberately, as the runner image is. 22.1.0 is the version
# CONTRIBUTING.md names as the reference.
# Releases: https://github.com/arm/arm-toolchain/releases
ATFE_VERSION: 22.1.0

steps:
- name: Check out the repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

# THE GUEST IMAGES NEED A THREADX CHECKOUT, and without one the example
# CMakeLists SKIPS them -- with a message, which is right for a
# contributor who has no kernel sources to hand and wrong here. Skipped,
# the ZoneX code that is compiled into a ThreadX image never faced this
# workflow at all: the guest support and both partition images are
# thousands of lines that no warnings-as-errors lane was looking at.
#
# Pinned to the same commit zx_fvp.yml pins, and for the same reason: an
# unpinned guest means this workflow's results change when a different
# repository does. Change the two together.
- name: Check out ThreadX, for the guest images
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: eclipse-threadx/threadx
ref: 13c8c768c73b9ce10c9605f6df8b02080440f953
path: threadx

- name: Cache Arm Toolchain for Embedded
id: cache-atfe
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: atfe
key: atfe-${{ env.ATFE_VERSION }}-linux-x86_64

# Arm publishes a plain .sha256 for this one, unlike the GNU toolchain
# whose .sha256 is an MD5. See the note in gcc_check.yml before assuming
# the two are interchangeable.
- name: Install Arm Toolchain for Embedded
if: steps.cache-atfe.outputs.cache-hit != 'true'
run: |
set -eu
base="https://github.com/arm/arm-toolchain/releases/download/release-${ATFE_VERSION}-ATfE"
archive="ATfE-${ATFE_VERSION}-Linux-x86_64.tar.xz"
mkdir -p atfe && cd atfe
curl -fsSLO "$base/$archive"
curl -fsSLO "$base/$archive.sha256"
sha256sum -c "$archive.sha256"
tar xf "$archive"
rm -f "$archive"

- name: Ensure ninja is available
run: |
set -eu
if command -v ninja >/dev/null 2>&1; then
ninja --version
else
sudo apt-get update
sudo apt-get install -y --no-install-recommends ninja-build
fi

- name: Build every Cortex-R52 configuration with clang
run: |
set -eu
atfe="$GITHUB_WORKSPACE/atfe/ATfE-${ATFE_VERSION}-Linux-x86_64/bin"
"$atfe/clang" --version | head -1

status=0

build_configuration() {
name="$1"; shift
echo ""
echo "=============================================================="
echo "== $name"
echo "=============================================================="
if ! cmake -S . -B "build/clang-$name" -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=cmake/cortex_r52_clang.cmake \
-DZX_ATFE_TOOLCHAIN_PATH="$atfe" \
-DZX_THREADX_SOURCE_DIR="$GITHUB_WORKSPACE/threadx" \
-DCMAKE_COMPILE_WARNING_AS_ERROR=ON "$@"; then
echo "::error::$name: CMake configure failed"
status=1
return
fi
if ! cmake --build "build/clang-$name"; then
echo "::error::$name: build failed"
status=1
return
fi

# The IMAGES as well. They are EXCLUDE_FROM_ALL, as ThreadX's are,
# so the build above reports "no work to do" for every one of them
# and a compile error in an image would slip past this whole lane.
#
# Named from the generated ninja graph rather than from a list kept
# here, so an image added to a CMakeLists.txt cannot escape the
# check by nobody remembering to list it.
local images
images="$(ninja -C "build/clang-$name" -t targets all 2>/dev/null \
| grep -oE '^[A-Za-z0-9_]+\.elf' \
| grep -v '^cmake_' | sort -u || true)"
if [ -z "$images" ]; then
echo "::error::$name: the CMake graph produced no images at all"
status=1
return
fi
echo "$name: building $(echo "$images" | wc -l) image(s)"
# shellcheck disable=SC2086
if ! cmake --build "build/clang-$name" --target $images; then
echo "::error::$name: an image failed to build"
status=1
fi
}

build_configuration fvp \
-DZX_BUILD_FVP_EXAMPLE=ON -DZX_BUILD_S32Z280_EXAMPLE=OFF

build_configuration s32z280 \
-DZX_BUILD_FVP_EXAMPLE=OFF -DZX_BUILD_S32Z280_EXAMPLE=ON

exit $status
Loading
Loading