objtool: Extricate sls from stack validation
[linux-2.6-microblaze.git] / tools / objtool / check.c
index 85c2888..27126ff 100644 (file)
@@ -3271,11 +3271,6 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
                switch (insn->type) {
 
                case INSN_RETURN:
-                       if (opts.sls && !insn->retpoline_safe &&
-                           next_insn && next_insn->type != INSN_TRAP) {
-                               WARN_FUNC("missing int3 after ret",
-                                         insn->sec, insn->offset);
-                       }
                        return validate_return(func, insn, &state);
 
                case INSN_CALL:
@@ -3319,13 +3314,6 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
                        break;
 
                case INSN_JUMP_DYNAMIC:
-                       if (opts.sls && !insn->retpoline_safe &&
-                           next_insn && next_insn->type != INSN_TRAP) {
-                               WARN_FUNC("missing int3 after indirect jump",
-                                         insn->sec, insn->offset);
-                       }
-
-                       /* fallthrough */
                case INSN_JUMP_DYNAMIC_CONDITIONAL:
                        if (is_sibling_call(insn)) {
                                ret = validate_sibling_call(file, insn, &state);
@@ -3845,6 +3833,41 @@ static int validate_ibt(struct objtool_file *file)
        return warnings;
 }
 
+static int validate_sls(struct objtool_file *file)
+{
+       struct instruction *insn, *next_insn;
+       int warnings = 0;
+
+       for_each_insn(file, insn) {
+               next_insn = next_insn_same_sec(file, insn);
+
+               if (insn->retpoline_safe)
+                       continue;
+
+               switch (insn->type) {
+               case INSN_RETURN:
+                       if (!next_insn || next_insn->type != INSN_TRAP) {
+                               WARN_FUNC("missing int3 after ret",
+                                         insn->sec, insn->offset);
+                               warnings++;
+                       }
+
+                       break;
+               case INSN_JUMP_DYNAMIC:
+                       if (!next_insn || next_insn->type != INSN_TRAP) {
+                               WARN_FUNC("missing int3 after indirect jump",
+                                         insn->sec, insn->offset);
+                               warnings++;
+                       }
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       return warnings;
+}
+
 static int validate_reachable_instructions(struct objtool_file *file)
 {
        struct instruction *insn;
@@ -3913,7 +3936,7 @@ int check(struct objtool_file *file)
                warnings += ret;
        }
 
-       if (opts.stackval || opts.orc || opts.uaccess || opts.sls) {
+       if (opts.stackval || opts.orc || opts.uaccess) {
                ret = validate_functions(file);
                if (ret < 0)
                        goto out;
@@ -3939,6 +3962,13 @@ int check(struct objtool_file *file)
                warnings += ret;
        }
 
+       if (opts.sls) {
+               ret = validate_sls(file);
+               if (ret < 0)
+                       goto out;
+               warnings += ret;
+       }
+
        ret = create_static_call_sections(file);
        if (ret < 0)
                goto out;