• Robin Murphy's avatar
    iommu/arm-smmu: Avoid constant zero in TLBI writes · 4e4abae3
    Robin Murphy authored
    Apparently, some Qualcomm arm64 platforms which appear to expose their
    SMMU global register space are still, in fact, using a hypervisor to
    mediate it by trapping and emulating register accesses. Sadly, some
    deployed versions of said trapping code have bugs wherein they go
    horribly wrong for stores using r31 (i.e. XZR/WZR) as the source
    register.
    
    While this can be mitigated for GCC today by tweaking the constraints
    for the implementation of writel_relaxed(), to avoid any potential
    arms race with future compilers more aggressively optimising register
    allocation, the simple way is to just remove all the problematic
    constant zeros. For the write-only TLB operations, the actual value is
    irrelevant anyway and any old nearby variable will provide a suitable
    GPR to encode. The one point at which we really do need a zero to clear
    a context bank happens before any of the TLB maintenance where crashes
    have been reported, so is apparently not a problem... :/
    Reported-by: default avatarAngeloGioacchino Del Regno <kholk11@gmail.com>
    Tested-by: default avatarMarc Gonzalez <marc.w.gonzalez@free.fr>
    Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarMarc Gonzalez <marc.w.gonzalez@free.fr>
    Acked-by: default avatarWill Deacon <will.deacon@arm.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    4e4abae3
arm-smmu.c 64.8 KB