ASAravind Sivakumaran
Theme

Theme and appearance

Appearance
Palette

Pick any colour. The displayed accent adjusts for readable contrast in light or dark mode.

← IOMMU star map

IOMMU / REQUEST IDENTITY

What did the device actually send?

Separate client intent from observed DMA, translation faults and interrupt delivery. Explore 112 test recipes across AMD IOMMU, Arm SMMUv3 and PCIe.

What claims does this page make? 3 points

CONTROLLED EVIDENCE EXERCISE

Enabled does not mean sent

Enter observed header facts. This is a classifier for an AMD V=1 / TV=1 profile, not a packet capture or a DMA execution. “Guest translation active” means the support, global and DTE gates are satisfied.

Applied input and classification JSON

        

Sources: AMD 48882 3.11 Table 7, Tables 44/50/51, §2.2.9. Multiple findings are listed without claiming a first-error priority. Open the IRTE and architecture workbench.

EXECUTABLE REQUEST GEOMETRY

One descriptor, several requests

A page-aligned frame does not require a page-aligned DMA byte address. This planner separates the descriptor extent, PCIe 4 KiB boundaries, DW byte enables and MPS/MRRS. It does not access memory.

Applied request plan · DW byte enables are hexadecimal
Request / first byte Enabled / DW bytes First / Last BE Length field Data preview

Contiguous ordinary Memory Reads/Writes only. No raw TLP codec, sparse byte enables, Completion splitting or bus timing. MPS/MRRS are chosen teaching inputs, not detected capabilities. Intel PCIe guidance; AMD PG054 checks.

Separate the request, the translation and the evidence

A client can advertise PASID support and enable it without sending a PASID on a particular request. First establish what the client actually issued, then evaluate how that request is handled by the selected IOMMU configuration. A fault is useful evidence, but it is not a packet capture.

For each run, keep four records: the intended workload, the observed request, the translation/configuration state, and the result. Include RequesterID or StreamID, PASID/SubstreamID presence separately from its numeric value, address type, Read/Write, byte range, and relevant privilege attributes. Keep an explicit unknown value when capture evidence is missing. A reported zero is not sufficient to distinguish “no PASID” from “PASID 0.”

The PASID trap: three different outcomes

In the selected AMD profile, V=1 and TV=1. Untagged ordinary DMA normally follows host translation. With supported and meaningful GIoV plus active guest translation, the IOMMU supplies effective PASID 0 instead. Explicit tagged traffic uses the observed PASID. Section 2.2.9 requires nonzero explicit PASIDs when mixing that traffic with Guest I/O Protection. Untagged MSI in the 0xFEEx_xxxx range remains an interrupt-remapping request. These distinctions come from 48882 3.11, Table 7 and §2.2.9, not an assumption that every enabled client sends tagged DMA.

Use disjoint owned mappings to distinguish contexts: put a different sentinel in PASID 0 and the expected explicit context. Run a positive control, then the deliberate mismatch. A wrong but valid PASID can succeed; an error-only oracle misses that failure. This is a test-design recipe, not permission to access another process’s memory.

Structures with similar purposes are not interchangeable

Question AMD 48882 3.11 Arm SMMUv3 H.a
Which requester? DeviceID selects DTE; DomainID identifies host translation context StreamID selects STE; SubstreamID can select a CD
Which address spaces? Guest GCR3/page tables and host I/O page tables Stage 1 VA→IPA and Stage 2 IPA→PA
Which maintenance? DTE, IOMMU page, endpoint ATC (AMD: remote IOTLB) and interrupt-table invalidations CFGI for configuration; TLBI for translations; ATC invalidation for endpoints
How is work completed? Completion mechanisms and command-specific ordering Command-specific consumption guarantees; CMD_SYNC for prior work on its queue
How is a fault resumed? PRI/PPR request and response flow when applicable On-chip Stall uses StreamID/STAG with CMD_RESUME; PCIe PRI uses a different response protocol
Which interrupt machinery? IRTE, x2APIC formats, guest virtual APIC state and GA log SMMUv3 is not an AMD interrupt remapper; GIC/ITS translation is a separate architecture

Arm material is pinned to IHI 0070 H.a, 6 March 2026. Its document revision does not imply every optional SMMUv3.5 capability is implemented. The executable backend is a non-secure 4 KiB-granule teaching profile; it is not an implementation of all descriptor formats, security states or GIC/ITS.

Design a negative test that identifies the layer

  1. Prove submission. Bus mastering, the client descriptor and readiness must permit a request to be issued. A client-side rejection is not proof of IOMMU enforcement.
  2. Prove identity and routing. Check the observed requester, PASID presence, AT and target path. A peer path or alias can invalidate the intended isolation test.
  3. Establish a positive control. Show that the same owned fixture works with the intended permissions and configuration.
  4. Inject one condition. Change presence, permission, identity, descriptor encoding, queue state or interrupt control independently first.
  5. Inspect independent observations. Capture bytes changed, returned data, response attributes, event records, status bits and notification delivery separately.
  6. Recover causally. Preserve evidence; repair the backing state; publish and invalidate the appropriate caches; observe completion; then issue a new request or use the correct resume protocol.

Repeat the core matrix over Read/Write, tagged/untagged, ordinary/ATS/pretranslated, cold/warm caches, enabled/suppressed reporting, and first/last bytes around a page boundary. Test the Cartesian product selectively according to feature prerequisites: a large number of combinations is not evidence of normative coverage. Keep unsupported, ignored and required-zero fields distinct.

Alignment has three meanings

A translation frame must satisfy its page/block format. A byte address inside that frame may have a nonzero offset. A PCIe Memory Request has its own 4 KiB boundary and DW/byte-enable rules, independent of whether the IOMMU uses a 4 KiB page or a 2 MiB/1 GiB mapping. A descriptor spanning a boundary can be legal when the client splits it into valid requests. The packet planner illustrates contiguous Memory Reads/Writes only; it does not model sparse byte enables, AtomicOps or Completion splitting.

Errors are not always one event per request

AMD Table 44 distinguishes ordinary untranslated accesses from ATS Translation Requests: a translation failure can produce a response with no permissions without the ordinary DMA event. SA/SE controls and available log space also affect observability. Tables 43–55 and the relevant event layout determine the oracle; “any reserved bit gives ILLEGAL_DEV_TABLE_ENTRY” is incorrect.

Arm configuration errors, translation faults and external-abort/global-error paths are separate. For multiple faults, consult H.a §7.3.23 instead of inventing a universal first-error order. Event merging and asynchronous visibility can also defeat a naïve one-request/one-record assertion. The page’s recipes state expected families or permitted outcomes, not guaranteed notification timing.

Queue and recovery traps worth keeping in every plan

Condition What to assert
AMD command buffer full Software prevents overwriting unread commands. Do not invent CmdBufOverflow.
AMD log overflow Preserve unread records and use the particular log’s stop/disable/clear/restart procedure. Dual banks share an engine.
Arm EVTQ loses a terminated event Overflow marks diagnostic loss. After space is freed, new records can arrive even before overflow acknowledgement.
Arm EVTQ cannot record a stalled fault Retain the transaction; it does not cause overflow merely by waiting. Retry when the queue becomes writable; the result can change.
Arm PRIQ overflows New entries are inhibited while overflow is active. Last=1 requests have auto-response behaviour; Last=0 and Stop Marker require different handling.
Arm CMDQ errors Preserve the command and consumer position. Correct the cause and use matching GERROR/GERRORN semantics; this is not AMD W1C.

Sources: AMD §§2.4–2.7; Arm §§3.5, 3.12.2, 4.1.3–4, 7.4–7.5 and 8.1. The basic Arm model uses a software admission guard for PRIQ-full; the full automatic PRIQ overflow response matrix remains a reference recipe, not an executed feature.

Interrupt negatives need their own evidence

Record interrupt address/data, requester identity, the selected DTE interrupt controls, calculated IRTE index, format and cached/backing state. Test the last valid index and first invalid index, RemapEn=0, applicable reserved fields and interrupt type, table-fetch failure, and capability/enable gates for 128-bit formats. Then test retargeting with the applicable interrupt-table invalidation. Data-TLB invalidation is not a substitute.

An interrupt with a PASID is an AMD Table 44 interrupt-context fault. A Read or non-posted Write to interrupt space instead uses the Table 50 prohibited-access rules. When Guest I/O Protection is enabled, an untagged MSI must still reach the interrupt path. For GA, distinguish a lost log entry from a pending interrupt in the virtual APIC backing page; log consumption is not guest EOI. The raw-records workbench has the packed IRTE exercises.

PCIe scope and outstanding specification work

The AMD and Arm specifications were read directly; the PCIe Base Specification was not. PCIe information here is limited to cited public PCI-SIG FAQs and primary implementation documentation (AMD PG054 and Intel’s 710 Series datasheet). These sources are useful cross-checks, not a claim of compliance with a newer Base revision.

No finite teaching catalogue covers every edge case. The status and source beside each recipe explain what is demonstrated and what remains to be verified.

Negative-test catalogue

Recipes describe an injection, an observation and a recovery. “Related semantic lab” means selected behaviour is demonstrated; it does not mean the complete recipe was executed. AMD cards marked “Also in Faults & recovery” repeat the Faults & recovery checklist.

112 scenarios

Reserved DTE bitAMD · DTE · Also in Faults & recovery
Inject / compare
Set a known reserved bit with its validity conditions active.
Observe
ILLEGAL_DEV_TABLE_ENTRY; ordinary translation must not copy bytes.
Recover
Restore the field, publish, invalidate cached DTE state and synchronize.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.2 / Table 43
Scope
Executable: DTE bit 2. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Reserved IoCtl / IntCtlAMD · DTE · Also in Faults & recovery
Inject / compare
IoCtl=11b, or a reserved interrupt-control encoding under its valid controls.
Observe
ILLEGAL_DEV_TABLE_ENTRY; classify by the active field, not simply by where the word is stored.
Recover
Repair the field and invalidate the relevant configuration cache.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7 / Table 43
Scope
IoCtl executable; IntCtl reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Reserved IntTabLenAMD · DTE · Also in Faults & recovery
Inject / compare
Use 11xxb with applicable interrupt controls active.
Observe
Illegal DTE encoding, distinct from an IRTE index beyond a valid table.
Recover
Restore a supported length and validate the actual allocation.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7 / Table 43
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Reserved paging ModeAMD · DTE · Also in Faults & recovery
Inject / compare
Mode=111b with V=1 and TV=1.
Observe
IO_PAGE_FAULT under Table 44; do not classify every reserved DTE encoding as ILLEGAL_DEV_TABLE_ENTRY.
Recover
Use a supported mode/root and invalidate cached context.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.3 / Table 44
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
V=0 and TV=0 are differentAMD · DTE · Also in Faults & recovery
Inject / compare
Compare an ordinary untranslated request with ATS, then TV=0 when a walk is required.
Observe
V=0 can bypass ordinary DMA; ATS with V=0 is invalid. TV=0 can fault a required untranslated walk.
Recover
Verify request type before choosing an expected event.
Source
AMD 48882-PUB 3.11, April 2026 · §2.1 / Tables 44, 51
Scope
Executable controls. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
DeviceID beyond table sizeAMD · DTE · Also in Faults & recovery
Inject / compare
Request a device entry outside the programmed table extent.
Observe
IO_PAGE_FAULT with response depending on memory, ATS or command context.
Recover
Validate device ownership, table size and segmentation; do not mask DeviceID into another device.
Source
AMD 48882-PUB 3.11, April 2026 · Table 44
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Host PR=0 / guest P=0AMD · Translation · Also in Faults & recovery
Inject / compare
Clear presence on the data leaf.
Observe
No bytes from the rejected segment. AT=00 may log IO_PAGE_FAULT; ATS returns insufficient permission without that ordinary DMA event.
Recover
Restore only owned backing, publish, invalidate and observe completion before retry.
Source
AMD 48882-PUB 3.11, April 2026 · Tables 16, 44 / §2.2.7
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
PR=0 with other bits setAMD · Translation · Also in Faults & recovery
Inject / compare
Set a reserved field in the same absent host entry.
Observe
Presence determines that this is not a valid page descriptor; do not blindly validate it as PR=1.
Recover
Test the absent and present forms separately to isolate the reserved-bit check.
Source
AMD 48882-PUB 3.11, April 2026 · Tables 16–18
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Read / write permission matrixAMD · Translation · Also in Faults & recovery
Inject / compare
Toggle guest R/W, host IR/IW and DTE IR/IW independently.
Observe
Read succeeds on a write-protected mapping; denied access copies no bytes. Effective permission includes the traversed parents.
Recover
Restore only intended permissions; do not let PRI upgrade an unrelated restriction.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.7 / Table 44
Scope
Executable leaf/DTE cases; parent tests in suite. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Present PTE reserved bitAMD · Translation · Also in Faults & recovery
Inject / compare
Set host leaf bit 52 in the v1 fixture, or bit 13 in a 2 MiB guest leaf.
Observe
IO_PAGE_FAULT; unlike a hardware table-read failure.
Recover
Repair the exact format/size-dependent field and invalidate.
Source
AMD 48882-PUB 3.11, April 2026 · Table 44 / guest leaf formats
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Invalid NextLevel / skipped address bitsAMD · Translation · Also in Faults & recovery
Inject / compare
Use a non-descending next level, exceed capability, or set address bits for a skipped level.
Observe
IO_PAGE_FAULT; a skipped level does not accept any index.
Recover
Fix the walk structure and supported depth.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.3 / Table 44
Scope
NextLevel executable; skip checks in DMA lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Invalid leaf size / frame alignmentAMD · Translation · Also in Faults & recovery
Inject / compare
Use a leaf size inconsistent with its level or a nonaligned frame.
Observe
Fault for an invalid descriptor; normal byte offsets remain legal.
Recover
Align the frame for its leaf and verify the full mapped extent.
Source
AMD 48882-PUB 3.11, April 2026 · Table 44
Scope
Alignment controls and model tests. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Address width / canonicalityAMD · Translation · Also in Faults & recovery
Inject / compare
Set bits above the selected host-root width or use a noncanonical guest address.
Observe
IO_PAGE_FAULT for the applicable walk.
Recover
Correct the request/configuration; never truncate it into another mapping.
Source
AMD 48882-PUB 3.11, April 2026 · Table 44 / §2.2.6
Scope
Guest canonicality executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
PASID / GCR3 limitsAMD · Translation · Also in Faults & recovery
Inject / compare
Use invalid GCR3 V, an unmapped PASID, or exceed the architectural PASmax limit.
Observe
Missing/invalid guest lookup can fault. The UI GLX-capacity guard is a separate software rejection, not an emulated PASmax event.
Recover
Validate capability and allocation independently; prevent context aliases.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.6 / Table 44
Scope
GCR3 executable; PASmax reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Nested metadata failureAMD · Translation · Also in Faults & recovery
Inject / compare
Remove a host mapping for a guest page-table page.
Observe
Table-fetch translation fails before data DMA; retain stage and fetch address evidence.
Recover
Repair the metadata mapping and its cache state, not just the final payload page.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.6.8
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Execute / privilege denialAMD · Translation · Also in Faults & recovery
Inject / compare
Issue an instruction fetch through NX or a user request against supervisor-only mappings with applicable features active.
Observe
Protection failure; request attributes and enabled capabilities affect the diagnosis.
Recover
Validate Exe/PMR, guest protection controls and every relevant permission.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.6.1–2 / Table 44
Scope
Reference; not a full execute/privilege emulator. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
SA / SE suppressionAMD · Reporting · Also in Faults & recovery
Inject / compare
Set SA for memory page faults or exercise SE suppression of repeated failures.
Observe
Access can fail without a new event. SA does not suppress interrupt/command faults. Absence of a record is not evidence of success.
Recover
Check suppression and log enable/overflow before judging the test outcome.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7 / §2.5
Scope
SA executable; SE reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Device-table backing failureAMD · Hardware · Also in Faults & recovery
Inject / compare
Inject abort, poison or another specified hardware failure on a DTE fetch.
Observe
DEV_TAB_HARDWARE_ERROR, not an illegal DTE-format error.
Recover
Preserve hardware evidence and repair backing/accessibility before retry.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.4 / Table 45
Scope
Synthetic injection. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Page-table backing / A-D update failureAMD · Hardware · Also in Faults & recovery
Inject / compare
Inject a hardware failure during a page-table access or applicable atomic A/D update.
Observe
PAGE_TAB_HARDWARE_ERROR; an inaccessible table is different from a readable PR=0 entry.
Recover
Repair memory/lifetime/coherency and inspect affected access type.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.5 / Table 46
Scope
Synthetic fetch injection; A/D reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Unknown opcode / reserved bitAMD · Command · Also in Faults & recovery
Inject / compare
Queue opcode 0, or set a reserved bit of an ordinary command.
Observe
ILLEGAL_COMMAND_ERROR halts command processing. Other IOMMU activity is not automatically halted.
Recover
Observe CmdBufRun=0, disable, repair command/backing/pointers, then enable.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4 / §2.5.6
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Unsupported optional commandAMD · Command · Also in Faults & recovery
Inject / compare
Disable IotlbSup, PreFSup, PPR support/enables, IASup or vIOMMU capability/enables, then issue the affected command.
Observe
Illegal command for the unsupported/disabled operation; avoid pretending optional commands always exist.
Recover
Use capability-driven command selection or restore the required configuration.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4 / Table 48
Scope
Executable capability switches. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Command-fetch backing failureAMD · Command · Also in Faults & recovery
Inject / compare
Inject command read abort/poison.
Observe
COMMAND_HARDWARE_ERROR halts command processing.
Recover
Use the event’s command address; hardware Head may already have advanced due to prefetch. Repair while stopped.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4 / §2.5.7
Scope
Synthetic injection. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Peripheral invalidation timeoutAMD · Command · Also in Faults & recovery
Inject / compare
Withhold a device invalidation response.
Observe
IOTLB_INV_TIMEOUT; completion/page reuse remains unsafe. Do not infer the two command-halt errors or invent an acknowledgment.
Recover
Keep affected DMA blocked and follow device/platform recovery policy.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.8 / §2.4.11
Scope
Executable outstanding-response fixture. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run CACHE-ATS-01
Completion before required invalidationAMD · Command · Also in Faults & recovery
Inject / compare
Queue a wait while omitting a required IOMMU or device invalidation.
Observe
The wait may complete correctly while the software reuse protocol remains wrong.
Recover
Test cache state and observed completion, not only Head=Tail.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4.1 / §2.4.11
Scope
Existing command-sequence lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run CACHE-DMA-02
Incoming PRI disabledAMD · PRI · Also in Faults & recovery
Inject / compare
Send PRI while required global/per-device PRI support or enable is absent.
Observe
INVALID_PPR_REQUEST, RX=0 for the specified conditions; not a successful PPR entry.
Recover
Check device capabilities, global enables, DTE.PPR and the original request.
Source
AMD 48882-PUB 3.11, April 2026 · Table 52 / §2.5.10
Scope
PPRLogEn=0 executable; other gates reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Invalid PPR response contextAMD · PRI · Also in Faults & recovery
Inject / compare
Issue COMPLETE_PPR_REQUEST GN=1 without guest translation, or issue it with PPR globally disabled.
Observe
GN/context case: INVALID_PPR_REQUEST, RX=1. Disabled PPR command: illegal command / halt.
Recover
Repair response context and enable state; do not confuse RX=0 and RX=1.
Source
AMD 48882-PUB 3.11, April 2026 · Table 52 / §2.5.10
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Wrong CompletionTag / groupAMD · PRI · Also in Faults & recovery
Inject / compare
Use a tag that does not match the software work item.
Observe
Software protocol failure; §2.4.7 states that the IOMMU does not validate CompletionTag contents. Do not assert an automatic INVALID_PPR_REQUEST.
Recover
Match original DeviceID, applicable PASID and group before submission.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4.7
Scope
Reference; existing mock work-item guard. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Bad IRTE or interrupt requestAMD · Interrupt · Also in Faults & recovery
Inject / compare
Out-of-range index, reserved IRTE fields/type, RemapEn=0, or disallowed interrupt attributes/PASID.
Observe
IO_PAGE_FAULT in the interrupt-remapping context; its flags differ from a memory fault.
Recover
Repair the correct interrupt entry/policy and invalidate its cache; memory PTE repair is unrelated.
Source
AMD 48882-PUB 3.11, April 2026 · Tables 19–22, 44
Scope
Index/enable in main lab; other formats reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Prohibited memory / ATS requestAMD · Request · Also in Faults & recovery
Inject / compare
Pretranslated request with I=0 or V=0; forbidden port-I/O, interrupt-space or system-management access; malformed request controls.
Observe
INVALID_DEVICE_REQUEST for the listed context, with the specified target/master abort response.
Recover
Validate request class, device controls and address-space policy.
Source
AMD 48882-PUB 3.11, April 2026 · Tables 50–51, 64
Scope
V=0 and I=0 ATS executable; wider matrix reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Command producer catches unread HeadAMD · Buffers · Also in Faults & recovery
Inject / compare
Try to publish more commands than free slots.
Observe
Software must prevent overwrite. AMD has no CmdBufOverflow W1C status bit.
Recover
Wait for free space or apply software backpressure; do not fabricate a hardware overflow event.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4
Scope
Executable queue-full guard. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Event / PPR / GA overflowAMD · Buffers · Also in Faults & recovery
Inject / compare
Fill all usable slots, then attempt one more hardware-produced record.
Observe
Incoming record is lost; unread records remain. Family-specific overflow status prevents further logging until recovery.
Recover
Preserve/drain, observe Run=0, disable, repair allocation/pointers, clear overflow W1C, enable.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.1 / §2.6.2 / §2.7.4
Scope
Executable A/B-selected and GA fixtures. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Head passes Tail / wrong pointer ownerAMD · Buffers · Also in Faults & recovery
Inject / compare
Software consumes beyond available log records, writes hardware-owned Tail, or writes command Head while running.
Observe
Software misuse; numeric pointer order alone is not an architectural error detector. Some invalid register operations are undefined.
Recover
Use modular occupancy plus ownership; reject the unsafe software operation before writing MMIO.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4–2.7 / pointer register definitions
Scope
Executable guard; no invented hardware fault. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Normal wrap / empty / fullAMD · Buffers · Also in Faults & recovery
Inject / compare
Wrap Head and Tail through zero while preserving occupancy.
Observe
Head may numerically exceed Tail and still be valid. Equal Head/Tail means empty in the selected AMD convention.
Recover
Test entry-byte alignment, one reserved slot, FIFO order and bounds.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4–2.7
Scope
Executable wrap preset. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Restart ordering / W1C independenceAMD · Buffers · Also in Faults & recovery
Inject / compare
Try enable before repair, modify while Run=1, or acknowledge notification without fixing the cause.
Observe
Notification clear, pointer consume, repair and restart are separate transitions.
Recover
Assert the actual stop, disable, repair, W1C and enable sequence; retry DMA separately.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4 / §2.5.1 / §2.6.2 / §2.7.4
Scope
Executable. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Disabled / inaccessible event reportingAMD · Buffers · Also in Faults & recovery
Inject / compare
Disable logging, fill it, or inject failure on the log’s backing writes.
Observe
The original failure can occur without a durable event-log entry. Hardware event registers may preserve specified failures.
Recover
Check log state and hardware event registers; preserve the first available evidence.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.16.2
Scope
Disabled/overflow executable; write-abort registers reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Dual log / early overflow / auto-responseAMD · Buffers · Also in Faults & recovery
Inject / compare
Exercise active-bank selection, capability-gated autoswap, early thresholds and PPR auto-response/Stop markers.
Observe
Behaviour depends on supported features and chosen enable mode; do not treat the two banks as independent engines.
Recover
Test per-bank overflow, active-bank status and work-item loss/response handling.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.17 / §2.6.1 / §2.6.4
Scope
Selected-bank fixtures; autoswap/auto-response reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Lost GA notification with pending vectorAMD · GA · Also in Faults & recovery
Inject / compare
Overflow GA while an interrupt targets a non-running guest.
Observe
GA record can be lost while the guest APIC backing page still retains the pending interrupt. GALOverflow alone does not generate a fresh GA interrupt.
Recover
Reconcile backing state; draining the GA log is not guest ISR/EOI.
Source
AMD 48882-PUB 3.11, April 2026 · §2.7 / Status bit 9
Scope
Executable pending-state/overflow fixture. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Guest event pair errorAMD · Optional · Also in Faults & recovery
Inject / compare
Set reserved bits in supported INSERT_GUEST_EVENT.
Observe
GUEST_EVENT_FAULT plus companion payload; two slots in command and event paths.
Recover
Preserve pairing across wrap and repair the injection command.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4.9 / §2.5.12
Scope
Executable semantic pair. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Virtualized-IOMMU backing failureAMD · Optional · Also in Faults & recovery
Inject / compare
Inject a private-memory access error for a virtual context.
Observe
VIOMMU_HARDWARE_ERROR with feature-specific source/type evidence; virtual processing may halt.
Recover
Repair that context and its enable/run lifecycle; use RESET_VMMIO where applicable.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.13 / §2.4.10
Scope
Command effect executable; hardware failure reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
SNP RMP protection versus hardware failureAMD · Optional · Also in Faults & recovery
Inject / compare
Separate RMP check rejection from an RMP memory-access failure.
Observe
RMP_PAGE_FAULT versus RMP_HARDWARE_ERROR; neither is a generic absent PTE.
Recover
Inspect RMP-specific fields and ownership/lifetime, with the platform recovery procedure.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.14–15
Scope
Reference; no SNP/RMP emulator. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Multiple simultaneous errorsAMD · Reporting · Also in Faults & recovery
Inject / compare
Inject more than one violation with cache/fetch state controlled.
Observe
The spec may permit one of several detected events. Do not assert an invented total priority order.
Recover
Use isolated injections first; record allowed outcomes for combined cases.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.16.1
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Counter reaches zeroAMD · Reporting · Also in Faults & recovery
Inject / compare
Enable an event counter and let it wrap to zero.
Observe
EVENT_COUNTER_ZERO (0xA): informational, not a page fault.
Recover
Consume the record and evaluate measurement policy without unnecessary engine restart.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.11 / Figure 66 / Table 68
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Conditional CXL fieldAMD · DTE / 3.11 · Also in Faults & recovery
Inject / compare
Set CXLMemAttr[6:4] while I=0, support/enable is absent, or the non-secure SEV-TIO DTE forbids it.
Observe
These are conditional fields, not universally reserved bits, and must be zero here; this fixture reports ILLEGAL_DEV_TABLE_ENTRY (Table 43).
Recover
Restore required-zero fields or select a supported profile; validate Table 79 combinations separately.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7 / §2.13
Scope
Missing support executable; CXL completion matrix reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Secure ATS capability and SNP profileAMD · DTE / 3.11 · Also in Faults & recovery
Inject / compare
Set SATS without support, or select an incompatible SNP/SnpPageMode0Sup/Mode combination.
Observe
Ordinary unsupported SATS is an illegal DTE. SNP mode restrictions distinguish illegal DTE and RMP faults; use §2.12.2.4 capability conditions.
Recover
Restore the complete supported profile, including the §2.12.2.4 capability conditions.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7 / §2.12.2.4
Scope
Unsupported SATS executable; SNP reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
GIoV DomainID reuseAMD · Isolation / 3.11 · Also in Faults & recovery
Inject / compare
Assign the same DomainID to devices with GIoV=1.
Observe
Violates the unique-DomainID software requirement. Do not invent a dedicated hardware fault for this software configuration error.
Recover
Allocate separate DomainIDs, invalidate affected state and verify cross-device isolation.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7 / §2.2.9
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Host-only command in guest bufferAMD · Virtualization / 3.11 · Also in Faults & recovery
Inject / compare
Issue a command outside the five guest-supported types, including INSERT_GUEST_EVENT or RESET_VMMIO.
Observe
Reject the unsupported guest operation; the explicitly host-only examples generate ILLEGAL_COMMAND_ERROR.
Recover
Use host command context where required and follow the affected guest error lifecycle.
Source
AMD 48882-PUB 3.11, April 2026 · §§2.4.9–10, 2.10.7
Scope
Reference; workbench command queue is host context. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Reset without VF reconfigurationAMD · Virtualization / 3.11 · Also in Faults & recovery
Inject / compare
Issue RESET_VMMIO then attempt guest operation before appropriate VF controls are reprogrammed.
Observe
A command reset alone is not a completed guest recovery protocol.
Recover
Reprogram Guest VF Control registers, then follow guest enable/run and ownership rules.
Source
AMD 48882-PUB 3.11, April 2026 · §2.4.10
Scope
Executable reconfiguration-required state. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Wrong guest PRI destinationAMD · Virtualization / 3.11 · Also in Faults & recovery
Inject / compare
Change DTE.vIMUEn in the specified vIOMMU case while sending guest GVA PRI.
Observe
vIMUEn=1 selects guest PPR; 0 selects host PPR. Looking only at the other log can falsely suggest the request vanished.
Recover
Check active guest/host context, proper destination and response ownership.
Source
AMD 48882-PUB 3.11, April 2026 · §2.10.6
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Outdated IRTE cacheability assumptionAMD · Interrupt / 3.11 · Also in Faults & recovery
Inject / compare
Modify GALogIntr or GAPPIDis and expect stale cached copies solely because older documentation omitted them.
Observe
These fields are identified as non-cached in §2.2.5.2. Cacheable fields still need the specified invalidation.
Recover
Preserve required atomic update rules and classify each field correctly.
Source
AMD 48882-PUB 3.11, April 2026 · §§2.2.5.2, 2.3.2
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run CACHE-IRQ-02
Enhanced invalid-device event decoded as legacyAMD · Secure events / 3.11 · Also in Faults & recovery
Inject / compare
Receive a fenced-guest request with the enhanced Type[3] form.
Observe
INVALID_DEVICE_REQUEST remains event code 8 but its enhanced fields differ; legacy PASID/type assumptions lose context.
Recover
Decode the correct feature-dependent format and preserve virtual-buffer/recovery evidence.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.9.1 / Figure 63
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Secure DTE or RMP evidence lostAMD · Secure events / 3.11 · Also in Faults & recovery
Inject / compare
Inject a secure DTE fetch or RMP fault and decode using the older record layout.
Observe
The secure fetch S bit and revised RMP fields carry context that the old decoder can miss.
Recover
Select the revision/feature-specific format before interpreting fields; repair the actual backing or ownership fault.
Source
AMD 48882-PUB 3.11, April 2026 · §§2.5.4, 2.5.14–15
Scope
Reference. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Invalid TDI setup or PRI security bitsAMD · SEV-TIO / 3.11 · Also in Faults & recovery
Inject / compare
Configure a TDI with Mode=0, use unsupported secure-MMIO page sizes, or send PRI with incorrect XT/T encodings.
Observe
Mode=0 is forbidden; secure MMIO RMP coverage is 4 KiB; incorrect PRI encodings produce INVALID_PPR_REQUEST. Do not assign one universal event to all three conditions.
Recover
Use ASP-owned secure configuration, required secure guest PPR backing and the firmware/TDISP protocol.
Source
AMD 48882-PUB 3.11, April 2026 · §2.14 / firmware spec 58271
Scope
Reference; no SEV-TIO emulator. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
PASID enabled but client sends no prefixAMD · Client identity · Interactive classifier
Inject / compare
Enable PASID in the device; configure a tagged workload; capture an untagged Memory Request.
Observe
This violates the workload contract, not automatically the IOMMU architecture. With GIoV inactive, the V=1/TV=1 fixture performs host translation.
Recover
Check actual header evidence and endpoint descriptor/context selection. Do not use capability enablement as proof of tagged DMA.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7; §2.2.9
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Implicit PASID 0 under Guest I/O ProtectionAMD · Client identity · Interactive classifier
Inject / compare
Send untagged ordinary DMA with GIoSup and meaningful GIoV enabled.
Observe
The IOMMU supplies effective PASID 0 for guest translation. That is not an observed PASID prefix.
Recover
Test GCR3[0] separately from the intended explicit PASID; include unsupported GIoSup and inactive GV controls.
Source
AMD 48882-PUB 3.11, April 2026 · Table 7; §2.2.9
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Mixed tagged and untagged DMAAMD · Client identity · Test design
Inject / compare
Alternate explicit nonzero PASID and untagged requests from one DeviceID with GIoV enabled.
Observe
Untagged traffic uses default PASID 0. Explicit traffic selects its own context; both may deliberately map to the same guest tables.
Recover
Verify context selection with disjoint owned test mappings before testing intentional sharing.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.9
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
PASID field zero in a fault recordAMD · Client identity · Interactive classifier
Inject / compare
Inspect a fault record containing a zero PASID value without the original request or validity flags.
Observe
Do not conclude that the client sent PASID 0. Some invalid/absent context fields are reported as zero.
Recover
Correlate GN/context flags and the captured request with the exact event format.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.3; Table 7
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Wrong valid PASID versus out-of-range PASIDAMD · Client identity · Interactive classifier
Inject / compare
Send another allocated PASID, then one beyond PASmax, then a supported but unallocated context.
Observe
A wrong but valid PASID can translate successfully into the wrong workload context. Range and lookup faults are separate cases.
Recover
Use per-context sentinel mappings and requester ownership evidence; fault-only testing misses wrong-context success.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.6; Table 44
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
PASID prefix with guest translation inactiveAMD · Client identity · Interactive classifier
Inject / compare
Send a PASID-bearing access while guest translation is unsupported or not enabled for the DeviceID.
Observe
Table 50 lists INVALID_DEVICE_REQUEST; this is not an absent guest PTE.
Recover
Validate support, GTEn, GV and request class before enabling guest translation.
Source
AMD 48882-PUB 3.11, April 2026 · Tables 5, 24, 50
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
AT is not inferred from successAMD · DMA type · Interactive classifier
Inject / compare
Compare AT=00 payload DMA, AT=01 Translation Request and AT=10 pretranslated access to the same address.
Observe
ATS permission information is not proof of payload movement; a pretranslated access is not evidence of a new guest walk.
Recover
Record AT with the actual header. Pair the test with byte evidence and correct invalidation scope.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.7; Tables 44, 50–51
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
ATS fault has a different observationAMD · DMA type · Test design
Inject / compare
Clear PR on an otherwise valid mapping, then issue ordinary DMA and an ATS Translation Request.
Observe
Table 44 can return ATS R=W=0 without the ordinary IO_PAGE_FAULT log entry. Permissions denial is not equivalent to no ATS response.
Recover
Inspect Translation Completion permission fields, not just event count.
Source
AMD 48882-PUB 3.11, April 2026 · Table 44
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Pretranslated request with DTE.I disabledAMD · DMA type · Interactive classifier
Inject / compare
Issue a pretranslated access with V=1 but I=0, then compare an ATS request.
Observe
Both use INVALID_DEVICE_REQUEST rules, but Tables 50 and 51 specify different access/translation response context.
Recover
Fix endpoint/IOMMU agreement; do not grant access based on a cached address alone.
Source
AMD 48882-PUB 3.11, April 2026 · Tables 50–51
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Read-only data used to identify directionAMD · Permissions · Test design
Inject / compare
Prepare a known readable but nonwritable page; issue the client operation and inspect both header and bytes.
Observe
A Write should be rejected while Read can succeed. This supports direction diagnosis only after path, mapping and cache state are proven.
Recover
Repeat with opposite permission controls and a positive control; a single failure is ambiguous.
Source
AMD 48882-PUB 3.11, April 2026 · Table 44
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Execute and privilege bits do not follow PASID enableAMD · Permissions · Reference recipe
Inject / compare
Vary EXE and PMR with their capabilities/controls and guest NX or supervisor permissions.
Observe
NXSup, USSup and PrivAbrtEn affect the allowed behaviour. PASID presence alone does not establish execute or privilege attributes.
Recover
Capture the prefix attributes and validate permissions at all traversed levels.
Source
AMD 48882-PUB 3.11, April 2026 · §§2.2.6.1–2; Table 44
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
MSI carries a PASID prefixAMD · Interrupts · Interactive classifier
Inject / compare
Send an interrupt transaction with a PASID, separately from an untagged MSI.
Observe
Table 44 lists an interrupt-context IO_PAGE_FAULT; do not decode it as payload-memory permission failure.
Recover
Repair client interrupt formation; capture address/data and request identity.
Source
AMD 48882-PUB 3.11, April 2026 · Table 44
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Guest I/O Protection must not steal MSIAMD · Interrupts · Interactive classifier
Inject / compare
Enable GIoV and issue untagged MSI at 0xFEEx_xxxx alongside ordinary untagged DMA.
Observe
MSI still follows interrupt remapping; ordinary DMA can use implicit PASID 0.
Recover
Assert both paths independently; do not run MSI through GCR3[0] in the teaching model.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.9
Scope
Interactive classifier. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Read or non-posted write in interrupt spaceAMD · Interrupts · Reference recipe
Inject / compare
Inject Read/non-posted Write into interrupt space rather than a normal posted MSI.
Observe
INVALID_DEVICE_REQUEST under Table 50; a syntactically valid memory operation can target a prohibited request class/address combination.
Recover
Check transaction kind before diagnosing IRTE contents.
Source
AMD 48882-PUB 3.11, April 2026 · Table 50
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
IRTE index boundary and format strideAMD · Interrupts · Reference recipe
Inject / compare
Test the last permitted index, first beyond the table and incorrect entry-size assumptions in 32/128-bit formats.
Observe
An out-of-range IRTE is not an invalid DTE table-length encoding. Decode the selected format before calculating its address.
Recover
Check IntTabLen, capability/enable gates and byte extent without truncating the index.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.5; Tables 7, 19–22, 44
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Interrupt table read failsAMD · Interrupts · Reference recipe
Inject / compare
Keep the interrupt request and DTE legal; fail the memory fetch of the IRTE.
Observe
This page treats a failed interrupt-remapping-table read as PAGE_TAB_HARDWARE_ERROR with I=1 (Table 60); preserve interrupt context.
Recover
Repair table accessibility; changing RemapEn or a data PTE is not the same repair.
Source
AMD 48882-PUB 3.11, April 2026 · §2.5.5; Table 46
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Unsupported 128-bit/x2APIC modeAMD · Interrupts · Related semantic lab
Inject / compare
Select a wide interrupt format with its capability or enable prerequisites missing.
Observe
Do not silently reinterpret wide bytes as a legacy entry. Feature gates precede field meaning.
Recover
Use the supported format and selected profile; test unsupported, disabled and enabled states.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.5.1–3
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Stale interrupt mapping after retargetAMD · Interrupts · Related semantic lab
Inject / compare
Warm an IRTE, change destination/vector in backing memory and issue the interrupt before and after required invalidation.
Observe
Interpret cached versus live fields using the selected format. A memory-TLB invalidation is not an interrupt-table invalidation.
Recover
Publish the entry and perform the applicable interrupt maintenance; preserve old/new destination evidence.
Source
AMD 48882-PUB 3.11, April 2026 · §2.2.5; §2.4.5
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run CACHE-IRQ-01 · Run CROSS-IRQ-01
GA log loss versus lost interruptAMD · Interrupts · Related semantic lab
Inject / compare
Overflow GA log while the targeted guest is not running, then inspect virtual APIC backing state.
Observe
Lost notification record does not necessarily mean lost pending vector. ISR/EOI and reading a GA log are different operations.
Recover
Reconcile guest interrupt state and log overflow independently before retrying notification.
Source
AMD 48882-PUB 3.11, April 2026 · §2.7
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run CACHE-GA-01
Wrong DeviceID with a valid PASIDAMD · Identity isolation · Test design
Inject / compare
Keep PASID and address unchanged while changing RequesterID to another permitted device context.
Observe
PASID alone does not identify the DTE or prove requester ownership. An allowed translation can still belong to the wrong client.
Recover
Correlate DeviceID, routing/aliases, DomainID and PASID with isolated sentinel pages.
Source
AMD 48882-PUB 3.11, April 2026 · §§2.1–2.2
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
StreamID range versus STE contentsArm · Identity · Related semantic lab
Inject / compare
Compare out-of-range StreamID, inaccessible STE memory and invalid STE contents with cold configuration caches.
Observe
Distinguish C_BAD_STREAMID, F_STE_FETCH and C_BAD_STE; a table-fetch failure is not a translation permission fault.
Recover
Repair routing, allocation or descriptor as indicated; apply configuration maintenance before retry.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.3, 7.3
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Substream validity versus missing CDArm · Identity · Related semantic lab
Inject / compare
Use a valid stream with an invalid SubstreamID, then an inaccessible or invalid CD.
Observe
Separate C_BAD_SUBSTREAMID, F_CD_FETCH and C_BAD_CD. A PASID-to-SubstreamID relationship depends on the PCIe integration.
Recover
Check CD table extent, STE settings and stream ownership; do not truncate identity into another context.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.3, 3.9, 7.3
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Stage-1 metadata needs stage-2 accessArm · Translation · Related semantic lab
Inject / compare
Leave the final data mapping valid but remove stage-2 access to a stage-1 table page.
Observe
Diagnose stage-2 failure on a translation-table access, not final payload access. Preserve stage and input/table address evidence.
Recover
Repair the metadata mapping and invalidate the applicable translation state.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.3, 7.3
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Input width is not output widthArm · Translation · Related semantic lab
Inject / compare
Test the first input outside the selected translation regime separately from a descriptor output beyond OAS.
Observe
A translation fault and an address-size fault are not interchangeable. Bypass still has an output-address limit.
Recover
Restore the supported address regime; never silently mask high bits.
Source
Arm IHI 0070 H.a, 6 March 2026 · §3.4; §7.3
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Block bases versus byte offsetsArm · Translation · Related semantic lab
Inject / compare
With the 4 KiB granule, test 4 KiB pages, 2 MiB and 1 GiB blocks; use aligned frames and nonzero request offsets.
Observe
Frame alignment follows block size. The DMA byte address need not be block aligned; an offset is carried into the output.
Recover
Correct the descriptor base/level, retain the legitimate byte offset. Other granules have different geometry.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.4.2, 3.13; Ch5
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Access flag is not read/write permissionArm · Permissions · Related semantic lab
Inject / compare
Compare AF=0 with valid AF but denied write, before enabling any supported hardware update facilities.
Observe
F_ACCESS and F_PERMISSION identify different failures. Hardware AF/dirty updates depend on capabilities and controls.
Recover
Use IDR0.HTTU and descriptor controls to choose the oracle; do not automatically grant a denied permission.
Source
Arm IHI 0070 H.a, 6 March 2026 · §3.13; §7.3
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Restrictions at both stagesArm · Permissions · Related semantic lab
Inject / compare
Grant a write at S1 and deny at S2; reverse the stages and compare with Read.
Observe
The final request must satisfy both active stages. Record the failing stage instead of blaming the last leaf displayed.
Recover
Change only the intended owner’s mapping and invalidate the matching scope.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.3, 3.13
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Retry before fixing the causeArm · Stall · Executable regression
Inject / compare
Stall on a missing page and issue CMD_RESUME Retry without repair.
Observe
Retry is a new evaluation and can stall again. It must not force termination simply because this is a retry.
Recover
Repair, perform maintenance and synchronize, then resume the new StreamID/STAG.
Source
Arm IHI 0070 H.a, 6 March 2026 · §3.12.2; §4.7.1
Scope
Executable regression. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Wrong StreamID with a valid stall tagArm · Stall · Executable regression
Inject / compare
Use the tag of one stalled transaction with another StreamID.
Observe
The pair identifies the transaction. No unrelated stalled transaction may be resumed; the local model rejects this as a software guard.
Recover
Keep the original identity/tag together. Do not interpret the guard as an architectural EVTQ event.
Source
Arm IHI 0070 H.a, 6 March 2026 · §3.12.2; §4.7.1
Scope
Executable regression. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Deferred fault changes before EVTQ freesArm · Stall · Executable regression
Inject / compare
Fill EVTQ, stall another transaction, change its missing mapping to a write-denied mapping, then consume an event.
Observe
When queue space returns the transaction is retried; the new record can describe a different fault. A repaired request can succeed instead.
Recover
Diagnose the current record, not the first attempted fault; preserve the entire test history.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.5.3–4, 3.12.2
Scope
Executable regression. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Terminate versus resume versus PRI responseArm · Stall · Related semantic lab
Inject / compare
Compare a terminated translation, a stalled transaction and a PCIe Page Request Group.
Observe
Terminated requests are not replayed by reading EVTQ. CMD_RESUME addresses a stall; CMD_PRI_RESP responds to a PRI group.
Recover
Use the correct protocol and ensure every retained stall has a resolution path.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.12, 4.5.2, 4.7.1
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
EVTQ overflow does not freeze future writesArm · Queues · Reference recipe
Inject / compare
Lose a terminated event in a full EVTQ, free space but delay OVACKFLG acknowledgement.
Observe
New events can be recorded despite unacknowledged overflow. A second loss cannot produce a new toggle until acknowledgement.
Recover
Consume promptly and copy observed OVFLG into OVACKFLG; preserve lost-evidence status.
Source
Arm IHI 0070 H.a, 6 March 2026 · §7.4
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Retained stalls do not cause EVTQ overflowArm · Queues · Executable regression
Inject / compare
Compare full-queue handling of stalled and terminated faults.
Observe
A retained stall event is not a discarded event and does not itself set the overflow condition. Never overwrite unread records.
Recover
Free space and allow retry. Test configuration changes before retry separately.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.5.3, 7.4
Scope
Executable regression. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
PRIQ overflow differs from EVTQArm · Queues · Reference recipe
Inject / compare
Fill PRIQ; compare Last=0, Last=1 and Stop Marker while overflow is active.
Observe
PRIQ overflow inhibits new entries. Last=1 page requests receive an automatic response; Last=0 is discarded. Stop Marker is not a Last response trigger.
Recover
Drain and acknowledge overflow. Validate response PASID/status using PPS/PPAR and validity rules, not a constant success oracle.
Source
Arm IHI 0070 H.a, 6 March 2026 · §8.1
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Queue memory fault versus MSI faultArm · Queues · Reference recipe
Inject / compare
Independently fail event-record memory writes and notification MSI writes.
Observe
Inspect the appropriate GERROR bit. Missing notification does not establish that the queue entry was never written.
Recover
Repair the failing destination and use the specified acknowledgement; inspect queue state independently.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§7.2.2, 7.5
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Consumption is not completionArm · Commands · Reference recipe
Inject / compare
Publish an invalidation and inspect CMDQ_CONS before observing the later CMD_SYNC completion.
Observe
Passing a command entry permits slot reuse but is not a universal proof that all its effects completed.
Recover
Wait for the appropriate synchronization on that queue before relying on maintenance.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§4.1.4, 4.7.3, 4.8
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Reserved field detection is conditionalArm · Commands · Related semantic lab
Inject / compare
Test a reserved opcode, an invalid defined parameter and nonzero reserved bits separately.
Observe
CERROR_ILL applies to illegal commands; detection of reserved/undefined nonzero fields can be optional. Memory access abort is CERROR_ABT.
Recover
Preserve the bad command and consumer index; use the chosen implementation detection policy.
Source
Arm IHI 0070 H.a, 6 March 2026 · §4.1.3; §7.1
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
GERROR acknowledgement is not AMD W1CArm · Commands · Related semantic lab
Inject / compare
Halt CMDQ on an illegal command; acknowledge before repair, then retry.
Observe
Acknowledgement alone does not make the command legal. GERROR/GERRORN matching-bit semantics differ from clearing an AMD status bit.
Recover
Repair or follow the specified skip/retry procedure, acknowledge the matching error, then observe progress.
Source
Arm IHI 0070 H.a, 6 March 2026 · §7.1; §7.5; Ch6
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
CFGI and TLBI solve different stale stateArm · Caches · Related semantic lab
Inject / compare
Warm STE/CD and translation caches, change one configuration field and one leaf mapping.
Observe
Configuration invalidation and translation invalidation have different targets. One is not a universal substitute for the other.
Recover
Use correct StreamID/SubstreamID and ASID/VMID scopes, with required completion.
Source
Arm IHI 0070 H.a, 6 March 2026 · §3.21; §§4.3–4.4
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run ARM-CACHE-01
Equal indices can mean fullArm · Queues · Related semantic lab
Inject / compare
Wrap producer through the queue while holding consumer fixed.
Observe
Equal indices with opposite wrap bits mean full; matching index and wrap mean empty. AMD’s reserved-slot fixture must not be reused unchanged.
Recover
Use complete pointer state and visibility rules, not integer index comparison.
Source
Arm IHI 0070 H.a, 6 March 2026 · §3.5.1–2; §7.4
Scope
Related semantic lab. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
ATS configuration transitionsArm · Optional · Reference recipe
Inject / compare
Change EATS or translation controls while endpoint translations might still be cached.
Observe
Follow the ATS configuration-change and ATC maintenance sequence for the selected support level. A TLBI alone does not prove endpoint caches are empty.
Recover
Quiesce and synchronize according to the architecture and endpoint protocol; include stale in-flight traffic.
Source
Arm IHI 0070 H.a, 6 March 2026 · §§3.9.1–2; §4.5.1
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
SMMUv3.5 is not a feature bundleArm · Optional · Reference recipe
Inject / compare
Select DCMDQ, virtual StreamID translation, dirty-state facilities or protected translation in a capability matrix.
Observe
Gate optional features individually. Test unsupported, supported-disabled and supported-enabled states; do not infer support from H.a document revision.
Recover
Record IDR controls and the exact architecture profile with each result.
Source
Arm IHI 0070 H.a, 6 March 2026 · §2.9; §§3.5.7–9, 3.13, 3.25
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Descriptor crossing versus illegal single requestPCIe · Requests · Interactive planner
Inject / compare
Plan a 32-byte descriptor at 0x1ff0. Compare split requests with the unsplit extent.
Observe
A descriptor may span 4 KiB boundaries; each ordinary Memory Request must stay inside one.
Recover
Split before submission; do not report an IOMMU page fault for packet construction.
Source
Intel 710 Series datasheet 4.1 · PCIe request boundaries and limits · PCIe data alignment / request size
Scope
Interactive planner. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
MPS and MRRS are distinctPCIe · Requests · Interactive planner
Inject / compare
Use a 512-byte transfer with MPS=128 and MRRS=512; toggle Write and Read.
Observe
Write payload uses MPS; Read request uses MRRS. The resulting packet counts can differ.
Recover
Use the negotiated/configured limits. The planner does not predict Completion packetization.
Source
Intel 710 Series datasheet 4.1 · PCIe request boundaries and limits · PCIe request size
Scope
Interactive planner. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Enabled bytes versus DW extentPCIe · Requests · Interactive planner
Inject / compare
Start at 0x1003 and request two contiguous bytes.
Observe
The header uses a DW-aligned address; Length covers two DWs, with first BE=8 and last BE=1.
Recover
Encode byte enables; do not round the requested application data into an extra write.
Source
AMD PG054 3.3 · Error Detection (PCIe implementation guidance) · §2.2.5 as cited by PG054
Scope
Interactive planner. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
One DW and maximum Length encodingPCIe · Requests · Interactive planner
Inject / compare
Compare a one-byte request with 4096 enabled bytes at 0x1000 using 4096 limits.
Observe
One DW uses LastBE=0; the 1024-DW request uses the zero Length-field encoding. Zero field does not mean empty data.
Recover
Keep decoded length separate from wire field. Zero-length request semantics are outside this planner.
Source
Intel 710 Series datasheet 4.1 · PCIe request boundaries and limits · PCIe Memory Request fields
Scope
Interactive planner. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
One Read can have several CompletionsPCIe · Completions · Reference recipe
Inject / compare
Receive only part of a Read response, with other tags interleaved.
Observe
Track the original request until all its data arrives; one Completion does not necessarily finish the request.
Recover
Track identity, remaining byte range and receive capacity.
Source
AMD PG054 · Tracking Non-Posted Requests and Inbound Completions · Tracking Non-Posted Requests
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Timeout followed by a late CompletionPCIe · Completions · Reference recipe
Inject / compare
Expire an outstanding Non-Posted request, then deliver its old response.
Observe
Late response must not complete a new request that reused state; PG054 treats it as Unexpected Completion.
Recover
Preserve timeout evidence and manage tag lifetime according to the applicable protocol.
Source
AMD PG054 · Completion Timeouts · Completion Timeouts
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Wrong or unsupported Completion shapePCIe · Completions · Reference recipe
Inject / compare
Test successful Cpl without data for a Memory Read and an unmatched locked Completion at an endpoint.
Observe
PCI-SIG permits alternative Malformed/Unexpected classifications in these documented cases; avoid an over-specific oracle.
Recover
Assert rejection and isolation, then use the implementation’s permitted reporting policy.
Source
PCI-SIG PCIe 3.0 FAQ · permitted error classifications · PCIe 3.0 FAQ §§2.3.1.1, 2.3.2
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Posted writes do not get a normal CompletionPCIe · Completions · Reference recipe
Inject / compare
Contrast an ordinary Memory Write with a Read and a failed Non-Posted request.
Observe
A posted write has no request Completion; software cannot infer durable success by waiting for a nonexistent packet.
Recover
Use the device’s completion/ordering protocol. Error reporting is separate from an ordinary Completion.
Source
AMD PG054 · Completer Abort · Completer Abort; request classes
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
PASID is not placed on a CompletionPCIe · Identity · Reference recipe
Inject / compare
Add a PASID prefix to a Completion in a PCIe 3.1 fixture.
Observe
PCI-SIG §6.20 FAQ excludes this. Do not copy request prefixes mechanically onto responses.
Recover
Keep request identity tracking in requester state; confirm newer-revision rules in the selected Base specification.
Source
PCI-SIG FAQ · PCIe 3.1 §6.20 PASID on Completions · PCIe 3.1 §6.20 FAQ
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Malformed packet versus translation denialPCIe · Errors · Reference recipe
Inject / compare
Mutate a packet Length/BE or address-boundary rule separately from a valid request to an absent mapping.
Observe
Packet checks and IOMMU walk faults belong to different layers; detection requirements can be optional.
Recover
Record which layer actually accepted the request before asserting its error family.
Source
AMD PG054 3.3 · Error Detection (PCIe implementation guidance) · PG054 Error Detection
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Completion receive capacityPCIe · Resources · Reference recipe
Inject / compare
Issue many Read requests without sufficient capacity to receive their responses.
Observe
Requester admission must account for outstanding Completions; request count alone is not a byte-capacity model.
Recover
Throttle issuance and test concurrent tags and response splitting.
Source
AMD PG054 · Tracking Non-Posted Requests and Inbound Completions · Tracking Non-Posted Requests
Scope
Reference recipe. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Newer wire modes and optional servicesPCIe · Scope · Needs Base specification
Inject / compare
Plan tests for FLIT mode, IDE, AtomicOps, ACS, SR-IOV and reset/hot-plug races.
Observe
These need the selected Base revision, ECNs and capability profile. The site makes no normative coverage claim for them.
Recover
Add exact normative references and hardware/VIP expectations before turning these into conformance assertions.
Source
PCI-SIG PCIe 3.0 FAQ · permitted error classifications · Revision-specific source needed
Scope
Needs Base specification. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
No event does not prove no trafficCross-layer · Evidence · Test design
Inject / compare
Repeat denied access with logging disabled, suppressed, full and with a notification failure.
Observe
Record submission, routing, memory and diagnostic evidence separately. Missing logs alone cannot prove that traffic bypassed or traversed translation.
Recover
Restore reporting and rerun a positive control plus a deliberately denied request.
Source
AMD 48882-PUB 3.11, April 2026 · AMD §2.5.16; Arm §§3.5.3, 7.4
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run COHERENCY-01
Warm cache versus repaired backingCross-layer · Lifetime · Test design
Inject / compare
Compare cold, stale-positive and stale-negative translation state around a mapping edit.
Observe
A backing-memory edit alone is not a publication/invalidation/completion sequence. A new request is needed to test recovery.
Recover
Track backing version, invalidation scope, completion and request identity.
Source
AMD 48882-PUB 3.11, April 2026 · AMD §2.4; Arm §§3.21, 4.3–4.7
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case · Run CACHE-DMA-01
Later request faults after earlier writesCross-layer · Partial progress · Test design
Inject / compare
Split a descriptor across a boundary; allow the first request and deny the next.
Observe
Do not claim whole-descriptor atomic rollback. Inspect changed and unchanged ranges separately.
Recover
Reconcile partial progress before retrying; repeated writes may be unsafe for device memory.
Source
AMD 48882-PUB 3.11, April 2026 · AMD §2.1.3.1; Arm §3.12
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Aliases and peer routingCross-layer · Identity · Test design
Inject / compare
Compare two requester identities sharing a context with a path that does not traverse the tested translation unit.
Observe
Valid page tables alone do not establish isolation or traversal. Preserve platform routing evidence.
Recover
Verify the actual requester/stream mapping and fabric topology; missing evidence stays inconclusive.
Source
AMD 48882-PUB 3.11, April 2026 · AMD §2.1; Arm §3.3
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Two faults at onceCross-layer · Oracle · Test design
Inject / compare
Combine absent translation, reserved bits and inaccessible metadata, with both warm and cold caches.
Observe
Do not invent a universal first-error priority. Use the relevant architecture priority rules and permitted outcome set.
Recover
Begin with isolated faults, then combine them with explicit preconditions and allowed observations.
Source
Arm IHI 0070 H.a, 6 March 2026 · AMD §2.5.16.1; Arm §7.3.23
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case
Acknowledgement is not repairCross-layer · Recovery · Test design
Inject / compare
Clear notification, consume an event, repair a descriptor and synchronize as separate operations.
Observe
Each action has a different effect. Retiring diagnostic evidence does not replay a terminated transaction or repair memory.
Recover
Preserve the first failure; repair, synchronize and issue/resume through the appropriate protocol.
Source
AMD 48882-PUB 3.11, April 2026 · AMD §§2.4–2.7; Arm §§3.12, 4.7, 7.5
Scope
Test design. A related lab is not proof that every variation in this recipe is executable. Open related material · Link to this case

Sources and revision boundaries

Reviewed 27 September 2026. Supplied AMD 3.11 and Arm H.a PDFs are the normative baselines. Public URLs can change edition. PCIe sources below have the limited scope stated in the guide.