• R
    iommu/arm-smmu: Avoid constant zero in TLBI writes · 4e4abae3
    Robin Murphy 提交于
    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: NAngeloGioacchino Del Regno <kholk11@gmail.com>
    Tested-by: NMarc Gonzalez <marc.w.gonzalez@free.fr>
    Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: NMarc Gonzalez <marc.w.gonzalez@free.fr>
    Acked-by: NWill Deacon <will.deacon@arm.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: NJoerg Roedel <jroedel@suse.de>
    4e4abae3
arm-smmu.c 64.8 KB