Skip to content

Commit ce4d5ca

Browse files
Steven PriceMarc Zyngier
authored andcommitted
arm/arm64: Make use of the SMCCC 1.1 wrapper
Rather than directly choosing which function to use based on psci_ops.conduit, use the new arm_smccc_1_1 wrapper instead. In some cases we still need to do some operations based on the conduit, but the code duplication is removed. No functional change. Signed-off-by: Steven Price <[email protected]> Signed-off-by: Marc Zyngier <[email protected]>
1 parent 541625a commit ce4d5ca

File tree

2 files changed

+34
-60
lines changed

2 files changed

+34
-60
lines changed

arch/arm/mm/proc-v7-bugs.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,23 +74,20 @@ static void cpu_v7_spectre_init(void)
7474
case ARM_CPU_PART_CORTEX_A72: {
7575
struct arm_smccc_res res;
7676

77+
arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
78+
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
79+
if ((int)res.a0 != 0)
80+
return;
81+
7782
switch (arm_smccc_1_1_get_conduit()) {
7883
case SMCCC_CONDUIT_HVC:
79-
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
80-
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
81-
if ((int)res.a0 != 0)
82-
break;
8384
per_cpu(harden_branch_predictor_fn, cpu) =
8485
call_hvc_arch_workaround_1;
8586
cpu_do_switch_mm = cpu_v7_hvc_switch_mm;
8687
spectre_v2_method = "hypervisor";
8788
break;
8889

8990
case SMCCC_CONDUIT_SMC:
90-
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
91-
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
92-
if ((int)res.a0 != 0)
93-
break;
9491
per_cpu(harden_branch_predictor_fn, cpu) =
9592
call_smc_arch_workaround_1;
9693
cpu_do_switch_mm = cpu_v7_smc_switch_mm;

arch/arm64/kernel/cpu_errata.c

Lines changed: 29 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -209,40 +209,31 @@ static int detect_harden_bp_fw(void)
209209
struct arm_smccc_res res;
210210
u32 midr = read_cpuid_id();
211211

212+
arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
213+
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
214+
215+
switch ((int)res.a0) {
216+
case 1:
217+
/* Firmware says we're just fine */
218+
return 0;
219+
case 0:
220+
break;
221+
default:
222+
return -1;
223+
}
224+
212225
switch (arm_smccc_1_1_get_conduit()) {
213226
case SMCCC_CONDUIT_HVC:
214-
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
215-
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
216-
switch ((int)res.a0) {
217-
case 1:
218-
/* Firmware says we're just fine */
219-
return 0;
220-
case 0:
221-
cb = call_hvc_arch_workaround_1;
222-
/* This is a guest, no need to patch KVM vectors */
223-
smccc_start = NULL;
224-
smccc_end = NULL;
225-
break;
226-
default:
227-
return -1;
228-
}
227+
cb = call_hvc_arch_workaround_1;
228+
/* This is a guest, no need to patch KVM vectors */
229+
smccc_start = NULL;
230+
smccc_end = NULL;
229231
break;
230232

231233
case SMCCC_CONDUIT_SMC:
232-
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
233-
ARM_SMCCC_ARCH_WORKAROUND_1, &res);
234-
switch ((int)res.a0) {
235-
case 1:
236-
/* Firmware says we're just fine */
237-
return 0;
238-
case 0:
239-
cb = call_smc_arch_workaround_1;
240-
smccc_start = __smccc_workaround_1_smc_start;
241-
smccc_end = __smccc_workaround_1_smc_end;
242-
break;
243-
default:
244-
return -1;
245-
}
234+
cb = call_smc_arch_workaround_1;
235+
smccc_start = __smccc_workaround_1_smc_start;
236+
smccc_end = __smccc_workaround_1_smc_end;
246237
break;
247238

248239
default:
@@ -332,6 +323,8 @@ void __init arm64_enable_wa2_handling(struct alt_instr *alt,
332323

333324
void arm64_set_ssbd_mitigation(bool state)
334325
{
326+
int conduit;
327+
335328
if (!IS_ENABLED(CONFIG_ARM64_SSBD)) {
336329
pr_info_once("SSBD disabled by kernel configuration\n");
337330
return;
@@ -345,19 +338,10 @@ void arm64_set_ssbd_mitigation(bool state)
345338
return;
346339
}
347340

348-
switch (arm_smccc_1_1_get_conduit()) {
349-
case SMCCC_CONDUIT_HVC:
350-
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL);
351-
break;
352-
353-
case SMCCC_CONDUIT_SMC:
354-
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_WORKAROUND_2, state, NULL);
355-
break;
341+
conduit = arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_WORKAROUND_2, state,
342+
NULL);
356343

357-
default:
358-
WARN_ON_ONCE(1);
359-
break;
360-
}
344+
WARN_ON_ONCE(conduit == SMCCC_CONDUIT_NONE);
361345
}
362346

363347
static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
@@ -367,6 +351,7 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
367351
bool required = true;
368352
s32 val;
369353
bool this_cpu_safe = false;
354+
int conduit;
370355

371356
WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
372357

@@ -384,18 +369,10 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
384369
goto out_printmsg;
385370
}
386371

387-
switch (arm_smccc_1_1_get_conduit()) {
388-
case SMCCC_CONDUIT_HVC:
389-
arm_smccc_1_1_hvc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
390-
ARM_SMCCC_ARCH_WORKAROUND_2, &res);
391-
break;
372+
conduit = arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
373+
ARM_SMCCC_ARCH_WORKAROUND_2, &res);
392374

393-
case SMCCC_CONDUIT_SMC:
394-
arm_smccc_1_1_smc(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
395-
ARM_SMCCC_ARCH_WORKAROUND_2, &res);
396-
break;
397-
398-
default:
375+
if (conduit == SMCCC_CONDUIT_NONE) {
399376
ssbd_state = ARM64_SSBD_UNKNOWN;
400377
if (!this_cpu_safe)
401378
__ssb_safe = false;

0 commit comments

Comments
 (0)