@@ -3271,11 +3271,6 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
3271
3271
switch (insn -> type ) {
3272
3272
3273
3273
case INSN_RETURN :
3274
- if (opts .sls && !insn -> retpoline_safe &&
3275
- next_insn && next_insn -> type != INSN_TRAP ) {
3276
- WARN_FUNC ("missing int3 after ret" ,
3277
- insn -> sec , insn -> offset );
3278
- }
3279
3274
return validate_return (func , insn , & state );
3280
3275
3281
3276
case INSN_CALL :
@@ -3319,13 +3314,6 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
3319
3314
break ;
3320
3315
3321
3316
case INSN_JUMP_DYNAMIC :
3322
- if (opts .sls && !insn -> retpoline_safe &&
3323
- next_insn && next_insn -> type != INSN_TRAP ) {
3324
- WARN_FUNC ("missing int3 after indirect jump" ,
3325
- insn -> sec , insn -> offset );
3326
- }
3327
-
3328
- /* fallthrough */
3329
3317
case INSN_JUMP_DYNAMIC_CONDITIONAL :
3330
3318
if (is_sibling_call (insn )) {
3331
3319
ret = validate_sibling_call (file , insn , & state );
@@ -3845,6 +3833,41 @@ static int validate_ibt(struct objtool_file *file)
3845
3833
return warnings ;
3846
3834
}
3847
3835
3836
+ static int validate_sls (struct objtool_file * file )
3837
+ {
3838
+ struct instruction * insn , * next_insn ;
3839
+ int warnings = 0 ;
3840
+
3841
+ for_each_insn (file , insn ) {
3842
+ next_insn = next_insn_same_sec (file , insn );
3843
+
3844
+ if (insn -> retpoline_safe )
3845
+ continue ;
3846
+
3847
+ switch (insn -> type ) {
3848
+ case INSN_RETURN :
3849
+ if (!next_insn || next_insn -> type != INSN_TRAP ) {
3850
+ WARN_FUNC ("missing int3 after ret" ,
3851
+ insn -> sec , insn -> offset );
3852
+ warnings ++ ;
3853
+ }
3854
+
3855
+ break ;
3856
+ case INSN_JUMP_DYNAMIC :
3857
+ if (!next_insn || next_insn -> type != INSN_TRAP ) {
3858
+ WARN_FUNC ("missing int3 after indirect jump" ,
3859
+ insn -> sec , insn -> offset );
3860
+ warnings ++ ;
3861
+ }
3862
+ break ;
3863
+ default :
3864
+ break ;
3865
+ }
3866
+ }
3867
+
3868
+ return warnings ;
3869
+ }
3870
+
3848
3871
static int validate_reachable_instructions (struct objtool_file * file )
3849
3872
{
3850
3873
struct instruction * insn ;
@@ -3913,7 +3936,7 @@ int check(struct objtool_file *file)
3913
3936
warnings += ret ;
3914
3937
}
3915
3938
3916
- if (opts .stackval || opts .orc || opts .uaccess || opts . sls ) {
3939
+ if (opts .stackval || opts .orc || opts .uaccess ) {
3917
3940
ret = validate_functions (file );
3918
3941
if (ret < 0 )
3919
3942
goto out ;
@@ -3939,6 +3962,13 @@ int check(struct objtool_file *file)
3939
3962
warnings += ret ;
3940
3963
}
3941
3964
3965
+ if (opts .sls ) {
3966
+ ret = validate_sls (file );
3967
+ if (ret < 0 )
3968
+ goto out ;
3969
+ warnings += ret ;
3970
+ }
3971
+
3942
3972
ret = create_static_call_sections (file );
3943
3973
if (ret < 0 )
3944
3974
goto out ;
0 commit comments