diff --git a/common/feat_detect.c b/common/feat_detect.c index ef03685fa..09088c93d 100644 --- a/common/feat_detect.c +++ b/common/feat_detect.c @@ -70,34 +70,185 @@ static void read_feat_pauth(void) #endif } -/**************************************************** - * Feature : FEAT_BTI (Branch Target Identification) - ***************************************************/ -static void read_feat_bti(void) +static unsigned int read_feat_rng_trap_id_field(void) { -#if (ENABLE_BTI == FEAT_STATE_ALWAYS) - feat_detect_panic(is_feat_bti_present(), "BTI"); -#endif + return ISOLATE_FIELD(read_id_aa64pfr1_el1(), ID_AA64PFR1_EL1_RNDR_TRAP_SHIFT, + ID_AA64PFR1_EL1_RNDR_TRAP_MASK); } -/************************************************** - * Feature : FEAT_RME (Realm Management Extension) - *************************************************/ -static void read_feat_rme(void) +static unsigned int read_feat_bti_id_field(void) { -#if (ENABLE_RME == FEAT_STATE_ALWAYS) - feat_detect_panic(is_feat_rme_present(), "RME"); -#endif + return ISOLATE_FIELD(read_id_aa64pfr1_el1(), ID_AA64PFR1_EL1_BT_SHIFT, + ID_AA64PFR1_EL1_BT_MASK); } -/****************************************************************** - * Feature : FEAT_RNG_TRAP (Trapping support for RNDR/RNDRRS) - *****************************************************************/ -static void read_feat_rng_trap(void) +static unsigned int read_feat_sb_id_field(void) { -#if (ENABLE_FEAT_RNG_TRAP == FEAT_STATE_ALWAYS) - feat_detect_panic(is_feat_rng_trap_present(), "RNG_TRAP"); -#endif + return ISOLATE_FIELD(read_id_aa64isar1_el1(), ID_AA64ISAR1_SB_SHIFT, + ID_AA64ISAR1_SB_MASK); +} + +static unsigned int read_feat_csv2_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_CSV2_SHIFT, + ID_AA64PFR0_CSV2_MASK); +} + +static unsigned int read_feat_pmuv3_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_PMUVER_SHIFT, + ID_AA64DFR0_PMUVER_MASK); +} + +static unsigned int read_feat_vhe_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_VHE_SHIFT, + ID_AA64MMFR1_EL1_VHE_MASK); +} + +static unsigned int read_feat_sve_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_SVE_SHIFT, + ID_AA64PFR0_SVE_MASK); +} + +static unsigned int read_feat_ras_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_RAS_SHIFT, + ID_AA64PFR0_RAS_MASK); +} + +static unsigned int read_feat_dit_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_DIT_SHIFT, + ID_AA64PFR0_DIT_MASK); +} + +static unsigned int read_feat_amu_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_AMU_SHIFT, + ID_AA64PFR0_AMU_MASK); +} + +static unsigned int read_feat_mpam_version(void) +{ + return (unsigned int)((((read_id_aa64pfr0_el1() >> + ID_AA64PFR0_MPAM_SHIFT) & ID_AA64PFR0_MPAM_MASK) << 4) | + ((read_id_aa64pfr1_el1() >> + ID_AA64PFR1_MPAM_FRAC_SHIFT) & ID_AA64PFR1_MPAM_FRAC_MASK)); +} + +static unsigned int read_feat_nv_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr2_el1(), ID_AA64MMFR2_EL1_NV_SHIFT, + ID_AA64MMFR2_EL1_NV_MASK); +} + +static unsigned int read_feat_sel2_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_SEL2_SHIFT, + ID_AA64PFR0_SEL2_MASK); +} + +static unsigned int read_feat_trf_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEFILT_SHIFT, + ID_AA64DFR0_TRACEFILT_MASK); +} +static unsigned int get_armv8_5_mte_support(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr1_el1(), ID_AA64PFR1_EL1_MTE_SHIFT, + ID_AA64PFR1_EL1_MTE_MASK); +} +static unsigned int read_feat_rng_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64isar0_el1(), ID_AA64ISAR0_RNDR_SHIFT, + ID_AA64ISAR0_RNDR_MASK); +} +static unsigned int read_feat_fgt_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr0_el1(), ID_AA64MMFR0_EL1_FGT_SHIFT, + ID_AA64MMFR0_EL1_FGT_MASK); +} +static unsigned int read_feat_ecv_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr0_el1(), ID_AA64MMFR0_EL1_ECV_SHIFT, + ID_AA64MMFR0_EL1_ECV_MASK); +} +static unsigned int read_feat_twed_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_TWED_SHIFT, + ID_AA64MMFR1_EL1_TWED_MASK); +} + +static unsigned int read_feat_hcx_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_HCX_SHIFT, + ID_AA64MMFR1_EL1_HCX_MASK); +} +static unsigned int read_feat_tcr2_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_TCRX_SHIFT, + ID_AA64MMFR3_EL1_TCRX_MASK); +} +static unsigned int read_feat_s2pie_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S2PIE_SHIFT, + ID_AA64MMFR3_EL1_S2PIE_MASK); +} +static unsigned int read_feat_s1pie_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S1PIE_SHIFT, + ID_AA64MMFR3_EL1_S1PIE_MASK); +} +static unsigned int read_feat_s2poe_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S2POE_SHIFT, + ID_AA64MMFR3_EL1_S2POE_MASK); +} +static unsigned int read_feat_s1poe_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr3_el1(), ID_AA64MMFR3_EL1_S1POE_SHIFT, + ID_AA64MMFR3_EL1_S1POE_MASK); +} +static unsigned int read_feat_brbe_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_BRBE_SHIFT, + ID_AA64DFR0_BRBE_MASK); +} +static unsigned int read_feat_trbe_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_TRACEBUFFER_SHIFT, + ID_AA64DFR0_TRACEBUFFER_MASK); +} +static unsigned int read_feat_sme_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr1_el1(), ID_AA64PFR1_EL1_SME_SHIFT, + ID_AA64PFR1_EL1_SME_MASK); +} +static unsigned int read_feat_gcs_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr1_el1(), ID_AA64PFR1_EL1_GCS_SHIFT, + ID_AA64PFR1_EL1_GCS_MASK); +} + +static unsigned int read_feat_rme_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64pfr0_el1(), ID_AA64PFR0_FEAT_RME_SHIFT, + ID_AA64PFR0_FEAT_RME_MASK); +} + +static unsigned int read_feat_pan_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64mmfr1_el1(), ID_AA64MMFR1_EL1_PAN_SHIFT, + ID_AA64MMFR1_EL1_PAN_MASK); +} + +static unsigned int read_feat_mtpmu_id_field(void) +{ + return ISOLATE_FIELD(read_id_aa64dfr0_el1(), ID_AA64DFR0_MTPMU_SHIFT, + ID_AA64DFR0_MTPMU_MASK); + } /*********************************************************************************** @@ -150,6 +301,7 @@ void detect_arch_features(void) check_feature(ENABLE_FEAT_RAS, read_feat_ras_id_field(), "RAS", 1, 2); /* v8.3 features */ + /* TODO: Pauth yet to convert to tri-state feat detect logic */ read_feat_pauth(); /* v8.4 features */ @@ -169,8 +321,9 @@ void detect_arch_features(void) check_feature(ENABLE_FEAT_MTE2, get_armv8_5_mte_support(), "MTE2", MTE_IMPLEMENTED_ELX, MTE_IMPLEMENTED_ASY); check_feature(ENABLE_FEAT_RNG, read_feat_rng_id_field(), "RNG", 1, 1); - read_feat_bti(); - read_feat_rng_trap(); + check_feature(ENABLE_BTI, read_feat_bti_id_field(), "BTI", 1, 1); + check_feature(ENABLE_FEAT_RNG_TRAP, read_feat_rng_trap_id_field(), + "RNG_TRAP", 1, 1); /* v8.6 features */ check_feature(ENABLE_FEAT_AMUv1p1, read_feat_amu_id_field(), @@ -218,8 +371,7 @@ void detect_arch_features(void) /* v9.4 features */ check_feature(ENABLE_FEAT_GCS, read_feat_gcs_id_field(), "GCS", 1, 1); - - read_feat_rme(); + check_feature(ENABLE_RME, read_feat_rme_id_field(), "RME", 1, 1); if (tainted) { panic();