• Daniel Mentz's avatar
    iommu/arm-smmu-v3: Fix last_sid_idx calculation for sid_bits==32 · f63237f5
    Daniel Mentz authored
    The function arm_smmu_init_strtab_2lvl uses the expression
    
    ((1 << smmu->sid_bits) - 1)
    
    to calculate the largest StreamID value. However, this fails for the
    maximum allowed value of SMMU_IDR1.SIDSIZE which is 32. The C standard
    states:
    
    "If the value of the right operand is negative or is greater than or
    equal to the width of the promoted left operand, the behavior is
    undefined."
    
    With smmu->sid_bits being 32, the prerequisites for undefined behavior
    are met.  We observed that the value of (1 << 32) is 1 and not 0 as we
    initially expected.
    
    Similar bit shift operations in arm_smmu_init_strtab_linear seem to not
    be affected, because it appears to be unlikely for an SMMU to have
    SMMU_IDR1.SIDSIZE set to 32 but then not support 2-level Stream tables
    
    This issue was found by Ryan Huang <tzukui@google.com> on our team.
    
    Fixes: ce410410 ("iommu/arm-smmu-v3: Add arm_smmu_strtab_l1/2_idx()")
    Signed-off-by: default avatarDaniel Mentz <danielmentz@google.com>
    Link: https://lore.kernel.org/r/20241002015357.1766934-1-danielmentz@google.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    f63237f5
arm-smmu-v3.c 129 KB