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

FOUNDATIONS / AMD 48882 REV 3.11 / ARM SMMUv3

Follow the request. Test the protection.

What an IOMMU does, which structures decide the outcome, and how negative tests distinguish a working protection path from a misleading success.

Start with the basics Or try it hands-on: follow 16 bytes →

Sections 1–6 are the foundations: start with the concepts, switch between the AMD and Arm diagrams, then use the evidence checker. Sections 7 and 8 are reference for readers working from the AMD specification, which remains the authority for encodings and platform requirements.

What claims does this page make? 3 points

1 / What problem does an IOMMU solve?

A device can read and write memory using DMA without asking the CPU to copy each byte. An IOMMU associates that traffic with a device or process context, translates the supplied address when configured to do so, and checks access to the mapped memory. CPU virtual-memory translation is a separate path.

ONE DMA WRITE · SCROLL TO MOVE IT

DEVICENIC PCIeroot port IOMMUDTEwalk MEMORYDRAM

WRITE · IOVA 0x7f001040 · 16 B

  1. The device writes to an address it was given. A network card writes 16 bytes of a received packet to IOVA 0x7f001040. It knows nothing about system memory, only the address the driver handed it.
  2. The request carries an identity. It crosses the PCIe link tagged with the card’s Requester ID, 03:00.0 (bus 3, device 0, function 0). That ID, not the address, decides whose rules apply.
  3. The IOMMU looks up the rules and translates. The ID selects a device table entry, which points at domain 7’s page tables. The walk turns the IOVA into system physical address 0x123456040 and checks that writes are allowed.
  4. Only then does memory change. If the mapping were missing or read-only, the write would stop at the IOMMU. Here fault logging is on, so the denial is recorded; with logging off or full, a denied write leaves no record, so a missing record never proves the write succeeded. Try “Remove the mapping”. The rest of this guide is about proving which of these happened.

Arm SMMUv3 is an IOMMU architecture. AMD IOMMU and Arm SMMUv3 solve related isolation and translation problems with different descriptors, commands, queues and fault formats. Do not decode one architecture’s entries using the other’s bit definitions.

The Lenovo paper provides a useful Linux introduction and distinguishes DMA translation from pass-through. Device assignment to a VM can still use IOMMU translation; “PCI passthrough” does not mean “no DMA protection.” Its kernel examples and distribution defaults reflect its 2021 publication. Lenovo LP1467 is background reading; this guide uses AMD 48882 rev 3.11 for hardware rules and current kernel documentation for API concepts.

Scroll horizontally to compare every column.

Term Meaning Do not confuse it with
CPU VA Address used by CPU software through its MMU. A device DMA address or a physical address.
IOVA / DVA Address in the device-visible translation space. It may be a process VA in a configured shared-address-space mode. An arbitrary CPU pointer.
GVA → GPA → SPA AMD nested example: guest address, guest physical address, system physical address. Two CPU copies of the data. The IOMMU walks metadata.
VA → IPA → PA Arm stage 1 then stage 2 in a nested configuration. An identical AMD descriptor encoding.
RequesterID / DeviceID / StreamID Identifies which device context handles the request; platform routing and aliases matter. PASID or SubstreamID, which can select an address space within a device.
DomainID / ASID / VMID Tags and contexts used by their particular architecture. Linux IOMMU group identity; these are different abstractions.
Identity mapping / bypass Identity mapping can translate X to X. Bypass skips the selected translation path. Proof of isolation from observing an unchanged numerical address.

DMA read means the device reads system memory; DMA write means it writes system memory. A NIC’s TX payload is normally read from memory, while RX payload is written to memory. Packet direction alone is a poor label for a permission test.

An enable bit proves configuration state. A correlated fault proves handling of a particular request. A controlled allowed → denied → recovered experiment supports the intended protection behaviour. None alone proves every traffic class is protected.

2 / The structures that decide the request

AMD: DeviceID selects the DTE; PASID can select the guest address space.

Diagrams show the lookup dependencies. On small screens, the same relationships appear as readable stacked steps.

AMD nested lookup: a DTE selects guest and host translation controls; guest page-table fetches also require host translation. guest context host root final translation Device request DeviceID + PASID Device table entry policy + roots GCR3 → guest tables GVA to GPA Host tables GPA to SPA Permission result payload or fault
  1. Device request

    DeviceID selects the device; PASID can identify its process address space.

  2. DTE selects both translation stages

    Its guest controls lead to GCR3 and guest tables; its host controls select the host tables.

  3. Guest walk → host walk

    The guest result GPA and applicable guest-table fetch addresses require host translation to SPA.

  4. Permission result

    Only an allowed request reaches its data target. Invalid configuration, translation or protection follows the relevant fault path.

Conceptual dependencies, not a claim that every request causes every memory fetch. Cached state can satisfy a lookup.

Scroll horizontally to compare every column.

Structure Function and important fields Negative test / evidence
AMD DTE · 32 B Device policy: V, TV, Mode/root, IR/IW, DomainID, I/ATS, GV/GLX/GCR3 and interrupt controls; optional fields are capability-dependent. Wrong DeviceID/alias; reserved or unsupported field; TV versus V; device permission denial. Table 7, §§2.2.2 and 2.5.
AMD GCR3 hierarchy · 8 B entries PASID selects a guest root. The DTE carries the top GCR3 table pointer (an SPA, or a GPA when GCR3TRPMode=1). Subordinate structures follow the specified address-space rules. Invalid V, wrong PASID/root, range limit and nested metadata translation failure. §2.2.6.
AMD guest page tables x86-style P, R/W, U/S, NX, PS, address and applicable A/D controls; four/five-level support depends on configuration. Read/write/execute/privilege matrix; canonicality; reserved address bits; absence at each level. §§2.2.6–7.
AMD v1 host tables · 8 B entries PR, IR/IW, NextLevel and pointer/frame. A directory selects another level; a leaf maps data. Invalid descent, skipped-index bits, permissions, size/alignment, hardware fetch error. §2.2.3.
AMD IRTE / APIC backing / GA log Three different things: interrupt routing policy; pending guest interrupt state; eight-byte GA_GUEST_NR software notification. Invalid remap/index, running versus non-running guest, lost log notification while pending state survives. §§2.2.5, 2.2.8, 2.7.
AMD command / event / PPR records · 16 B Software produces commands. Hardware produces event and PPR records. INSERT_GUEST_EVENT also needs its next payload slot. Illegal command, fetch failure, timeout, overflow and restart. Logging a page request is not servicing it. §§2.4–6.
Arm STE · 64 B StreamID chooses a stream entry: validity/configuration, bypass/abort/translation choice, CD-table selection and stage-2 controls. Wrong stream mapping or invalid STE; do not report it as an AMD illegal DTE.
Arm CD · 64 B SubstreamID, when used, selects stage-1 context: validity, ASID, table bases and translation controls. Invalid CD, context limits, wrong ASID/context lifetime, stage-1 configuration fault.
Arm translation descriptors Table versus block/page, address, permissions, attributes and access flags; sizes depend on granule, level and extensions. Translation, address-size, access-flag or permission fault; distinguish stage 2 failures during stage-1 metadata fetch.
Arm CMDQ / EVTQ / PRIQ 16 / 32 / 16 B entries. Index plus wrap bit distinguishes full from empty. CMD_SYNC observes required completion. CMDQ command errors and global acknowledgment; EVTQ discarded-record overflow; PRI response and stall-resume are distinct.
Firmware and OS structures AMD IVRS contains IVHD topology/capabilities and IVMD memory constraints. Linux groups/domains and IOMMUFD objects are software structures. Wrong IOMMU association, requester alias or reserved range can invalidate a test before the page-table rule is even reached.

Descriptor validity comes before interpreting dependent fields. “Flip a reserved bit” requires a specific architecture, revision, active format and validity condition. In AMD 3.11, DTE bits 6:4 are conditional CXLMemAttr, not universally reserved.

Detailed AMD entries · Arm formats, granules and queues · GA word decoder

3 / A page boundary is not a DMA-address restriction

A frame base must align to its leaf size. An ordinary request can address any byte inside that frame. In the common 4 KiB-granule examples, a 4 KiB page uses 12 offset bits, 2 MiB uses 21, and 1 GiB uses 30. These are the selected AMD/Arm examples, not all supported architectural sizes.

CHANGE OF SCALE · 4 KiB LEAVES

Zoom into an address

Four 9-bit indices each choose one of 512 entries: 512 GiB, then 1 GiB, 2 MiB and 4 KiB per entry. The last 12 bits pick the byte inside the page. A 2 MiB or 1 GiB leaf stops the walk earlier, as the tool above shows. The ring draws every eighth entry; the highlighted one is exact.

In a nested walk, check the guest and host stages independently. A guest-table pointer can require a host translation before its entry can be read. Denying that metadata mapping is a different test from denying the final data page. The Translation lab shows both stages and preserves bytes completed before a later segment faults.

Permissions accumulate. A writable leaf does not override a read-only parent. Guest R/W=0 denies a write but can still allow a read; AMD host IR and IW are separate controls. Test absence, format, address size and protection separately before combining violations. Multiple simultaneous errors need an allowed-outcome set, not an invented universal priority.

TRY IT · FLIP THE BITS, STAMP THE REQUEST

Simplified: guest P and R/W on four x86-style levels, then the AMD host stage’s separate IR and IW. It starts with a writable leaf under a read-only PDP entry. U/S, NX, ATS and the host walk for the guest tables themselves are left out.

AMD v1 host levels and Arm levels are numbered differently. Arm also supports other granules and optional descriptor extensions. Use the architecture-specific size table rather than sharing one numeric “level” across backends.

ATS trust boundary: ordinary AMD ATS returns an SPA. For ordinary translated DMA, §2.11 explains that the IOMMU checks authorization to issue translated traffic but does not revalidate that SPA against the original mapping. Secure ATS instead returns a GPA and applies the host translation on translated DMA. An ATS-based negative test must identify which mode is active; this site’s mock ATC provenance guard is stricter than that ordinary-hardware path.

4 / Configure, synchronize, then trust the result

Bring-up is part of the test

  1. Discover the responsible IOMMU and requester mapping from firmware topology. Record the device and feature capability profile, address widths and supported table formats.
  2. Allocate and initialize the active device/context/page tables and command/log backing. Check alignment, lengths, memory attributes, visibility and lifetime. Program base/pointer state while the relevant engine is stopped.
  3. Configure logging and its notification path before relying on errors. AMD §2.3 specifies the control sequence; initialize PPR resources before enabling their use. Arm uses its own queue/configuration controls and CR0/CR0ACK handshake.
  4. Attach the correct context, establish mappings and enable supported device-side ATS/PASID/PRI as required by the driver. Do not assume a capability bit alone enables the feature.
  5. Prove a controlled valid transfer before introducing a fault. Keep traffic ownership and teardown rules explicit.

Changing a table is not the end of an update

A mapping update branches into IOMMU and applicable device-cache invalidation, joins at observed completion, and only then permits retry or reuse. Quiesce affected DMA retain old backing Publish mapping change visibility + ordering IOMMU invalidation context / page / IRQ Device ATC invalidation if cached by device Observe completion including device reply Retry / reuse memory verify intended result
  1. Quiesce and publish

    Hold affected DMA, retain old backing, and publish the mapping with required visibility/order.

  2. Invalidate both relevant cache paths

    Invalidate IOMMU context/page/interrupt state as appropriate. Also invalidate the device ATC if it holds translations.

  3. Join at observed completion

    Account for the IOMMU operations and applicable device acknowledgment; a fetched command is insufficient.

  4. Retry or reuse

    Permit the intended operation only after the required completion; verify its data outcome.

The two invalidation branches are conditional on the state changed and caches in use. A completion wait does not supply an omitted invalidation.

Publishing bytes, invalidating a cache, fetching a command and completing its effects are different milestones. Use the correct DTE/configuration, page, interrupt and device-ATC invalidation scope. Test address, PASID, domain and global scopes as applicable; verify unrelated contexts remain unchanged. §2.4.11 and AMD 48882 Chapter 4 explain ordering and implementation freedom.

AMD command and log recovery uses documented Enable/Run and W1C rules. Arm command errors use CMDQ_CONS.ERR and GERROR/GERRORN; acknowledgment matches bit values. Arm event queue space can become usable before overflow acknowledgment. Compare recovery protocols; do not port the register sequence by renaming fields.

On teardown or power/reset transitions, stop new work, account for in-flight transactions, invalidate as required, and retain backing until it cannot be referenced. Include device reset, repeated stop/restart and delayed acknowledgments in platform tests. This is a validation strategy, not an undocumented universal register recipe.

5 / Show that the intended protection path is active

An error is valuable evidence, but its origin matters. A command-buffer fault proves command handling; it does not by itself prove NIC payload traverses the intended translation. A timeout can be upstream blocking. An unchanged canary is inconclusive if no request was sent.

  1. Allowed control: use test-owned pages and a non-identity mapping A → B. Verify the known payload reaches B, while A and an unrelated guard remain unchanged. For a read, verify exactly what data returns to the device.
  2. Denied probe: preserve the requester, context, address, size and access. Revoke the relevant permission/presence, publish and synchronize all applicable caches, then confirm the probe was issued. Observe no bytes from the denied segment.
  3. Correlated evidence: match DeviceID/PASID or StreamID/SSID, access, address/stage and test window. Check the correct event, ATS permission response or stall indication, including logging health.
  4. Recovery control: restore the intended mapping, synchronize and retry the same probe. Validate successful data movement and no collateral writes. Repeat with read/write, leaf boundaries, other contexts and cache states.

Negative tests should run in a controlled validation environment with owned buffers and a recovery path. Do not revoke live production mappings or inject arbitrary physical addresses to establish these controls.

Try the method as a case: a test passed; find out why.

Interactive evidence checker

This checker evaluates observations you select. It does not inspect your machine or generate real DMA. Unknown stays unknown; a logged event never substitutes for the missing baseline, issuance or data check.

Confounders to eliminate

Scroll horizontally to compare every column.

Observation Alternative explanation to rule out Better evidence
No event ATS permission response, SA/SE suppression, stopped/disabled/full log, wrong queue or event window. Check data result and reporting state independently.
No memory changed Bus Master Enable cleared, device idle, descriptor rejected, wrong requester, upstream firewall or unissued request. Confirm issuance and a successful baseline/recovery on the same path.
Traffic still succeeds after revocation Stale device ATC/IOMMU cache, bypass/exclusion, wrong context or the ordinary translated-ATS trust model. Confirm format, routing, request AT type, invalidation scope and completion.
A == B numerically Identity mapping may be active even when translation is enabled. Use a controlled non-identity mapping and distinct target/guard canaries.
Correct fault, wrong traffic Old record, another queue/function/PASID, speculative metadata access or interrupt fault. Correlate identity, address, access, stage and bounded observation window.
One context passes Aliases, peers, another IOMMU unit or a second PASID can take a different path. Test isolation between requesters/contexts and applicable peer routes.
One boundary fault blocks the whole descriptor The model may already have completed earlier valid segments. Assert exact completed length and zero bytes only from the rejected segment.

Run presence, permission and reserved-field injections · Exercise commands, overflow and recovery. The evidence strategy is independent reasoning based on the architecture; it is not a hardware certification test.

6 / Linux: functions configure the path; hardware carries the traffic

The driver establishes a DMA mapping before issuing the device operation. Hardware does not call dma_map_single() for each packet. The returned dma_addr_t is device-facing; it is not a CPU-dereferenceable pointer. Linux DMA mapping guide.

Scroll horizontally to compare every column.

Interface / structure Practical responsibility
dma_set_mask_and_coherent() Declare the device’s addressing capability. Handle the API result for the selected device/platform.
dma_alloc_coherent() / dma_free_coherent() Allocate paired CPU/device handles for coherent DMA storage; obey device ownership and ordering.
dma_map_single() / dma_map_page() / dma_map_sg() Establish streaming mappings; use returned DMA handles and mapped scatter/gather segments.
dma_mapping_error() Detect mapping failure before issuing a descriptor that uses the result.
dma_sync_*_for_cpu() / dma_sync_*_for_device() Apply streaming-buffer ownership/cache synchronization when required. Coherency is not translation invalidation.
dma_unmap_*() Release a mapping with matching parameters after device use is finished.
iommu_domain / iommu_group A domain describes a translation/protection context; a group describes the isolation unit imposed by platform/device topology (IOMMU groups & ACS).
VFIO / IOMMUFD VFIO exposes device access under isolation constraints. IOMMUFD manages userspace I/O address spaces and hardware page-table objects; IOAS and HWPT are not raw DTEs.

The DMA API reference, VFIO guide and IOMMUFD documentation describe their respective contracts. Function signatures and internal call paths vary with kernel revision; pin the kernel used in a validation report.

// Harness pseudocode: these are responsibilities, not Linux API names.
context = discover_and_record_requester_and_capabilities()
baseline = map_owned_buffer_and_verify_nonidentity_DMA(context)
publish_selected_fault(context)
invalidate_required_caches_and_observe_completion(context)
denied = issue_same_probe_and_capture_data_plus_fault_evidence(context)
repair_publish_invalidate_and_observe_completion(context)
recovered = issue_same_probe_and_verify_owned_target(context)
assert_expected_baseline_denial_and_recovery(baseline, denied, recovered)

Keep four reusable layers: request/observation records; an architecture-specific descriptor and command backend; device traffic generation; and assertions. Reuse page arithmetic and test vocabulary. Keep AMD encoders, Arm encoders, ownership protocols and fault decoders separate.

7 / The specification map: what matters and what to test

This reading map covers the major architectural areas in AMD 48882 Chapters 1–5. It prioritizes engineering decisions and test obligations; it does not replace every register bit, optional-feature rule or implementation requirement.

The idea: the specification is a city, and this map groups its districts by the job they do, in the order one request meets them. Select a district to open its notes below.

  1. Set it up before any request

    Firmware and the OS find the IOMMU, build its tables and turn it on.

    Topology and discoveryMMIO capabilities, bases and statusInitialization and table visibilityOS and firmware handoff
  2. A request arrives: who is asking, and is it allowed?

    The IOMMU picks the device’s context, walks its tables and checks permissions.

    Normal, bypass and special request pathsMARC apertures (page-table bypass)Device and process contextsPage formats, large pages and shared tablesAccessed/dirty and privilege protections
  3. Devices that cache translations or ask for pages

    Some devices keep their own copies or ask the OS for help.

    ATS and PCIe device cachesPRI and PPR responsesCXL memory indication
  4. Interrupts

    Device interrupts are checked and steered, including to guests.

    Interrupt remapping and virtual APIC
  5. Software and the IOMMU talk

    Commands go in; evidence comes out in the logs.

    Commands and completionError evidence and reportingEvent/PPR dual buffering (Log A/B) and overflow
  6. Virtual machines and confidential computing

    Guests get their own IOMMU view, and private memory is fenced off.

    Hardware-accelerated vIOMMUSecure ATS and SNP/RMPSEV-TIO
  7. Watch it run

    Counters show what the IOMMU is doing.

    Performance and observability
Topology and discovery Ch. 1; §§2.1, 4.2–5; Ch. 5

Follow requester routing through bridges and IOMMU instances; record aliases, IVHD coverage and IVMD memory constraints. An enabled unit may not be the unit covering the device.

Negative-test focus: Validate selected/excluded ranges, requester aliases, multiple units and firmware claims; distinguish software setup errors from translation faults.

Normal, bypass and special request paths §§2.1.1–5

Memory, interrupts, port I/O and system-management requests have different handling. DTE validity and Mode=0 are not a universal deny policy; exclusion and special controls matter.

Negative-test focus: Use request-class-specific expectations. Exercise allowed and forbidden controls, and verify an unrelated traffic class is not used as evidence for memory protection.

Device and process contexts §§2.2.1–2, 2.2.6, 2.2.9

DeviceID, DomainID and PASID serve different purposes. GIoV applies guest I/O protection to the specified non-PASID traffic; Table 7 says software should assign unique DomainIDs to GIoV devices.

Negative-test focus: Wrong context, missing root, unsupported field, PASID/GLX limits, cross-domain alias and read/write permission tests.

Page formats, large pages and shared tables §§2.2.3–4, 2.2.6–7

Host v1 format differs from guest x86-style paging. Shared CPU/IOMMU tables require compatible formats, permissions, update rules and supported features. Nested metadata accesses also translate.

Negative-test focus: Absence at every level, parent restrictions, invalid descent/skips, canonicality/address width, alignment and cross-boundary partial DMA.

Accessed/dirty and privilege protections §1.3.8; §§2.2.6–7; Table 7

Optional A/D updates and execute/user protections add request attributes and possible writes to metadata. H/W backing failures are distinct from readable but invalid descriptors.

Negative-test focus: Disabled/reserved HA/HD encodings, unsupported capability, A/D update failure and user/execute denial. Reference-only beyond the selected browser cases.

Initialization and table visibility §§2.2.1, 2.3; Ch. 3

Initialize descriptors, allocation/length and pointer state before activating the relevant engines. Descriptor publication and coherency require platform-specific ordering.

Negative-test focus: Uninitialized backing, invalid bases/lengths, enable before setup, update races, repeated stop/start and retained-state reset tests.

Commands and completion §2.4

All ten host command types are available in Faults & recovery. Their cache scope, support and context differ. Consumed Head is not an execution barrier.

Negative-test focus: Opcode/reserved-bit/read abort, unsupported capability, paired-slot wrap, omitted invalidation, timeout and premature reuse.

Error evidence and reporting §§2.5.1–16

Decode the event family before its flags. Suppression, overflow and log-write failure can hide an otherwise real fault. Hardware event registers retain specified failures when logging is unavailable.

Negative-test focus: Single-fault attribution first; combined-fault allowed outcomes; capture HEV/HEO where applicable; verify exact denied bytes and correlation.

Event/PPR dual buffering (Log A/B) and overflow §§2.5.17, 2.6.1–4

A and B banks share engines. Selection, autoswap, early warning and PPR auto-response/Stop markers depend on capability and enable mode.

Negative-test focus: Full versus overflow, unread preservation, wrap, loss accounting, switch state, recovery order and outstanding work. Autoswap/auto-response are reference-only in this chapter; the AMD reference chapter's dual-log model covers them in its own bounded form.

ATS and PCIe device caches §§1.3.4, 2.2.7, 2.4.4, 2.11

ATS obtains permissions/translation; device ATC can outlive a backing PTE edit. Ordinary and secure ATS have different translated-request trust boundaries.

Negative-test focus: I=0, TV=0, wrong request type, stale ATC, missing invalidate response and secure/ordinary mode mismatches. Never treat a timeout as completion.

PRI and PPR responses §§1.3.5, 2.4.7, 2.6

PRI requests software help; PPR stores that request. COMPLETE_PPR_REQUEST sends a response, not data. Software must correlate CompletionTag/work ownership.

Negative-test focus: Unsupported/disabled request, RX=0 versus RX=1 evidence, wrong group, duplicate response, overflow and retry after permissions are actually ready.

Interrupt remapping and virtual APIC §§2.2.5, 2.2.8, 2.3.2, 2.7–8

IRTE policy, APIC pending state and GA log record are separate. Interrupt delivery does not prove the payload’s address translation. Cacheable IRTE edits require appropriate invalidation.

Negative-test focus: Invalid vector/index/format, running guest changes, lost GA notification, pending-state reconciliation and separate guest ISR/EOI.

MMIO capabilities, bases and status Ch. 3

Read capabilities before interpreting optional fields. Base alignment, record size and length encoding differ by family. Run, Enable, notification and overflow have distinct semantics.

Negative-test focus: Reserved/unsupported encodings, pointer ownership, W1C independence, stopped-state writes and correct arithmetic. Use the existing register/GA calculators.

MARC apertures (page-table bypass) §2.9; §3.4.12

Optional MARC apertures relocate DMA from integrated devices to fixed SPA ranges, bypassing the page-table walk (read-only is still enforced); a request outside every aperture falls through to normal translation without an error.

Negative-test focus: Check range boundaries, enabled routing behaviour and overlap/precedence against the target capability profile. Reference-only; no MARC hardware emulator.

Hardware-accelerated vIOMMU §2.10; §§3.5–6

GuestID and private translation/backing support virtual command, event and PPR facilities. Guest queue bases may require translation according to GstBufferTRPMode.

Negative-test focus: Guest/private backing faults, wrong address domain, host-versus-guest command restrictions, reset/reconfiguration and guest/host PPR destination.

Secure ATS and SNP/RMP §§2.11–12

RMP ownership checks add protection beyond PTE permission. SNP locks specified registers, repurposes exclusion registers for completion stores and constrains valid device/mode/sATS combinations.

Negative-test focus: RMP protection versus RMP access failure, invalid completion-store target, forbidden V=0 and capability-dependent Mode=0/sATS settings. No full SNP emulator is claimed here; Secure DMA and the later security chapters run narrower, bounded RMP models.

CXL memory indication §2.13; Table 79

Conditional DTE CXLMemAttr influences the CXL I/O indication in ATS completions. Capability, enable, I, CXL source and sATS combinations matter.

Negative-test focus: Fields set without prerequisites, reserved combinations and disallowed secure-ATS/CXL.cache cases. Data-path emulation is reference-only.

SEV-TIO §2.14

TDISP interfaces can operate with trusted guests using ASP-managed secure state alongside the non-secure DTE. Secure MMIO has 4 KiB RMP coverage; device interrupts still reach the hypervisor for guest injection.

Negative-test focus: Non-secure edits to reserved secure fields, forbidden Mode=0, wrong PRI XT/T encodings, missing secure guest PPR backing and fenced-guest access. Requires firmware/platform support.

Performance and observability §1.3.3; §3.4.22; Ch. 4

Caches, prefetch and large mappings reduce walk cost but do not establish correctness. Implementations need not expose a walk for every request; counters require the correct bank, selector and scope.

Negative-test focus: Cold/warm translation, invalidation storms, boundaries and counter rollover. Compare counts with controlled traffic; do not use one counter as proof of universal traversal.

OS and firmware handoff §§4.4–5; Ch. 5

Firmware descriptions, ownership changes and driver mappings must agree. Legacy bus details and chipset-specific ordering remain platform constraints.

Negative-test focus: Malformed/incomplete discovery data, reserved-memory mappings, bus aliases, device reassignment and teardown/restart. The static website does not perform these hardware operations.

Open the detailed error-scenario checklist. Each case states whether it is executable, a synthetic injected failure or a platform/reference follow-up.

8 / Revision 3.11 changes the validation assumptions

This guide follows 48882-PUB rev 3.11, April 2026. These changes from rev 3.10 affect tests:

Scroll horizontally to compare every column.

Change Why a test or decoder must care
DTE CXLMemAttr [6:4] These fields were reserved in the earlier format. Nonzero values require I=1, CXLMemAttrSup and CXLMemAttrEn; SEV-TIO adds its own non-secure-DTE restriction. A blanket old reserved-bit test is wrong.
Secure ATS / GIoV Read the specific SnpPageMode0Sup exception alongside Table 7’s broad SATS text. Table 7 says software should give GIoV devices unique DomainIDs. Feature conditions determine the expected error.
IRTE non-cached fields GALogIntr and GAPPIDis join the stated non-cached controls. Do not demand cache invalidation merely from an outdated cacheability list; preserve required atomic update rules.
RESET_VMMIO Reprogram appropriate Guest VF Control registers before resuming. Faults & recovery retains a “reconfiguration required” state.
Fault formats DTE fetch adds secure-state evidence; enhanced INVALID_DEVICE_REQUEST uses Type[3]; RMP page/hardware formats change. Legacy decoder assumptions can erase the reason or context.
Virtual PPR / guest commands vIMUEn selects guest versus host logging for guest PRI in the specified vIOMMU case. §2.10.7 lists five guest commands; the ten-command host menu is not a guest support guarantee.
CXL / SEV-TIO / discovery New §§2.13–14, feature/control bits, CXLDevice discovery fields and revised counter inputs require capability-aware test selection.

The five listed guest commands are COMPLETION_WAIT, INVALIDATE_DEVTAB_ENTRY, INVALIDATE_IOMMU_PAGES, INVALIDATE_IOTLB_PAGES and COMPLETE_PPR_REQUEST. Do not issue host-only INSERT_GUEST_EVENT or RESET_VMMIO from a guest command buffer.

Decode EVENT_COUNTER_ZERO with its event-specific Figure 66 / Table 68 format, 1010b (0xA), and use §§2.5.12–15 for subsequent records. Similarly, apply the feature-specific sATS rules rather than a broad unconditional reading of Table 7.

Sources and scope

The diagrams and explanations are independently authored. Interactive calculations and evidence assessment run locally in the browser. They do not probe a real device, reproduce silicon timing or certify whole-spec conformance. Optional architecture topics are clearly separated from the working AMD teaching subset.