diff options
| -rw-r--r-- | arch/arm64/kernel/cpu_errata.c | 32 |
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: |
