arm64: fix erroneous __raw_read_system_reg() cases
authorMark Rutland <mark.rutland@arm.com>
Thu, 2 Feb 2017 17:32:14 +0000 (17:32 +0000)
committerWill Deacon <will.deacon@arm.com>
Thu, 2 Feb 2017 18:34:38 +0000 (18:34 +0000)
Since it was introduced in commit da8d02d19ffdd201 ("arm64/capabilities:
Make use of system wide safe value"), __raw_read_system_reg() has
erroneously mapped some sysreg IDs to other registers.

For the fields in ID_ISAR5_EL1, our local feature detection will be
erroneous. We may spuriously detect that a feature is uniformly
supported, or may fail to detect when it actually is, meaning some
compat hwcaps may be erroneous (or not enforced upon hotplug).

This patch corrects the erroneous entries.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Fixes: da8d02d19ffdd201 ("arm64/capabilities: Make use of system wide safe value")
Reported-by: Catalin Marinas <catalin.marinas@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: stable@vger.kernel.org
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/kernel/cpufeature.c

index ed675061dda0b978a26d062f5fcaca44415fc9c9..0688b9a3adeb04a1dd4a97947525dd48eacf6448 100644 (file)
@@ -664,15 +664,15 @@ static u64 __raw_read_system_reg(u32 sys_id)
        case SYS_ID_ISAR2_EL1:          return read_cpuid(ID_ISAR2_EL1);
        case SYS_ID_ISAR3_EL1:          return read_cpuid(ID_ISAR3_EL1);
        case SYS_ID_ISAR4_EL1:          return read_cpuid(ID_ISAR4_EL1);
-       case SYS_ID_ISAR5_EL1:          return read_cpuid(ID_ISAR4_EL1);
+       case SYS_ID_ISAR5_EL1:          return read_cpuid(ID_ISAR5_EL1);
        case SYS_MVFR0_EL1:             return read_cpuid(MVFR0_EL1);
        case SYS_MVFR1_EL1:             return read_cpuid(MVFR1_EL1);
        case SYS_MVFR2_EL1:             return read_cpuid(MVFR2_EL1);
 
        case SYS_ID_AA64PFR0_EL1:       return read_cpuid(ID_AA64PFR0_EL1);
-       case SYS_ID_AA64PFR1_EL1:       return read_cpuid(ID_AA64PFR0_EL1);
+       case SYS_ID_AA64PFR1_EL1:       return read_cpuid(ID_AA64PFR1_EL1);
        case SYS_ID_AA64DFR0_EL1:       return read_cpuid(ID_AA64DFR0_EL1);
-       case SYS_ID_AA64DFR1_EL1:       return read_cpuid(ID_AA64DFR0_EL1);
+       case SYS_ID_AA64DFR1_EL1:       return read_cpuid(ID_AA64DFR1_EL1);
        case SYS_ID_AA64MMFR0_EL1:      return read_cpuid(ID_AA64MMFR0_EL1);
        case SYS_ID_AA64MMFR1_EL1:      return read_cpuid(ID_AA64MMFR1_EL1);
        case SYS_ID_AA64MMFR2_EL1:      return read_cpuid(ID_AA64MMFR2_EL1);