• Home
  • Raw
  • Download

Lines Matching refs:file

32 struct instruction *find_insn(struct objtool_file *file,  in find_insn()  argument
37 hash_for_each_possible(file->insn_hash, insn, hash, offset) in find_insn()
44 static struct instruction *next_insn_same_sec(struct objtool_file *file, in next_insn_same_sec() argument
49 if (!next || &next->list == &file->insn_list || next->sec != insn->sec) in next_insn_same_sec()
55 static struct instruction *next_insn_same_func(struct objtool_file *file, in next_insn_same_func() argument
64 if (&next->list != &file->insn_list && next->func == func) in next_insn_same_func()
72 return find_insn(file, func->cfunc->sec, func->cfunc->offset); in next_insn_same_func()
75 #define func_for_each_insn_all(file, func, insn) \ argument
76 for (insn = find_insn(file, func->sec, func->offset); \
78 insn = next_insn_same_func(file, insn))
80 #define func_for_each_insn(file, func, insn) \ argument
81 for (insn = find_insn(file, func->sec, func->offset); \
82 insn && &insn->list != &file->insn_list && \
87 #define func_for_each_insn_continue_reverse(file, func, insn) \ argument
89 &insn->list != &file->insn_list && \
93 #define sec_for_each_insn_from(file, insn) \ argument
94 for (; insn; insn = next_insn_same_sec(file, insn))
96 #define sec_for_each_insn_continue(file, insn) \ argument
97 for (insn = next_insn_same_sec(file, insn); insn; \
98 insn = next_insn_same_sec(file, insn))
123 static bool __dead_end_function(struct objtool_file *file, struct symbol *func, in __dead_end_function() argument
163 insn = find_insn(file, func->sec, func->offset); in __dead_end_function()
167 func_for_each_insn_all(file, func, insn) { in __dead_end_function()
182 func_for_each_insn_all(file, func, insn) { in __dead_end_function()
200 return __dead_end_function(file, dest->func, recursion+1); in __dead_end_function()
207 static bool dead_end_function(struct objtool_file *file, struct symbol *func) in dead_end_function() argument
209 return __dead_end_function(file, func, 0); in dead_end_function()
230 static int decode_instructions(struct objtool_file *file) in decode_instructions() argument
238 for_each_sec(file, sec) { in decode_instructions()
261 ret = arch_decode_instruction(file->elf, sec, offset, in decode_instructions()
269 hash_add(file->insn_hash, &insn->hash, insn->offset); in decode_instructions()
270 list_add_tail(&insn->list, &file->insn_list); in decode_instructions()
277 if (!find_insn(file, sec, func->offset)) { in decode_instructions()
283 func_for_each_insn(file, func, insn) in decode_instructions()
298 static int add_dead_ends(struct objtool_file *file) in add_dead_ends() argument
309 for_each_insn(file, insn) in add_dead_ends()
316 sec = find_section_by_name(file->elf, ".rela.discard.unreachable"); in add_dead_ends()
325 insn = find_insn(file, rela->sym->sec, rela->addend); in add_dead_ends()
330 list_for_each_entry_reverse(insn, &file->insn_list, list) { in add_dead_ends()
358 sec = find_section_by_name(file->elf, ".rela.discard.reachable"); in add_dead_ends()
367 insn = find_insn(file, rela->sym->sec, rela->addend); in add_dead_ends()
372 list_for_each_entry_reverse(insn, &file->insn_list, list) { in add_dead_ends()
399 static void add_ignores(struct objtool_file *file) in add_ignores() argument
406 sec = find_section_by_name(file->elf, ".rela.discard.func_stack_frame_non_standard"); in add_ignores()
427 func_for_each_insn_all(file, func, insn) in add_ignores()
493 static void add_uaccess_safe(struct objtool_file *file) in add_uaccess_safe() argument
502 func = find_symbol_by_name(file->elf, *name); in add_uaccess_safe()
516 static int add_ignore_alternatives(struct objtool_file *file) in add_ignore_alternatives() argument
522 sec = find_section_by_name(file->elf, ".rela.discard.ignore_alts"); in add_ignore_alternatives()
532 insn = find_insn(file, rela->sym->sec, rela->addend); in add_ignore_alternatives()
547 static int add_jump_destinations(struct objtool_file *file) in add_jump_destinations() argument
554 for_each_insn(file, insn) { in add_jump_destinations()
591 insn->jump_dest = find_insn(file, dest_sec, dest_off); in add_jump_destinations()
649 static int add_call_destinations(struct objtool_file *file) in add_call_destinations() argument
655 for_each_insn(file, insn) { in add_call_destinations()
709 static int handle_group_alt(struct objtool_file *file, in handle_group_alt() argument
719 sec_for_each_insn_from(file, insn) { in handle_group_alt()
727 if (next_insn_same_sec(file, last_orig_insn)) { in handle_group_alt()
757 sec_for_each_insn_from(file, insn) { in handle_group_alt()
807 static int handle_jump_alt(struct objtool_file *file, in handle_jump_alt() argument
831 static int add_special_section_alts(struct objtool_file *file) in add_special_section_alts() argument
839 ret = special_get_alts(file->elf, &special_alts); in add_special_section_alts()
845 orig_insn = find_insn(file, special_alt->orig_sec, in add_special_section_alts()
856 new_insn = find_insn(file, special_alt->new_sec, in add_special_section_alts()
868 ret = handle_group_alt(file, special_alt, orig_insn, in add_special_section_alts()
873 ret = handle_jump_alt(file, special_alt, orig_insn, in add_special_section_alts()
899 static int add_jump_table(struct objtool_file *file, struct instruction *insn, in add_jump_table() argument
927 dest_insn = find_insn(file, rela->sym->sec, rela->addend); in add_jump_table()
998 static struct rela *find_jump_table(struct objtool_file *file, in find_jump_table() argument
1013 &insn->list != &file->insn_list && in find_jump_table()
1066 file->ignore_unreachables = true; in find_jump_table()
1078 static void mark_func_jump_tables(struct objtool_file *file, in mark_func_jump_tables() argument
1084 func_for_each_insn_all(file, func, insn) { in mark_func_jump_tables()
1105 rela = find_jump_table(file, func, insn); in mark_func_jump_tables()
1113 static int add_func_jump_tables(struct objtool_file *file, in add_func_jump_tables() argument
1119 func_for_each_insn_all(file, func, insn) { in add_func_jump_tables()
1123 ret = add_jump_table(file, insn, insn->jump_table); in add_func_jump_tables()
1136 static int add_jump_table_alts(struct objtool_file *file) in add_jump_table_alts() argument
1142 if (!file->rodata) in add_jump_table_alts()
1145 for_each_sec(file, sec) { in add_jump_table_alts()
1150 mark_func_jump_tables(file, func); in add_jump_table_alts()
1151 ret = add_func_jump_tables(file, func); in add_jump_table_alts()
1160 static int read_unwind_hints(struct objtool_file *file) in read_unwind_hints() argument
1169 sec = find_section_by_name(file->elf, ".discard.unwind_hints"); in read_unwind_hints()
1184 file->hints = true; in read_unwind_hints()
1195 insn = find_insn(file, rela->sym->sec, rela->addend); in read_unwind_hints()
1254 static int read_retpoline_hints(struct objtool_file *file) in read_retpoline_hints() argument
1260 sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe"); in read_retpoline_hints()
1270 insn = find_insn(file, rela->sym->sec, rela->addend); in read_retpoline_hints()
1289 static void mark_rodata(struct objtool_file *file) in mark_rodata() argument
1304 for_each_sec(file, sec) { in mark_rodata()
1312 file->rodata = found; in mark_rodata()
1315 static int decode_sections(struct objtool_file *file) in decode_sections() argument
1319 mark_rodata(file); in decode_sections()
1321 ret = decode_instructions(file); in decode_sections()
1325 ret = add_dead_ends(file); in decode_sections()
1329 add_ignores(file); in decode_sections()
1330 add_uaccess_safe(file); in decode_sections()
1332 ret = add_ignore_alternatives(file); in decode_sections()
1336 ret = add_jump_destinations(file); in decode_sections()
1340 ret = add_special_section_alts(file); in decode_sections()
1344 ret = add_call_destinations(file); in decode_sections()
1348 ret = add_jump_table_alts(file); in decode_sections()
1352 ret = read_unwind_hints(file); in decode_sections()
1356 ret = read_retpoline_hints(file); in decode_sections()
1943 static int validate_branch(struct objtool_file *file, struct symbol *func, in validate_branch() argument
1962 next_insn = next_insn_same_sec(file, insn); in validate_branch()
1964 if (file->c_file && func && insn->func && func != insn->func->pfunc) { in validate_branch()
1991 func_for_each_insn_continue_reverse(file, func, i) { in validate_branch()
2037 ret = validate_branch(file, func, alt->insn, state); in validate_branch()
2094 if (dead_end_function(file, insn->call_dest)) in validate_branch()
2107 ret = validate_branch(file, func, in validate_branch()
2225 static int validate_unwind_hints(struct objtool_file *file) in validate_unwind_hints() argument
2231 if (!file->hints) in validate_unwind_hints()
2236 for_each_insn(file, insn) { in validate_unwind_hints()
2238 ret = validate_branch(file, insn->func, insn, state); in validate_unwind_hints()
2248 static int validate_retpoline(struct objtool_file *file) in validate_retpoline() argument
2253 for_each_insn(file, insn) { in validate_retpoline()
2344 static int validate_functions(struct objtool_file *file) in validate_functions() argument
2359 for_each_sec(file, sec) { in validate_functions()
2373 insn = find_insn(file, sec, func->offset); in validate_functions()
2379 ret = validate_branch(file, func, insn, state); in validate_functions()
2389 static int validate_reachable_instructions(struct objtool_file *file) in validate_reachable_instructions() argument
2393 if (file->ignore_unreachables) in validate_reachable_instructions()
2396 for_each_insn(file, insn) { in validate_reachable_instructions()
2407 static void cleanup(struct objtool_file *file) in cleanup() argument
2412 list_for_each_entry_safe(insn, tmpinsn, &file->insn_list, list) { in cleanup()
2421 elf_close(file->elf); in cleanup()
2424 static struct objtool_file file; variable
2432 file.elf = elf_read(objname, orc ? O_RDWR : O_RDONLY); in check()
2433 if (!file.elf) in check()
2436 INIT_LIST_HEAD(&file.insn_list); in check()
2437 hash_init(file.insn_hash); in check()
2438 file.c_file = find_section_by_name(file.elf, ".comment"); in check()
2439 file.ignore_unreachables = no_unreachable; in check()
2440 file.hints = false; in check()
2444 ret = decode_sections(&file); in check()
2449 if (list_empty(&file.insn_list)) in check()
2453 ret = validate_retpoline(&file); in check()
2459 ret = validate_functions(&file); in check()
2464 ret = validate_unwind_hints(&file); in check()
2470 ret = validate_reachable_instructions(&file); in check()
2477 ret = create_orc(&file); in check()
2481 ret = create_orc_sections(&file); in check()
2485 ret = elf_write(file.elf); in check()
2491 cleanup(&file); in check()