Lines Matching refs:file
37 struct instruction *find_insn(struct objtool_file *file, in find_insn() argument
42 hash_for_each_possible(file->insn_hash, insn, hash, sec_offset_hash(sec, offset)) { in find_insn()
50 static struct instruction *next_insn_same_sec(struct objtool_file *file, in next_insn_same_sec() argument
55 if (!next || &next->list == &file->insn_list || next->sec != insn->sec) in next_insn_same_sec()
61 static struct instruction *next_insn_same_func(struct objtool_file *file, in next_insn_same_func() argument
70 if (&next->list != &file->insn_list && next->func == func) in next_insn_same_func()
78 return find_insn(file, func->cfunc->sec, func->cfunc->offset); in next_insn_same_func()
81 static struct instruction *prev_insn_same_sym(struct objtool_file *file, in prev_insn_same_sym() argument
86 if (&prev->list != &file->insn_list && prev->func == insn->func) in prev_insn_same_sym()
92 #define func_for_each_insn(file, func, insn) \ argument
93 for (insn = find_insn(file, func->sec, func->offset); \
95 insn = next_insn_same_func(file, insn))
97 #define sym_for_each_insn(file, sym, insn) \ argument
98 for (insn = find_insn(file, sym->sec, sym->offset); \
99 insn && &insn->list != &file->insn_list && \
104 #define sym_for_each_insn_continue_reverse(file, sym, insn) \ argument
106 &insn->list != &file->insn_list && \
110 #define sec_for_each_insn_from(file, insn) \ argument
111 for (; insn; insn = next_insn_same_sec(file, insn))
113 #define sec_for_each_insn_continue(file, insn) \ argument
114 for (insn = next_insn_same_sec(file, insn); insn; \
115 insn = next_insn_same_sec(file, insn))
156 static bool __dead_end_function(struct objtool_file *file, struct symbol *func, in __dead_end_function() argument
209 insn = find_insn(file, func->sec, func->offset); in __dead_end_function()
213 func_for_each_insn(file, func, insn) { in __dead_end_function()
228 func_for_each_insn(file, func, insn) { in __dead_end_function()
246 return __dead_end_function(file, dest->func, recursion+1); in __dead_end_function()
253 static bool dead_end_function(struct objtool_file *file, struct symbol *func) in dead_end_function() argument
255 return __dead_end_function(file, func, 0); in dead_end_function()
271 static void init_insn_state(struct objtool_file *file, struct insn_state *state, in init_insn_state() argument
362 static int decode_instructions(struct objtool_file *file) in decode_instructions() argument
370 for_each_sec(file, sec) { in decode_instructions()
399 ret = arch_decode_instruction(file, sec, offset, in decode_instructions()
415 hash_add(file->insn_hash, &insn->hash, sec_offset_hash(sec, insn->offset)); in decode_instructions()
416 list_add_tail(&insn->list, &file->insn_list); in decode_instructions()
424 if (!find_insn(file, sec, func->offset)) { in decode_instructions()
430 sym_for_each_insn(file, func, insn) { in decode_instructions()
434 list_add_tail(&insn->call_node, &file->endbr_list); in decode_instructions()
435 file->nr_endbr++; in decode_instructions()
437 file->nr_endbr_int++; in decode_instructions()
457 static int add_pv_ops(struct objtool_file *file, const char *symname) in add_pv_ops() argument
464 sym = find_symbol_by_name(file->elf, symname); in add_pv_ops()
471 rel = find_reloc_by_dest_range(file->elf, sym->sec, off, end - off); in add_pv_ops()
481 objtool_pv_add(file, idx, func); in add_pv_ops()
494 static int init_pv_ops(struct objtool_file *file) in init_pv_ops() argument
510 file->pv_ops = NULL; in init_pv_ops()
512 sym = find_symbol_by_name(file->elf, "pv_ops"); in init_pv_ops()
517 file->pv_ops = calloc(sizeof(struct pv_state), nr); in init_pv_ops()
518 if (!file->pv_ops) in init_pv_ops()
522 INIT_LIST_HEAD(&file->pv_ops[idx].targets); in init_pv_ops()
525 add_pv_ops(file, pv_ops); in init_pv_ops()
530 static struct instruction *find_last_insn(struct objtool_file *file, in find_last_insn() argument
538 insn = find_insn(file, sec, offset); in find_last_insn()
546 static int add_dead_ends(struct objtool_file *file) in add_dead_ends() argument
555 sec = find_section_by_name(file->elf, ".rela.discard.unreachable"); in add_dead_ends()
564 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_dead_ends()
568 insn = find_last_insn(file, reloc->sym->sec); in add_dead_ends()
590 sec = find_section_by_name(file->elf, ".rela.discard.reachable"); in add_dead_ends()
599 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_dead_ends()
603 insn = find_last_insn(file, reloc->sym->sec); in add_dead_ends()
621 static int create_static_call_sections(struct objtool_file *file) in create_static_call_sections() argument
630 sec = find_section_by_name(file->elf, ".static_call_sites"); in create_static_call_sections()
632 INIT_LIST_HEAD(&file->static_call_list); in create_static_call_sections()
637 if (list_empty(&file->static_call_list)) in create_static_call_sections()
641 list_for_each_entry(insn, &file->static_call_list, call_node) in create_static_call_sections()
644 sec = elf_create_section(file->elf, ".static_call_sites", SHF_WRITE, in create_static_call_sections()
650 list_for_each_entry(insn, &file->static_call_list, call_node) { in create_static_call_sections()
656 if (elf_add_reloc_to_insn(file->elf, sec, in create_static_call_sections()
676 key_sym = find_symbol_by_name(file->elf, tmp); in create_static_call_sections()
697 if (elf_add_reloc(file->elf, sec, in create_static_call_sections()
709 static int create_retpoline_sites_sections(struct objtool_file *file) in create_retpoline_sites_sections() argument
715 sec = find_section_by_name(file->elf, ".retpoline_sites"); in create_retpoline_sites_sections()
722 list_for_each_entry(insn, &file->retpoline_call_list, call_node) in create_retpoline_sites_sections()
728 sec = elf_create_section(file->elf, ".retpoline_sites", 0, in create_retpoline_sites_sections()
736 list_for_each_entry(insn, &file->retpoline_call_list, call_node) { in create_retpoline_sites_sections()
741 if (elf_add_reloc_to_insn(file->elf, sec, in create_retpoline_sites_sections()
755 static int create_return_sites_sections(struct objtool_file *file) in create_return_sites_sections() argument
761 sec = find_section_by_name(file->elf, ".return_sites"); in create_return_sites_sections()
768 list_for_each_entry(insn, &file->return_thunk_list, call_node) in create_return_sites_sections()
774 sec = elf_create_section(file->elf, ".return_sites", 0, in create_return_sites_sections()
782 list_for_each_entry(insn, &file->return_thunk_list, call_node) { in create_return_sites_sections()
787 if (elf_add_reloc_to_insn(file->elf, sec, in create_return_sites_sections()
801 static int create_ibt_endbr_seal_sections(struct objtool_file *file) in create_ibt_endbr_seal_sections() argument
807 sec = find_section_by_name(file->elf, ".ibt_endbr_seal"); in create_ibt_endbr_seal_sections()
814 list_for_each_entry(insn, &file->endbr_list, call_node) in create_ibt_endbr_seal_sections()
818 printf("ibt: ENDBR at function start: %d\n", file->nr_endbr); in create_ibt_endbr_seal_sections()
819 printf("ibt: ENDBR inside functions: %d\n", file->nr_endbr_int); in create_ibt_endbr_seal_sections()
826 sec = elf_create_section(file->elf, ".ibt_endbr_seal", 0, in create_ibt_endbr_seal_sections()
834 list_for_each_entry(insn, &file->endbr_list, call_node) { in create_ibt_endbr_seal_sections()
839 if (elf_add_reloc_to_insn(file->elf, sec, in create_ibt_endbr_seal_sections()
853 static int create_mcount_loc_sections(struct objtool_file *file) in create_mcount_loc_sections() argument
860 sec = find_section_by_name(file->elf, "__mcount_loc"); in create_mcount_loc_sections()
862 INIT_LIST_HEAD(&file->mcount_loc_list); in create_mcount_loc_sections()
867 if (list_empty(&file->mcount_loc_list)) in create_mcount_loc_sections()
871 list_for_each_entry(insn, &file->mcount_loc_list, call_node) in create_mcount_loc_sections()
874 sec = elf_create_section(file->elf, "__mcount_loc", 0, sizeof(unsigned long), idx); in create_mcount_loc_sections()
879 list_for_each_entry(insn, &file->mcount_loc_list, call_node) { in create_mcount_loc_sections()
884 if (elf_add_reloc_to_insn(file->elf, sec, in create_mcount_loc_sections()
899 static void add_ignores(struct objtool_file *file) in add_ignores() argument
906 sec = find_section_by_name(file->elf, ".rela.discard.func_stack_frame_non_standard"); in add_ignores()
927 func_for_each_insn(file, func, insn) in add_ignores()
1102 static void add_uaccess_safe(struct objtool_file *file) in add_uaccess_safe() argument
1111 func = find_symbol_by_name(file->elf, *name); in add_uaccess_safe()
1125 static int add_ignore_alternatives(struct objtool_file *file) in add_ignore_alternatives() argument
1131 sec = find_section_by_name(file->elf, ".rela.discard.ignore_alts"); in add_ignore_alternatives()
1141 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_ignore_alternatives()
1165 static struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn) in insn_reloc() argument
1171 if (!file) in insn_reloc()
1174 insn->reloc = find_reloc_by_dest_range(file->elf, insn->sec, in insn_reloc()
1195 static void annotate_call_site(struct objtool_file *file, in annotate_call_site() argument
1198 struct reloc *reloc = insn_reloc(file, insn); in annotate_call_site()
1214 list_add_tail(&insn->call_node, &file->static_call_list); in annotate_call_site()
1219 list_add_tail(&insn->call_node, &file->retpoline_call_list); in annotate_call_site()
1231 elf_write_reloc(file->elf, reloc); in annotate_call_site()
1234 elf_write_insn(file->elf, insn->sec, in annotate_call_site()
1260 elf_write_reloc(file->elf, reloc); in annotate_call_site()
1263 elf_write_insn(file->elf, insn->sec, in annotate_call_site()
1269 list_add_tail(&insn->call_node, &file->mcount_loc_list); in annotate_call_site()
1273 if (!sibling && dead_end_function(file, sym)) in annotate_call_site()
1277 static void add_call_dest(struct objtool_file *file, struct instruction *insn, in add_call_dest() argument
1293 annotate_call_site(file, insn, sibling); in add_call_dest()
1296 static void add_retpoline_call(struct objtool_file *file, struct instruction *insn) in add_retpoline_call() argument
1327 annotate_call_site(file, insn, false); in add_retpoline_call()
1330 static void add_return_call(struct objtool_file *file, struct instruction *insn, bool add) in add_return_call() argument
1340 list_add_tail(&insn->call_node, &file->return_thunk_list); in add_return_call()
1348 static bool is_first_func_insn(struct objtool_file *file, struct instruction *insn) in is_first_func_insn() argument
1354 struct instruction *prev = prev_insn_same_sym(file, insn); in is_first_func_insn()
1367 static int add_jump_destinations(struct objtool_file *file) in add_jump_destinations() argument
1374 for_each_insn(file, insn) { in add_jump_destinations()
1385 reloc = insn_reloc(file, insn); in add_jump_destinations()
1393 add_retpoline_call(file, insn); in add_jump_destinations()
1396 add_return_call(file, insn, true); in add_jump_destinations()
1403 add_call_dest(file, insn, reloc->sym, true); in add_jump_destinations()
1414 jump_dest = find_insn(file, dest_sec, dest_off); in add_jump_destinations()
1427 add_return_call(file, insn, false); in add_jump_destinations()
1464 is_first_func_insn(file, jump_dest)) { in add_jump_destinations()
1469 add_call_dest(file, insn, jump_dest->func, true); in add_jump_destinations()
1494 static int add_call_destinations(struct objtool_file *file) in add_call_destinations() argument
1501 for_each_insn(file, insn) { in add_call_destinations()
1505 reloc = insn_reloc(file, insn); in add_call_destinations()
1510 add_call_dest(file, insn, dest, false); in add_call_destinations()
1537 add_call_dest(file, insn, dest, false); in add_call_destinations()
1540 add_retpoline_call(file, insn); in add_call_destinations()
1543 add_call_dest(file, insn, reloc->sym, false); in add_call_destinations()
1553 static int handle_group_alt(struct objtool_file *file, in handle_group_alt() argument
1577 sec_for_each_insn_from(file, insn) { in handle_group_alt()
1627 sec_for_each_insn_from(file, insn) { in handle_group_alt()
1647 alt_reloc = insn_reloc(file, insn); in handle_group_alt()
1664 insn->jump_dest = next_insn_same_sec(file, last_orig_insn); in handle_group_alt()
1694 static int handle_jump_alt(struct objtool_file *file, in handle_jump_alt() argument
1708 struct reloc *reloc = insn_reloc(file, orig_insn); in handle_jump_alt()
1712 elf_write_reloc(file->elf, reloc); in handle_jump_alt()
1714 elf_write_insn(file->elf, orig_insn->sec, in handle_jump_alt()
1722 file->jl_nop_short++; in handle_jump_alt()
1724 file->jl_nop_long++; in handle_jump_alt()
1730 file->jl_short++; in handle_jump_alt()
1732 file->jl_long++; in handle_jump_alt()
1744 static int add_special_section_alts(struct objtool_file *file) in add_special_section_alts() argument
1752 ret = special_get_alts(file->elf, &special_alts); in add_special_section_alts()
1758 orig_insn = find_insn(file, special_alt->orig_sec, in add_special_section_alts()
1769 new_insn = find_insn(file, special_alt->new_sec, in add_special_section_alts()
1787 ret = handle_group_alt(file, special_alt, orig_insn, in add_special_section_alts()
1792 ret = handle_jump_alt(file, special_alt, orig_insn, in add_special_section_alts()
1816 printf("short:\t%ld\t%ld\n", file->jl_nop_short, file->jl_short); in add_special_section_alts()
1817 printf("long:\t%ld\t%ld\n", file->jl_nop_long, file->jl_long); in add_special_section_alts()
1824 static int add_jump_table(struct objtool_file *file, struct instruction *insn, in add_jump_table() argument
1852 dest_insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_jump_table()
1884 static struct reloc *find_jump_table(struct objtool_file *file, in find_jump_table() argument
1898 insn = insn->first_jump_src ?: prev_insn_same_sym(file, insn)) { in find_jump_table()
1910 table_reloc = arch_find_switch_table(file, insn); in find_jump_table()
1913 dest_insn = find_insn(file, table_reloc->sym->sec, table_reloc->addend); in find_jump_table()
1927 static void mark_func_jump_tables(struct objtool_file *file, in mark_func_jump_tables() argument
1933 func_for_each_insn(file, func, insn) { in mark_func_jump_tables()
1954 reloc = find_jump_table(file, func, insn); in mark_func_jump_tables()
1962 static int add_func_jump_tables(struct objtool_file *file, in add_func_jump_tables() argument
1968 func_for_each_insn(file, func, insn) { in add_func_jump_tables()
1972 ret = add_jump_table(file, insn, insn->jump_table); in add_func_jump_tables()
1985 static int add_jump_table_alts(struct objtool_file *file) in add_jump_table_alts() argument
1991 if (!file->rodata) in add_jump_table_alts()
1994 for_each_sec(file, sec) { in add_jump_table_alts()
1999 mark_func_jump_tables(file, func); in add_jump_table_alts()
2000 ret = add_func_jump_tables(file, func); in add_jump_table_alts()
2017 static int read_unwind_hints(struct objtool_file *file) in read_unwind_hints() argument
2026 sec = find_section_by_name(file->elf, ".discard.unwind_hints"); in read_unwind_hints()
2041 file->hints = true; in read_unwind_hints()
2046 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint)); in read_unwind_hints()
2052 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_unwind_hints()
2113 static int read_noendbr_hints(struct objtool_file *file) in read_noendbr_hints() argument
2119 sec = find_section_by_name(file->elf, ".rela.discard.noendbr"); in read_noendbr_hints()
2124 insn = find_insn(file, reloc->sym->sec, reloc->sym->offset + reloc->addend); in read_noendbr_hints()
2136 static int read_retpoline_hints(struct objtool_file *file) in read_retpoline_hints() argument
2142 sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe"); in read_retpoline_hints()
2152 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_retpoline_hints()
2173 static int read_instr_hints(struct objtool_file *file) in read_instr_hints() argument
2179 sec = find_section_by_name(file->elf, ".rela.discard.instr_end"); in read_instr_hints()
2189 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_instr_hints()
2198 sec = find_section_by_name(file->elf, ".rela.discard.instr_begin"); in read_instr_hints()
2208 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_instr_hints()
2220 static int read_intra_function_calls(struct objtool_file *file) in read_intra_function_calls() argument
2226 sec = find_section_by_name(file->elf, ".rela.discard.intra_function_calls"); in read_intra_function_calls()
2239 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_intra_function_calls()
2259 insn->jump_dest = find_insn(file, insn->sec, dest_off); in read_intra_function_calls()
2296 static int classify_symbols(struct objtool_file *file) in classify_symbols() argument
2301 for_each_sec(file, sec) { in classify_symbols()
2327 static void mark_rodata(struct objtool_file *file) in mark_rodata() argument
2342 for_each_sec(file, sec) { in mark_rodata()
2350 file->rodata = found; in mark_rodata()
2353 static int decode_sections(struct objtool_file *file) in decode_sections() argument
2357 mark_rodata(file); in decode_sections()
2359 ret = init_pv_ops(file); in decode_sections()
2363 ret = decode_instructions(file); in decode_sections()
2367 add_ignores(file); in decode_sections()
2368 add_uaccess_safe(file); in decode_sections()
2370 ret = add_ignore_alternatives(file); in decode_sections()
2377 ret = read_noendbr_hints(file); in decode_sections()
2384 ret = classify_symbols(file); in decode_sections()
2392 ret = add_special_section_alts(file); in decode_sections()
2396 ret = add_jump_destinations(file); in decode_sections()
2404 ret = read_intra_function_calls(file); in decode_sections()
2408 ret = add_call_destinations(file); in decode_sections()
2416 ret = add_dead_ends(file); in decode_sections()
2420 ret = add_jump_table_alts(file); in decode_sections()
2424 ret = read_unwind_hints(file); in decode_sections()
2428 ret = read_retpoline_hints(file); in decode_sections()
2432 ret = read_instr_hints(file); in decode_sections()
3018 static int propagate_alt_cfi(struct objtool_file *file, struct instruction *insn) in propagate_alt_cfi() argument
3163 static bool pv_call_dest(struct objtool_file *file, struct instruction *insn) in pv_call_dest() argument
3169 rel = insn_reloc(file, insn); in pv_call_dest()
3175 if (file->pv_ops[idx].clean) in pv_call_dest()
3178 file->pv_ops[idx].clean = true; in pv_call_dest()
3180 list_for_each_entry(target, &file->pv_ops[idx].targets, pv_target) { in pv_call_dest()
3183 file->pv_ops[idx].clean = false; in pv_call_dest()
3187 return file->pv_ops[idx].clean; in pv_call_dest()
3190 static inline bool noinstr_call_dest(struct objtool_file *file, in noinstr_call_dest() argument
3199 if (file->pv_ops) in noinstr_call_dest()
3200 return pv_call_dest(file, insn); in noinstr_call_dest()
3222 static int validate_call(struct objtool_file *file, in validate_call() argument
3227 !noinstr_call_dest(file, insn, insn->call_dest)) { in validate_call()
3248 static int validate_sibling_call(struct objtool_file *file, in validate_sibling_call() argument
3258 return validate_call(file, insn, state); in validate_sibling_call()
3302 static struct instruction *next_insn_to_validate(struct objtool_file *file, in next_insn_to_validate() argument
3313 return next_insn_same_sec(file, alt_group->orig_group->last_insn); in next_insn_to_validate()
3315 return next_insn_same_sec(file, insn); in next_insn_to_validate()
3324 static int validate_branch(struct objtool_file *file, struct symbol *func, in validate_branch() argument
3336 next_insn = next_insn_to_validate(file, insn); in validate_branch()
3375 sym_for_each_insn_continue_reverse(file, func, i) { in validate_branch()
3412 if (propagate_alt_cfi(file, insn)) in validate_branch()
3422 ret = validate_branch(file, func, alt->insn, state); in validate_branch()
3444 ret = validate_call(file, insn, &state); in validate_branch()
3463 ret = validate_sibling_call(file, insn, &state); in validate_branch()
3468 ret = validate_branch(file, func, in validate_branch()
3485 ret = validate_sibling_call(file, insn, &state); in validate_branch()
3565 static int validate_unwind_hints(struct objtool_file *file, struct section *sec) in validate_unwind_hints() argument
3571 if (!file->hints) in validate_unwind_hints()
3574 init_insn_state(file, &state, sec); in validate_unwind_hints()
3577 insn = find_insn(file, sec, 0); in validate_unwind_hints()
3581 insn = list_first_entry(&file->insn_list, typeof(*insn), list); in validate_unwind_hints()
3584 while (&insn->list != &file->insn_list && (!sec || insn->sec == sec)) { in validate_unwind_hints()
3586 ret = validate_branch(file, insn->func, insn, state); in validate_unwind_hints()
3604 static int validate_entry(struct objtool_file *file, struct instruction *insn) in validate_entry() argument
3610 next = next_insn_to_validate(file, insn); in validate_entry()
3625 ret = validate_entry(file, alt->insn); in validate_entry()
3653 ret = validate_entry(file, insn->jump_dest); in validate_entry()
3670 dest = find_insn(file, insn->call_dest->sec, in validate_entry()
3678 ret = validate_entry(file, dest); in validate_entry()
3717 static int validate_unret(struct objtool_file *file) in validate_unret() argument
3722 for_each_insn(file, insn) { in validate_unret()
3726 ret = validate_entry(file, insn); in validate_unret()
3737 static int validate_retpoline(struct objtool_file *file) in validate_retpoline() argument
3742 for_each_insn(file, insn) { in validate_retpoline()
3791 static bool ignore_unreachable_insn(struct objtool_file *file, struct instruction *insn) in ignore_unreachable_insn() argument
3825 sec_for_each_insn_continue(file, insn) { in ignore_unreachable_insn()
3842 func_for_each_insn(file, dest->func, dest) in ignore_unreachable_insn()
3865 if ((prev_insn->dead_end || dead_end_function(file, prev_insn->call_dest)) && in ignore_unreachable_insn()
3901 static int validate_symbol(struct objtool_file *file, struct section *sec, in validate_symbol() argument
3915 insn = find_insn(file, sec, sym->offset); in validate_symbol()
3921 ret = validate_branch(file, insn->func, insn, *state); in validate_symbol()
3927 static int validate_section(struct objtool_file *file, struct section *sec) in validate_section() argument
3937 init_insn_state(file, &state, sec); in validate_section()
3940 warnings += validate_symbol(file, sec, func, &state); in validate_section()
3946 static int validate_noinstr_sections(struct objtool_file *file) in validate_noinstr_sections() argument
3951 sec = find_section_by_name(file->elf, ".noinstr.text"); in validate_noinstr_sections()
3953 warnings += validate_section(file, sec); in validate_noinstr_sections()
3954 warnings += validate_unwind_hints(file, sec); in validate_noinstr_sections()
3957 sec = find_section_by_name(file->elf, ".entry.text"); in validate_noinstr_sections()
3959 warnings += validate_section(file, sec); in validate_noinstr_sections()
3960 warnings += validate_unwind_hints(file, sec); in validate_noinstr_sections()
3966 static int validate_functions(struct objtool_file *file) in validate_functions() argument
3971 for_each_sec(file, sec) { in validate_functions()
3975 warnings += validate_section(file, sec); in validate_functions()
3987 static int validate_ibt_insn(struct objtool_file *file, struct instruction *insn) in validate_ibt_insn() argument
4012 for (reloc = insn_reloc(file, insn); in validate_ibt_insn()
4014 reloc = find_reloc_by_dest_range(file->elf, insn->sec, in validate_ibt_insn()
4031 dest = find_insn(file, reloc->sym->sec, off); in validate_ibt_insn()
4072 static int validate_ibt_data_reloc(struct objtool_file *file, in validate_ibt_data_reloc() argument
4077 dest = find_insn(file, reloc->sym->sec, in validate_ibt_data_reloc()
4102 static int validate_ibt(struct objtool_file *file) in validate_ibt() argument
4109 for_each_insn(file, insn) in validate_ibt()
4110 warnings += validate_ibt_insn(file, insn); in validate_ibt()
4112 for_each_sec(file, sec) { in validate_ibt()
4146 warnings += validate_ibt_data_reloc(file, reloc); in validate_ibt()
4152 static int validate_sls(struct objtool_file *file) in validate_sls() argument
4157 for_each_insn(file, insn) { in validate_sls()
4158 next_insn = next_insn_same_sec(file, insn); in validate_sls()
4187 static int validate_reachable_instructions(struct objtool_file *file) in validate_reachable_instructions() argument
4191 if (file->ignore_unreachables) in validate_reachable_instructions()
4194 for_each_insn(file, insn) { in validate_reachable_instructions()
4195 if (insn->visited || ignore_unreachable_insn(file, insn)) in validate_reachable_instructions()
4205 int check(struct objtool_file *file) in check() argument
4214 if (!cfi_hash_alloc(1UL << (file->elf->symbol_bits - 3))) in check()
4220 ret = decode_sections(file); in check()
4226 if (list_empty(&file->insn_list)) in check()
4230 ret = validate_retpoline(file); in check()
4237 ret = validate_functions(file); in check()
4242 ret = validate_unwind_hints(file, NULL); in check()
4248 ret = validate_reachable_instructions(file); in check()
4255 ret = validate_noinstr_sections(file); in check()
4266 ret = validate_unret(file); in check()
4273 ret = validate_ibt(file); in check()
4280 ret = validate_sls(file); in check()
4287 ret = create_static_call_sections(file); in check()
4294 ret = create_retpoline_sites_sections(file); in check()
4301 ret = create_return_sites_sections(file); in check()
4308 ret = create_mcount_loc_sections(file); in check()
4315 ret = create_ibt_endbr_seal_sections(file); in check()
4321 if (opts.orc && !list_empty(&file->insn_list)) { in check()
4322 ret = orc_create(file); in check()