@@ -255,11 +255,13 @@ enum spectre_v2_user_cmd {
255
255
SPECTRE_V2_USER_CMD_NONE ,
256
256
SPECTRE_V2_USER_CMD_AUTO ,
257
257
SPECTRE_V2_USER_CMD_FORCE ,
258
+ SPECTRE_V2_USER_CMD_PRCTL ,
258
259
};
259
260
260
261
static const char * const spectre_v2_user_strings [] = {
261
262
[SPECTRE_V2_USER_NONE ] = "User space: Vulnerable" ,
262
263
[SPECTRE_V2_USER_STRICT ] = "User space: Mitigation: STIBP protection" ,
264
+ [SPECTRE_V2_USER_PRCTL ] = "User space: Mitigation: STIBP via prctl" ,
263
265
};
264
266
265
267
static const struct {
@@ -270,6 +272,7 @@ static const struct {
270
272
{ "auto" , SPECTRE_V2_USER_CMD_AUTO , false },
271
273
{ "off" , SPECTRE_V2_USER_CMD_NONE , false },
272
274
{ "on" , SPECTRE_V2_USER_CMD_FORCE , true },
275
+ { "prctl" , SPECTRE_V2_USER_CMD_PRCTL , false },
273
276
};
274
277
275
278
static void __init spec_v2_user_print_cond (const char * reason , bool secure )
@@ -324,12 +327,15 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
324
327
smt_possible = false;
325
328
326
329
switch (spectre_v2_parse_user_cmdline (v2_cmd )) {
327
- case SPECTRE_V2_USER_CMD_AUTO :
328
330
case SPECTRE_V2_USER_CMD_NONE :
329
331
goto set_mode ;
330
332
case SPECTRE_V2_USER_CMD_FORCE :
331
333
mode = SPECTRE_V2_USER_STRICT ;
332
334
break ;
335
+ case SPECTRE_V2_USER_CMD_AUTO :
336
+ case SPECTRE_V2_USER_CMD_PRCTL :
337
+ mode = SPECTRE_V2_USER_PRCTL ;
338
+ break ;
333
339
}
334
340
335
341
/* Initialize Indirect Branch Prediction Barrier */
@@ -340,6 +346,9 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
340
346
case SPECTRE_V2_USER_STRICT :
341
347
static_branch_enable (& switch_mm_always_ibpb );
342
348
break ;
349
+ case SPECTRE_V2_USER_PRCTL :
350
+ static_branch_enable (& switch_mm_cond_ibpb );
351
+ break ;
343
352
default :
344
353
break ;
345
354
}
@@ -352,6 +361,12 @@ spectre_v2_user_select_mitigation(enum spectre_v2_mitigation_cmd v2_cmd)
352
361
if (spectre_v2_enabled == SPECTRE_V2_IBRS_ENHANCED )
353
362
return ;
354
363
364
+ /*
365
+ * If SMT is not possible or STIBP is not available clear the STIPB
366
+ * mode.
367
+ */
368
+ if (!smt_possible || !boot_cpu_has (X86_FEATURE_STIBP ))
369
+ mode = SPECTRE_V2_USER_NONE ;
355
370
set_mode :
356
371
spectre_v2_user = mode ;
357
372
/* Only print the STIBP mode when SMT possible */
@@ -552,6 +567,15 @@ static void update_stibp_strict(void)
552
567
on_each_cpu (update_stibp_msr , NULL , 1 );
553
568
}
554
569
570
+ /* Update the static key controlling the evaluation of TIF_SPEC_IB */
571
+ static void update_indir_branch_cond (void )
572
+ {
573
+ if (sched_smt_active ())
574
+ static_branch_enable (& switch_to_cond_stibp );
575
+ else
576
+ static_branch_disable (& switch_to_cond_stibp );
577
+ }
578
+
555
579
void arch_smt_update (void )
556
580
{
557
581
/* Enhanced IBRS implies STIBP. No update required. */
@@ -567,6 +591,7 @@ void arch_smt_update(void)
567
591
update_stibp_strict ();
568
592
break ;
569
593
case SPECTRE_V2_USER_PRCTL :
594
+ update_indir_branch_cond ();
570
595
break ;
571
596
}
572
597
@@ -1038,22 +1063,20 @@ static char *stibp_state(void)
1038
1063
case SPECTRE_V2_USER_STRICT :
1039
1064
return ", STIBP: forced" ;
1040
1065
case SPECTRE_V2_USER_PRCTL :
1041
- return "" ;
1066
+ if (static_key_enabled (& switch_to_cond_stibp ))
1067
+ return ", STIBP: conditional" ;
1042
1068
}
1043
1069
return "" ;
1044
1070
}
1045
1071
1046
1072
static char * ibpb_state (void )
1047
1073
{
1048
1074
if (boot_cpu_has (X86_FEATURE_IBPB )) {
1049
- switch (spectre_v2_user ) {
1050
- case SPECTRE_V2_USER_NONE :
1051
- return ", IBPB: disabled" ;
1052
- case SPECTRE_V2_USER_STRICT :
1075
+ if (static_key_enabled (& switch_mm_always_ibpb ))
1053
1076
return ", IBPB: always-on" ;
1054
- case SPECTRE_V2_USER_PRCTL :
1055
- return "" ;
1056
- }
1077
+ if ( static_key_enabled ( & switch_mm_cond_ibpb ))
1078
+ return ", IBPB: conditional " ;
1079
+ return ", IBPB: disabled" ;
1057
1080
}
1058
1081
return "" ;
1059
1082
}
0 commit comments