diff options
| author | Frédéric Desbiens <[email protected]> | 2026-08-14 11:07:06 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-08-14 11:07:06 -0400 |
| commit | 5a7f4f8f7c9a5d8f193bd2c67d883b0b56930957 (patch) | |
| tree | a9458d81e49ab3827854313f213ad757ade03eaa /common_modules/module_lib/src/txm_timer_create.c | |
| parent | 559460bed92d4d5368cd72cbb53fce18ff59748f (diff) | |
Verified nested IRQ handling on S32Z280 silicon (#612)
#611 exercised the nesting routines on the FVP and established what breaks them:
the interrupt must be acknowledged before nesting starts, or the still-pending
level-asserted timer is retaken the moment IRQ is enabled and recurses until the
stacks are gone. entry.S here carries the same ordering for the same reason, and
irq_dispatch.c splits the same way, board_irq_service taking an
already-acknowledged INTID while board_irq_handler keeps its old shape as the
non-nesting entry point.
What the model could not answer is whether a real GIC-600 agrees, and two things
could have differed.
The first is the number of implemented priority bits. Equal priorities do not
preempt and it is the low bits that vanish, so if the timer and the SGI collapse
to one value after truncation then nesting cannot happen at all -- and the test
would fail without saying why. gicv3_priority_bits discovers the count by writing
0xFF to a priority byte and reading back which bits stick, board_init records the
two effective values, and check P1 requires the SGI to still outrank the timer.
This silicon keeps five bits, the same as the FVP, so 0xA0 and 0x50 stay distinct;
that is now measured and reported rather than assumed.
The second is whether an SGI raised on real hardware is delivered at all. ICC_SGI1R
is a 64-bit AArch32 CP15 register whose encoding does not transcribe from the
AArch64 alias, so check N1 raises one from thread context and requires delivery
before nesting is involved. It arrives.
Verified on S32Z280 silicon:
priority bits = 0x00000005
timer effective = 0x000000A0 sgi effective = 0x00000050
P1 SGI outranks timer after truncation PASS
N1 SGI delivered and dispatched PASS
max depth = 0x00000002 nested SGIs = 0x00000032 depth now = 0x00000000
N2 SGI nested inside another handler PASS
N3 nesting unwound to depth zero PASS
N4 tick still advancing after nesting PASS
N5 lower-priority thread still scheduled PASS
N6 no spurious or unexpected interrupts PASS
Fifty nested SGIs across fifty ticks, one per tick, and depth never exceeded two.
No regression, checked in both configurations on the board. In the nesting build
the ThreadX demo still reports 100 ticks with 20 preemptions and the boot image
still passes its cache and protection checks. In the default build the image links
no nesting symbols at all and the demo is unchanged. Both toolchains compile every
file, GNU with no warnings and Arm Toolchain for Embedded 22.1.0 as well.
Assisted-by: Claude Code (Opus 5) <[email protected]>
Diffstat (limited to 'common_modules/module_lib/src/txm_timer_create.c')
0 files changed, 0 insertions, 0 deletions
