|
|
@@ -198,22 +198,36 @@ static int detect_harden_bp_fw(void)
|
|
|
case PSCI_CONDUIT_HVC:
|
|
|
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
|
|
|
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
|
|
|
- if ((int)res.a0 < 0)
|
|
|
+ switch ((int)res.a0) {
|
|
|
+ case 1:
|
|
|
+ /* Firmware says we're just fine */
|
|
|
+ return 0;
|
|
|
+ case 0:
|
|
|
+ cb = call_hvc_arch_workaround_1;
|
|
|
+ /* This is a guest, no need to patch KVM vectors */
|
|
|
+ smccc_start = NULL;
|
|
|
+ smccc_end = NULL;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
return -1;
|
|
|
- cb = call_hvc_arch_workaround_1;
|
|
|
- /* This is a guest, no need to patch KVM vectors */
|
|
|
- smccc_start = NULL;
|
|
|
- smccc_end = NULL;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
case PSCI_CONDUIT_SMC:
|
|
|
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
|
|
|
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
|
|
|
- if ((int)res.a0 < 0)
|
|
|
+ switch ((int)res.a0) {
|
|
|
+ case 1:
|
|
|
+ /* Firmware says we're just fine */
|
|
|
+ return 0;
|
|
|
+ case 0:
|
|
|
+ cb = call_smc_arch_workaround_1;
|
|
|
+ smccc_start = __smccc_workaround_1_smc_start;
|
|
|
+ smccc_end = __smccc_workaround_1_smc_end;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
return -1;
|
|
|
- cb = call_smc_arch_workaround_1;
|
|
|
- smccc_start = __smccc_workaround_1_smc_start;
|
|
|
- smccc_end = __smccc_workaround_1_smc_end;
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
default:
|