@@ -439,22 +439,26 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
439
439
init_cpu_ftr_reg (SYS_ID_AA64MMFR2_EL1 , info -> reg_id_aa64mmfr2 );
440
440
init_cpu_ftr_reg (SYS_ID_AA64PFR0_EL1 , info -> reg_id_aa64pfr0 );
441
441
init_cpu_ftr_reg (SYS_ID_AA64PFR1_EL1 , info -> reg_id_aa64pfr1 );
442
- init_cpu_ftr_reg (SYS_ID_DFR0_EL1 , info -> reg_id_dfr0 );
443
- init_cpu_ftr_reg (SYS_ID_ISAR0_EL1 , info -> reg_id_isar0 );
444
- init_cpu_ftr_reg (SYS_ID_ISAR1_EL1 , info -> reg_id_isar1 );
445
- init_cpu_ftr_reg (SYS_ID_ISAR2_EL1 , info -> reg_id_isar2 );
446
- init_cpu_ftr_reg (SYS_ID_ISAR3_EL1 , info -> reg_id_isar3 );
447
- init_cpu_ftr_reg (SYS_ID_ISAR4_EL1 , info -> reg_id_isar4 );
448
- init_cpu_ftr_reg (SYS_ID_ISAR5_EL1 , info -> reg_id_isar5 );
449
- init_cpu_ftr_reg (SYS_ID_MMFR0_EL1 , info -> reg_id_mmfr0 );
450
- init_cpu_ftr_reg (SYS_ID_MMFR1_EL1 , info -> reg_id_mmfr1 );
451
- init_cpu_ftr_reg (SYS_ID_MMFR2_EL1 , info -> reg_id_mmfr2 );
452
- init_cpu_ftr_reg (SYS_ID_MMFR3_EL1 , info -> reg_id_mmfr3 );
453
- init_cpu_ftr_reg (SYS_ID_PFR0_EL1 , info -> reg_id_pfr0 );
454
- init_cpu_ftr_reg (SYS_ID_PFR1_EL1 , info -> reg_id_pfr1 );
455
- init_cpu_ftr_reg (SYS_MVFR0_EL1 , info -> reg_mvfr0 );
456
- init_cpu_ftr_reg (SYS_MVFR1_EL1 , info -> reg_mvfr1 );
457
- init_cpu_ftr_reg (SYS_MVFR2_EL1 , info -> reg_mvfr2 );
442
+
443
+ if (id_aa64pfr0_32bit_el0 (info -> reg_id_aa64pfr0 )) {
444
+ init_cpu_ftr_reg (SYS_ID_DFR0_EL1 , info -> reg_id_dfr0 );
445
+ init_cpu_ftr_reg (SYS_ID_ISAR0_EL1 , info -> reg_id_isar0 );
446
+ init_cpu_ftr_reg (SYS_ID_ISAR1_EL1 , info -> reg_id_isar1 );
447
+ init_cpu_ftr_reg (SYS_ID_ISAR2_EL1 , info -> reg_id_isar2 );
448
+ init_cpu_ftr_reg (SYS_ID_ISAR3_EL1 , info -> reg_id_isar3 );
449
+ init_cpu_ftr_reg (SYS_ID_ISAR4_EL1 , info -> reg_id_isar4 );
450
+ init_cpu_ftr_reg (SYS_ID_ISAR5_EL1 , info -> reg_id_isar5 );
451
+ init_cpu_ftr_reg (SYS_ID_MMFR0_EL1 , info -> reg_id_mmfr0 );
452
+ init_cpu_ftr_reg (SYS_ID_MMFR1_EL1 , info -> reg_id_mmfr1 );
453
+ init_cpu_ftr_reg (SYS_ID_MMFR2_EL1 , info -> reg_id_mmfr2 );
454
+ init_cpu_ftr_reg (SYS_ID_MMFR3_EL1 , info -> reg_id_mmfr3 );
455
+ init_cpu_ftr_reg (SYS_ID_PFR0_EL1 , info -> reg_id_pfr0 );
456
+ init_cpu_ftr_reg (SYS_ID_PFR1_EL1 , info -> reg_id_pfr1 );
457
+ init_cpu_ftr_reg (SYS_MVFR0_EL1 , info -> reg_mvfr0 );
458
+ init_cpu_ftr_reg (SYS_MVFR1_EL1 , info -> reg_mvfr1 );
459
+ init_cpu_ftr_reg (SYS_MVFR2_EL1 , info -> reg_mvfr2 );
460
+ }
461
+
458
462
}
459
463
460
464
static void update_cpu_ftr_reg (struct arm64_ftr_reg * reg , u64 new )
@@ -559,47 +563,51 @@ void update_cpu_features(int cpu,
559
563
info -> reg_id_aa64pfr1 , boot -> reg_id_aa64pfr1 );
560
564
561
565
/*
562
- * If we have AArch32, we care about 32-bit features for compat. These
563
- * registers should be RES0 otherwise .
566
+ * If we have AArch32, we care about 32-bit features for compat.
567
+ * If the system doesn't support AArch32, don't update them .
564
568
*/
565
- taint |= check_update_ftr_reg (SYS_ID_DFR0_EL1 , cpu ,
569
+ if (id_aa64pfr0_32bit_el0 (read_system_reg (SYS_ID_AA64PFR0_EL1 )) &&
570
+ id_aa64pfr0_32bit_el0 (info -> reg_id_aa64pfr0 )) {
571
+
572
+ taint |= check_update_ftr_reg (SYS_ID_DFR0_EL1 , cpu ,
566
573
info -> reg_id_dfr0 , boot -> reg_id_dfr0 );
567
- taint |= check_update_ftr_reg (SYS_ID_ISAR0_EL1 , cpu ,
574
+ taint |= check_update_ftr_reg (SYS_ID_ISAR0_EL1 , cpu ,
568
575
info -> reg_id_isar0 , boot -> reg_id_isar0 );
569
- taint |= check_update_ftr_reg (SYS_ID_ISAR1_EL1 , cpu ,
576
+ taint |= check_update_ftr_reg (SYS_ID_ISAR1_EL1 , cpu ,
570
577
info -> reg_id_isar1 , boot -> reg_id_isar1 );
571
- taint |= check_update_ftr_reg (SYS_ID_ISAR2_EL1 , cpu ,
578
+ taint |= check_update_ftr_reg (SYS_ID_ISAR2_EL1 , cpu ,
572
579
info -> reg_id_isar2 , boot -> reg_id_isar2 );
573
- taint |= check_update_ftr_reg (SYS_ID_ISAR3_EL1 , cpu ,
580
+ taint |= check_update_ftr_reg (SYS_ID_ISAR3_EL1 , cpu ,
574
581
info -> reg_id_isar3 , boot -> reg_id_isar3 );
575
- taint |= check_update_ftr_reg (SYS_ID_ISAR4_EL1 , cpu ,
582
+ taint |= check_update_ftr_reg (SYS_ID_ISAR4_EL1 , cpu ,
576
583
info -> reg_id_isar4 , boot -> reg_id_isar4 );
577
- taint |= check_update_ftr_reg (SYS_ID_ISAR5_EL1 , cpu ,
584
+ taint |= check_update_ftr_reg (SYS_ID_ISAR5_EL1 , cpu ,
578
585
info -> reg_id_isar5 , boot -> reg_id_isar5 );
579
586
580
- /*
581
- * Regardless of the value of the AuxReg field, the AIFSR, ADFSR, and
582
- * ACTLR formats could differ across CPUs and therefore would have to
583
- * be trapped for virtualization anyway.
584
- */
585
- taint |= check_update_ftr_reg (SYS_ID_MMFR0_EL1 , cpu ,
587
+ /*
588
+ * Regardless of the value of the AuxReg field, the AIFSR, ADFSR, and
589
+ * ACTLR formats could differ across CPUs and therefore would have to
590
+ * be trapped for virtualization anyway.
591
+ */
592
+ taint |= check_update_ftr_reg (SYS_ID_MMFR0_EL1 , cpu ,
586
593
info -> reg_id_mmfr0 , boot -> reg_id_mmfr0 );
587
- taint |= check_update_ftr_reg (SYS_ID_MMFR1_EL1 , cpu ,
594
+ taint |= check_update_ftr_reg (SYS_ID_MMFR1_EL1 , cpu ,
588
595
info -> reg_id_mmfr1 , boot -> reg_id_mmfr1 );
589
- taint |= check_update_ftr_reg (SYS_ID_MMFR2_EL1 , cpu ,
596
+ taint |= check_update_ftr_reg (SYS_ID_MMFR2_EL1 , cpu ,
590
597
info -> reg_id_mmfr2 , boot -> reg_id_mmfr2 );
591
- taint |= check_update_ftr_reg (SYS_ID_MMFR3_EL1 , cpu ,
598
+ taint |= check_update_ftr_reg (SYS_ID_MMFR3_EL1 , cpu ,
592
599
info -> reg_id_mmfr3 , boot -> reg_id_mmfr3 );
593
- taint |= check_update_ftr_reg (SYS_ID_PFR0_EL1 , cpu ,
600
+ taint |= check_update_ftr_reg (SYS_ID_PFR0_EL1 , cpu ,
594
601
info -> reg_id_pfr0 , boot -> reg_id_pfr0 );
595
- taint |= check_update_ftr_reg (SYS_ID_PFR1_EL1 , cpu ,
602
+ taint |= check_update_ftr_reg (SYS_ID_PFR1_EL1 , cpu ,
596
603
info -> reg_id_pfr1 , boot -> reg_id_pfr1 );
597
- taint |= check_update_ftr_reg (SYS_MVFR0_EL1 , cpu ,
604
+ taint |= check_update_ftr_reg (SYS_MVFR0_EL1 , cpu ,
598
605
info -> reg_mvfr0 , boot -> reg_mvfr0 );
599
- taint |= check_update_ftr_reg (SYS_MVFR1_EL1 , cpu ,
606
+ taint |= check_update_ftr_reg (SYS_MVFR1_EL1 , cpu ,
600
607
info -> reg_mvfr1 , boot -> reg_mvfr1 );
601
- taint |= check_update_ftr_reg (SYS_MVFR2_EL1 , cpu ,
608
+ taint |= check_update_ftr_reg (SYS_MVFR2_EL1 , cpu ,
602
609
info -> reg_mvfr2 , boot -> reg_mvfr2 );
610
+ }
603
611
604
612
/*
605
613
* Mismatched CPU features are a recipe for disaster. Don't even
0 commit comments