|
@@ -529,15 +529,25 @@ void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (cpu->prop_pauth_impdef) {
|
|
|
|
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, API, features);
|
|
|
|
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPI, 1);
|
|
|
|
|
|
+ bool use_default = !cpu->prop_pauth_qarma5 &&
|
|
|
|
+ !cpu->prop_pauth_qarma3 &&
|
|
|
|
+ !cpu->prop_pauth_impdef;
|
|
|
|
+
|
|
|
|
+ if (cpu->prop_pauth_qarma5 ||
|
|
|
|
+ (use_default &&
|
|
|
|
+ cpu->backcompat_pauth_default_use_qarma5)) {
|
|
|
|
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, APA, features);
|
|
|
|
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPA, 1);
|
|
} else if (cpu->prop_pauth_qarma3) {
|
|
} else if (cpu->prop_pauth_qarma3) {
|
|
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, APA3, features);
|
|
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, APA3, features);
|
|
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, GPA3, 1);
|
|
isar2 = FIELD_DP64(isar2, ID_AA64ISAR2, GPA3, 1);
|
|
- } else { /* default is pauth-qarma5 */
|
|
|
|
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, APA, features);
|
|
|
|
- isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPA, 1);
|
|
|
|
|
|
+ } else if (cpu->prop_pauth_impdef ||
|
|
|
|
+ (use_default &&
|
|
|
|
+ !cpu->backcompat_pauth_default_use_qarma5)) {
|
|
|
|
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, API, features);
|
|
|
|
+ isar1 = FIELD_DP64(isar1, ID_AA64ISAR1, GPI, 1);
|
|
|
|
+ } else {
|
|
|
|
+ g_assert_not_reached();
|
|
}
|
|
}
|
|
} else if (cpu->prop_pauth_impdef ||
|
|
} else if (cpu->prop_pauth_impdef ||
|
|
cpu->prop_pauth_qarma3 ||
|
|
cpu->prop_pauth_qarma3 ||
|