Who does what
| Part | Its job here |
|---|---|
| SPDM | The device proves its identity and reports its firmware measurements. |
| IDE | Encrypts and protects the PCIe traffic between the device and the root port. |
| TDISP | Locks the interface's configuration and moves it to RUN or ERROR. |
| AMD-SP (as TSM) | Binds the TDI to a guest, writes the secure DTE, keeps the fence (48882 §2.5.9.1; details in SEV-TIO 58271). |
| The guest | Decides whether to trust the evidence, grants private DMA, validates MMIO. |
| IOMMU and RMP | Check every request against both DTEs, the page's owner and the TDI's VMPL. |
The VM's memory key never goes to the device: its accesses are checked by the IOMMU and the RMP like everyone else's, and the link has its own keys (E33).
An interface's life
- Authenticate (SPDM) and protect the link (IDE).
- Bind: the host asks the AMD-SP (
TIO_TDI_BIND); the interface locks its configuration. - Accept: the guest reads the interface's report and measurements and compares them with its own policy.
- Start: the interface enters RUN.
- Grant: the guest asks the AMD-SP to write the secure DTE (
TIO_MSG_SDTE_WRITE_REQ), with the VMPL the device's accesses use. Private MMIO is validated separately (TIO_MSG_MMIO_VALIDATE_REQ). - Leave: stop, revoke, unbind; a new owner starts again from step 2.
Evidence beneath accept
"Accept" is a decision made on four artifacts. Each is checked against something A already holds, and each can be present and right, present and wrong, or missing. Only all four right accept; wrong is refused, and missing stays unknown, which is not a yes. The experiment "Look at the evidence before accepting" replays this.
| Artifact | A compares it with | Present but wrong | Missing |
|---|---|---|---|
| Certificate chain (SPDM GET_CERTIFICATE) | A's own trust anchor | refused: an unknown issuer | unknown |
| Challenge answer (CHALLENGE_AUTH) | the chain just shown, with a signature that covers the nonce A sent in CHALLENGE | refused, even if the signature is valid for its own older challenge | unknown |
| Measurements (MEASUREMENTS) | the same nonce, and A's list of firmware versions | refused: stale, unsigned or unlisted firmware | unknown |
| Interface report (TDISP) | the TDI A was told it is getting, and its locked state | refused: another interface, or still unlocked | unknown |
Counterexample. A challenge answer with a valid signature over an old nonce is still refused: it proves the device once signed something, not that it is the one answering now. The host having already run SPDM and bound the interface does not change A's own check.
Question. A has chain, measurements and report, but no challenge answer. Which of accept, start and grant can happen, and which artifact would you ask for first?
The profile is SPDM 1.2.1 message shapes. AMD's SEV-TIO 0.92 is described as referencing SPDM 1.2.1, so a newer SPDM publication alone does not change this model. The AMD document could not be fetched while this was written, so that reference is not checked against it here.
What changes in the IOMMU (§2.14)
- Security-sensitive fields (DomainID, sATS, GCR3, GLX and others) move from the ordinary DTE to a secure structure the AMD-SP owns; the IOMMU uses both for each request.
- The AMD-SP chooses ordinary or secure ATS for the device, so an ATS reply is an SPA or a GPA; Mode=0 is not allowed for a TDI.
- Secure MMIO lets the guest reach private memory on the device, in 4 KiB pages only.
- Page requests with a GVA go to a secure vIOMMU PPR buffer the guest provides; wrong XT/T bits give INVALID_PPR_REQUEST.
- Interrupts, T=1 or T=0, are delivered to the hypervisor, which injects them.
The support bits are 0030h[VMGuardIOSup] and 01A0h[SevSnpIoSup]; 01A0h[XteeSup] says which request types can carry the TEE bit, and 01A0h[SmeTioSupDis]=1 means SME cannot be used with SEV-TIO (the bit's sense is negative).
Trusted DMA saves a copy, not all the work
| 16-byte receive | The device writes | CPU copies |
|---|---|---|
| Ordinary device, shared bounce buffer | B | 48 bytes (map, sync, unmap) |
| Granted TDI, direct | O | 0 bounce bytes; the guest still checks the message |
| Granted TDI that still needs a bounce pool | an encrypted bounce buffer | some copies remain |
The counts come from the Linux DMA lab; they are not a speed measurement. A trusted device is trusted with plaintext, not with the correctness of what it sends (W22).
Sources
- AMD I/O Virtualization Technology (IOMMU) Specification 48882, revision 3.11, April 2026: §2.14, EFR (VMGuardIOSup), EFR2 (SevSnpIoSup, XteeSup, SmeTioSupDis).
- AMD SEV-TIO Firmware Interface Specification 58271, revision 0.92 (a technical preview; public, amd.com/en/developer/sev.html); message names cross-checked with OpenVMM's sev_guest_device_tio, which lays out revision 0.91's tables.
- PCI-SIG, TEE Device Interface Security Protocol (TDISP) and Integrity and Data Encryption (IDE): interface states and link protection (not reviewed; edition unknown).
- DMTF DSP0274, Security Protocol and Data Model (SPDM) Specification 1.2.1: CHALLENGE and CHALLENGE_AUTH (requester nonce, CertChainHash), GET_MEASUREMENTS and MEASUREMENTS, and the replay note on nonces; used for "Evidence beneath accept".
- The author's own study notes on confidential computing, written from AMD's public documents (not published), examples E25 to E33 and W21, W22, W29, W30.