iommu/arm-smmu-v3: Avoid memory corruption from Hisilicon MSI payloads
authorZhen Lei <thunder.leizhen@huawei.com>
Wed, 31 Oct 2018 04:02:07 +0000 (12:02 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Feb 2019 18:47:07 +0000 (19:47 +0100)
commit00b0fbb8f0e39e3fe05525316bdc73fe9c729146
tree5feaecb17ce6e803fb0ea843b7ce98cb7d916d87
parentb59d70c07ab77149082aa80c9d56c30950e28d36
iommu/arm-smmu-v3: Avoid memory corruption from Hisilicon MSI payloads

[ Upstream commit 84a9a75774961612d0c7dd34a1777e8f98a65abd ]

The GITS_TRANSLATER MMIO doorbell register in the ITS hardware is
architected to be 4 bytes in size, yet on hi1620 and earlier, Hisilicon
have allocated the adjacent 4 bytes to carry some IMPDEF sideband
information which results in an 8-byte MSI payload being delivered when
signalling an interrupt:

MSIAddr:
 |----4bytes----|----4bytes----|
 |    MSIData   |    IMPDEF    |

This poses no problem for the ITS hardware because the adjacent 4 bytes
are reserved in the memory map. However, when delivering MSIs to memory,
as we do in the SMMUv3 driver for signalling the completion of a SYNC
command, the extended payload will corrupt the 4 bytes adjacent to the
"sync_count" member in struct arm_smmu_device. Fortunately, the current
layout allocates these bytes to padding, but this is fragile and we
should make this explicit.

Reviewed-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com>
[will: Rewrote commit message and comment]
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iommu/arm-smmu-v3.c