aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm64/kernel/cpu_errata.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
index 032f1a4dbea2..60cf87c4deb7 100644
--- a/arch/arm64/kernel/cpu_errata.c
+++ b/arch/arm64/kernel/cpu_errata.c
@@ -230,22 +230,36 @@ static int detect_harden_bp_fw(void)
230 case PSCI_CONDUIT_HVC: 230 case PSCI_CONDUIT_HVC:
231 arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, 231 arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
232 ARM_SMCCC_ARCH_WORKAROUND_1, &res); 232 ARM_SMCCC_ARCH_WORKAROUND_1, &res);
233 if ((int)res.a0 < 0) 233 switch ((int)res.a0) {
234 case 1:
235 /* Firmware says we're just fine */
236 return 0;
237 case 0:
238 cb = call_hvc_arch_workaround_1;
239 /* This is a guest, no need to patch KVM vectors */
240 smccc_start = NULL;
241 smccc_end = NULL;
242 break;
243 default:
234 return -1; 244 return -1;
235 cb = call_hvc_arch_workaround_1; 245 }
236 /* This is a guest, no need to patch KVM vectors */
237 smccc_start = NULL;
238 smccc_end = NULL;
239 break; 246 break;
240 247
241 case PSCI_CONDUIT_SMC: 248 case PSCI_CONDUIT_SMC:
242 arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, 249 arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
243 ARM_SMCCC_ARCH_WORKAROUND_1, &res); 250 ARM_SMCCC_ARCH_WORKAROUND_1, &res);
244 if ((int)res.a0 < 0) 251 switch ((int)res.a0) {
252 case 1:
253 /* Firmware says we're just fine */
254 return 0;
255 case 0:
256 cb = call_smc_arch_workaround_1;
257 smccc_start = __smccc_workaround_1_smc_start;
258 smccc_end = __smccc_workaround_1_smc_end;
259 break;
260 default:
245 return -1; 261 return -1;
246 cb = call_smc_arch_workaround_1; 262 }
247 smccc_start = __smccc_workaround_1_smc_start;
248 smccc_end = __smccc_workaround_1_smc_end;
249 break; 263 break;
250 264
251 default: 265 default: