@@ -209,40 +209,31 @@ static int detect_harden_bp_fw(void)
209
209
struct arm_smccc_res res ;
210
210
u32 midr = read_cpuid_id ();
211
211
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
+
212
225
switch (arm_smccc_1_1_get_conduit ()) {
213
226
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 ;
229
231
break ;
230
232
231
233
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 ;
246
237
break ;
247
238
248
239
default :
@@ -332,6 +323,8 @@ void __init arm64_enable_wa2_handling(struct alt_instr *alt,
332
323
333
324
void arm64_set_ssbd_mitigation (bool state )
334
325
{
326
+ int conduit ;
327
+
335
328
if (!IS_ENABLED (CONFIG_ARM64_SSBD )) {
336
329
pr_info_once ("SSBD disabled by kernel configuration\n" );
337
330
return ;
@@ -345,19 +338,10 @@ void arm64_set_ssbd_mitigation(bool state)
345
338
return ;
346
339
}
347
340
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 );
356
343
357
- default :
358
- WARN_ON_ONCE (1 );
359
- break ;
360
- }
344
+ WARN_ON_ONCE (conduit == SMCCC_CONDUIT_NONE );
361
345
}
362
346
363
347
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,
367
351
bool required = true;
368
352
s32 val ;
369
353
bool this_cpu_safe = false;
354
+ int conduit ;
370
355
371
356
WARN_ON (scope != SCOPE_LOCAL_CPU || preemptible ());
372
357
@@ -384,18 +369,10 @@ static bool has_ssbd_mitigation(const struct arm64_cpu_capabilities *entry,
384
369
goto out_printmsg ;
385
370
}
386
371
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 );
392
374
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 ) {
399
376
ssbd_state = ARM64_SSBD_UNKNOWN ;
400
377
if (!this_cpu_safe )
401
378
__ssb_safe = false;
0 commit comments