Re: [PATCH 1/2] dma-direct: Validate DMA mask against canonical DMA addresses
From: Robin Murphy
Date: Tue Jan 20 2026 - 06:59:44 EST
On 2026-01-20 9:59 am, Suzuki K Poulose wrote:
On 20/01/2026 06:42, Aneesh Kumar K.V (Arm) wrote:
On systems that apply an address encryption tag or mask to DMA addresses,
DMA mask validation must be performed against the canonical DMA address.
Using a non-canonical (e.g. encrypted or unencrypted) DMA address
can incorrectly fail capability checks, since architecture-specific
encryption bits are not part of the device’s actual DMA addressing
capability. For example, arm64 adds PROT_NS_SHARED to unencrypted DMA
addresses.
Fix this by validating device DMA masks against __phys_to_dma(), ensuring
that the architecture encryption mask does not influence the check.
Fixes: b66e2ee7b6c8 ("dma: Introduce generic dma_addr_*crypted helpers")
Signed-off-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@xxxxxxxxxx>
---
kernel/dma/direct.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c
index 8e04f72baaa3..a5639e9415f5 100644
--- a/kernel/dma/direct.c
+++ b/kernel/dma/direct.c
@@ -580,12 +580,12 @@ int dma_direct_supported(struct device *dev, u64 mask)
/*
* This check needs to be against the actual bit mask value, so use
- * phys_to_dma_unencrypted() here so that the SME encryption mask isn't
+ * __phys_to_dma() here so that the arch specific encryption mask isn't
* part of the check.
*/
if (IS_ENABLED(CONFIG_ZONE_DMA))
min_mask = min_t(u64, min_mask, zone_dma_limit);
- return mask >= phys_to_dma_unencrypted(dev, min_mask);
+ return mask >= __phys_to_dma(dev, min_mask);
This is wrong, isn't it ? For e.g., for CCA, even though the "Flag" is
added to the PA, it is really part of the actual "PA" and thus must be
checked against the full PA ?
Yes, it's much the same as for AMD SEV (albeit the other way round) - the encryption/decryption bit is part of the DMA address because it needs to be driven by the device, so it is crucial that the device's DMA mask is capable of expressing that.
Hence, as I think we've discussed before, for CCA we can't really support 32-bit devices doing DMA to shared pages at all, unless the whole VM is limited to a 31-bit IPA space.
Thanks,
Robin.
Suzuki
}
static const struct bus_dma_region *dma_find_range(struct device *dev,