Lines Matching full:sec

32 			      struct section *sec, unsigned long offset)  in find_insn()  argument
36 hash_for_each_possible(file->insn_hash, insn, hash, sec_offset_hash(sec, offset)) { in find_insn()
37 if (insn->sec == sec && insn->offset == offset) in find_insn()
49 if (!next || &next->list == &file->insn_list || next->sec != insn->sec) in next_insn_same_sec()
72 return find_insn(file, func->cfunc->sec, func->cfunc->offset); in next_insn_same_func()
87 for (insn = find_insn(file, func->sec, func->offset); \
92 for (insn = find_insn(file, sym->sec, sym->offset); \
94 insn->sec == sym->sec && \
101 insn->sec == sym->sec && insn->offset >= sym->offset; \
192 insn = find_insn(file, func->sec, func->offset); in __dead_end_function()
254 static void init_insn_state(struct insn_state *state, struct section *sec) in init_insn_state() argument
261 * not correctly determine insn->call_dest->sec (external symbols do in init_insn_state()
264 if (vmlinux && noinstr && sec) in init_insn_state()
265 state->noinstr = sec->noinstr; in init_insn_state()
274 struct section *sec; in decode_instructions() local
281 for_each_sec(file, sec) { in decode_instructions()
283 if (!(sec->sh.sh_flags & SHF_EXECINSTR)) in decode_instructions()
286 if (strcmp(sec->name, ".altinstr_replacement") && in decode_instructions()
287 strcmp(sec->name, ".altinstr_aux") && in decode_instructions()
288 strncmp(sec->name, ".discard.", 9)) in decode_instructions()
289 sec->text = true; in decode_instructions()
291 if (!strcmp(sec->name, ".noinstr.text") || in decode_instructions()
292 !strcmp(sec->name, ".entry.text")) in decode_instructions()
293 sec->noinstr = true; in decode_instructions()
295 for (offset = 0; offset < sec->sh.sh_size; offset += insn->len) { in decode_instructions()
306 insn->sec = sec; in decode_instructions()
309 ret = arch_decode_instruction(file->elf, sec, offset, in decode_instructions()
310 sec->sh.sh_size - offset, in decode_instructions()
317 hash_add(file->insn_hash, &insn->hash, sec_offset_hash(sec, insn->offset)); in decode_instructions()
322 list_for_each_entry(func, &sec->symbol_list, list) { in decode_instructions()
326 if (!find_insn(file, sec, func->offset)) { in decode_instructions()
348 struct section *sec) in find_last_insn() argument
352 unsigned int end = (sec->sh.sh_size > 10) ? sec->sh.sh_size - 10 : 0; in find_last_insn()
354 for (offset = sec->sh.sh_size - 1; offset >= end && !insn; offset--) in find_last_insn()
355 insn = find_insn(file, sec, offset); in find_last_insn()
365 struct section *sec; in add_dead_ends() local
380 sec = find_section_by_name(file->elf, ".rela.discard.unreachable"); in add_dead_ends()
381 if (!sec) in add_dead_ends()
384 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_dead_ends()
386 WARN("unexpected relocation symbol type in %s", sec->name); in add_dead_ends()
389 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_dead_ends()
392 else if (reloc->addend == reloc->sym->sec->sh.sh_size) { in add_dead_ends()
393 insn = find_last_insn(file, reloc->sym->sec); in add_dead_ends()
396 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
401 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
415 sec = find_section_by_name(file->elf, ".rela.discard.reachable"); in add_dead_ends()
416 if (!sec) in add_dead_ends()
419 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_dead_ends()
421 WARN("unexpected relocation symbol type in %s", sec->name); in add_dead_ends()
424 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_dead_ends()
427 else if (reloc->addend == reloc->sym->sec->sh.sh_size) { in add_dead_ends()
428 insn = find_last_insn(file, reloc->sym->sec); in add_dead_ends()
431 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
436 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
448 struct section *sec; in create_static_call_sections() local
455 sec = find_section_by_name(file->elf, ".static_call_sites"); in create_static_call_sections()
456 if (sec) { in create_static_call_sections()
469 sec = elf_create_section(file->elf, ".static_call_sites", SHF_WRITE, in create_static_call_sections()
471 if (!sec) in create_static_call_sections()
477 site = (struct static_call_site *)sec->data->d_buf + idx; in create_static_call_sections()
481 if (elf_add_reloc_to_insn(file->elf, sec, in create_static_call_sections()
484 insn->sec, insn->offset)) in create_static_call_sections()
522 if (elf_add_reloc(file->elf, sec, in create_static_call_sections()
536 struct section *sec; in create_mcount_loc_sections() local
541 sec = find_section_by_name(file->elf, "__mcount_loc"); in create_mcount_loc_sections()
542 if (sec) { in create_mcount_loc_sections()
555 sec = elf_create_section(file->elf, "__mcount_loc", 0, sizeof(unsigned long), idx); in create_mcount_loc_sections()
556 if (!sec) in create_mcount_loc_sections()
562 loc = (unsigned long *)sec->data->d_buf + idx; in create_mcount_loc_sections()
565 if (elf_add_reloc_to_insn(file->elf, sec, in create_mcount_loc_sections()
568 insn->sec, insn->offset)) in create_mcount_loc_sections()
583 struct section *sec; in add_ignores() local
587 sec = find_section_by_name(file->elf, ".rela.discard.func_stack_frame_non_standard"); in add_ignores()
588 if (!sec) in add_ignores()
591 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_ignores()
598 func = find_func_by_offset(reloc->sym->sec, reloc->addend); in add_ignores()
604 WARN("unexpected relocation symbol type in %s: %d", sec->name, reloc->sym->type); in add_ignores()
781 struct section *sec; in add_ignore_alternatives() local
785 sec = find_section_by_name(file->elf, ".rela.discard.ignore_alts"); in add_ignore_alternatives()
786 if (!sec) in add_ignore_alternatives()
789 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_ignore_alternatives()
791 WARN("unexpected relocation symbol type in %s", sec->name); in add_ignore_alternatives()
795 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_ignore_alternatives()
820 insn->reloc = find_reloc_by_dest_range(file->elf, insn->sec, in insn_reloc()
847 dest_sec = insn->sec; in add_jump_destinations()
850 dest_sec = reloc->sym->sec; in add_jump_destinations()
875 } else if (reloc->sym->sec->idx) { in add_jump_destinations()
876 dest_sec = reloc->sym->sec; in add_jump_destinations()
892 if (!strcmp(insn->sec->name, ".altinstr_replacement")) in add_jump_destinations()
896 insn->sec, insn->offset, dest_sec->name, in add_jump_destinations()
953 static struct symbol *find_call_destination(struct section *sec, unsigned long offset) in find_call_destination() argument
957 call_dest = find_func_by_offset(sec, offset); in find_call_destination()
959 call_dest = find_symbol_by_offset(sec, offset); in find_call_destination()
980 insn->call_dest = find_call_destination(insn->sec, dest_off); in add_call_destinations()
986 WARN_FUNC("unannotated intra-function call", insn->sec, insn->offset); in add_call_destinations()
992 insn->sec, insn->offset); in add_call_destinations()
998 insn->call_dest = find_call_destination(reloc->sym->sec, in add_call_destinations()
1002 insn->sec, insn->offset, in add_call_destinations()
1003 reloc->sym->sec->name, in add_call_destinations()
1035 if (insn->sec->noinstr && in add_call_destinations()
1042 elf_write_insn(file->elf, insn->sec, in add_call_destinations()
1054 elf_write_insn(file->elf, insn->sec, in add_call_destinations()
1141 nop->sec = special_alt->new_sec; in handle_group_alt()
1181 insn->sec, insn->offset); in handle_group_alt()
1197 insn->sec, insn->offset); in handle_group_alt()
1232 orig_insn->sec, orig_insn->offset); in handle_jump_alt()
1243 elf_write_insn(file->elf, orig_insn->sec, in handle_jump_alt()
1312 orig_insn->sec, orig_insn->offset); in add_special_section_alts()
1366 list_for_each_entry_from(reloc, &table->sec->reloc_list, list) { in add_jump_table()
1377 if (reloc->sym->sec == pfunc->sec && in add_jump_table()
1381 dest_insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_jump_table()
1402 insn->sec, insn->offset); in add_jump_table()
1442 dest_insn = find_insn(file, table_reloc->sym->sec, table_reloc->addend); in find_jump_table()
1516 struct section *sec; in add_jump_table_alts() local
1523 for_each_sec(file, sec) { in add_jump_table_alts()
1524 list_for_each_entry(func, &sec->symbol_list, list) { in add_jump_table_alts()
1548 struct section *sec, *relocsec; in read_unwind_hints() local
1554 sec = find_section_by_name(file->elf, ".discard.unwind_hints"); in read_unwind_hints()
1555 if (!sec) in read_unwind_hints()
1558 relocsec = sec->reloc; in read_unwind_hints()
1564 if (sec->sh.sh_size % sizeof(struct unwind_hint)) { in read_unwind_hints()
1571 for (i = 0; i < sec->sh.sh_size / sizeof(struct unwind_hint); i++) { in read_unwind_hints()
1572 hint = (struct unwind_hint *)sec->data->d_buf + i; in read_unwind_hints()
1574 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint)); in read_unwind_hints()
1580 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_unwind_hints()
1595 insn->sec, insn->offset, hint->sp_reg); in read_unwind_hints()
1609 struct section *sec; in read_retpoline_hints() local
1613 sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe"); in read_retpoline_hints()
1614 if (!sec) in read_retpoline_hints()
1617 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_retpoline_hints()
1619 WARN("unexpected relocation symbol type in %s", sec->name); in read_retpoline_hints()
1623 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_retpoline_hints()
1632 insn->sec, insn->offset); in read_retpoline_hints()
1644 struct section *sec; in read_instr_hints() local
1648 sec = find_section_by_name(file->elf, ".rela.discard.instr_end"); in read_instr_hints()
1649 if (!sec) in read_instr_hints()
1652 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_instr_hints()
1654 WARN("unexpected relocation symbol type in %s", sec->name); in read_instr_hints()
1658 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_instr_hints()
1667 sec = find_section_by_name(file->elf, ".rela.discard.instr_begin"); in read_instr_hints()
1668 if (!sec) in read_instr_hints()
1671 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_instr_hints()
1673 WARN("unexpected relocation symbol type in %s", sec->name); in read_instr_hints()
1677 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_instr_hints()
1692 struct section *sec; in read_intra_function_calls() local
1695 sec = find_section_by_name(file->elf, ".rela.discard.intra_function_calls"); in read_intra_function_calls()
1696 if (!sec) in read_intra_function_calls()
1699 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_intra_function_calls()
1704 sec->name); in read_intra_function_calls()
1708 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_intra_function_calls()
1716 insn->sec, insn->offset); in read_intra_function_calls()
1728 insn->jump_dest = find_insn(file, insn->sec, dest_off); in read_intra_function_calls()
1731 insn->sec, insn->offset, in read_intra_function_calls()
1732 insn->sec->name, dest_off); in read_intra_function_calls()
1742 struct section *sec; in read_static_call_tramps() local
1745 for_each_sec(file, sec) { in read_static_call_tramps()
1746 list_for_each_entry(func, &sec->symbol_list, list) { in read_static_call_tramps()
1759 struct section *sec; in mark_rodata() local
1772 for_each_sec(file, sec) { in mark_rodata()
1773 if (!strncmp(sec->name, ".rodata", 7) && in mark_rodata()
1774 !strstr(sec->name, ".str1.")) { in mark_rodata()
1775 sec->rodata = true; in mark_rodata()
2026 WARN_FUNC("undefined stack state", insn->sec, insn->offset); in update_cfi_state()
2221 insn->sec, insn->offset); in update_cfi_state()
2232 insn->sec, insn->offset); in update_cfi_state()
2328 insn->sec, insn->offset); in update_cfi_state()
2418 insn->sec, insn->offset); in update_cfi_state()
2431 insn->sec, insn->offset); in update_cfi_state()
2463 insn->sec, insn->offset); in propagate_alt_cfi()
2490 insn->sec, insn->offset); in handle_insn_ops()
2518 insn->sec, insn->offset, in insn_cfi_match()
2529 insn->sec, insn->offset, in insn_cfi_match()
2538 insn->sec, insn->offset, cfi1->type, cfi2->type); in insn_cfi_match()
2545 insn->sec, insn->offset, in insn_cfi_match()
2583 if (func->sec->noinstr) in noinstr_call_dest()
2602 insn->sec, insn->offset, call_dest_name(insn)); in validate_call()
2608 insn->sec, insn->offset, call_dest_name(insn)); in validate_call()
2614 insn->sec, insn->offset, call_dest_name(insn)); in validate_call()
2625 insn->sec, insn->offset); in validate_sibling_call()
2636 insn->sec, insn->offset); in validate_return()
2642 insn->sec, insn->offset); in validate_return()
2648 insn->sec, insn->offset); in validate_return()
2654 insn->sec, insn->offset); in validate_return()
2660 insn->sec, insn->offset); in validate_return()
2666 insn->sec, insn->offset); in validate_return()
2700 struct section *sec; in validate_branch() local
2704 sec = insn->sec; in validate_branch()
2717 sec, insn->offset); in validate_branch()
2779 sec, insn->offset); in validate_branch()
2826 sec, insn->offset); in validate_branch()
2833 WARN_FUNC("recursive UACCESS enable", sec, insn->offset); in validate_branch()
2842 WARN_FUNC("redundant UACCESS disable", sec, insn->offset); in validate_branch()
2847 WARN_FUNC("UACCESS-safe disables UACCESS", sec, insn->offset); in validate_branch()
2856 WARN_FUNC("recursive STD", sec, insn->offset); in validate_branch()
2865 WARN_FUNC("redundant CLD", sec, insn->offset); in validate_branch()
2882 WARN("%s: unexpected end of section", sec->name); in validate_branch()
2892 static int validate_unwind_hints(struct objtool_file *file, struct section *sec) in validate_unwind_hints() argument
2901 init_insn_state(&state, sec); in validate_unwind_hints()
2903 if (sec) { in validate_unwind_hints()
2904 insn = find_insn(file, sec, 0); in validate_unwind_hints()
2911 while (&insn->list != &file->insn_list && (!sec || insn->sec == sec)) { in validate_unwind_hints()
2944 if (!strcmp(insn->sec->name, ".init.text") && !module) in validate_retpoline()
2948 insn->sec, insn->offset, in validate_retpoline()
2985 if (!strcmp(insn->sec->name, ".fixup") || in ignore_unreachable_insn()
2986 !strcmp(insn->sec->name, ".altinstr_replacement") || in ignore_unreachable_insn()
2987 !strcmp(insn->sec->name, ".altinstr_aux")) in ignore_unreachable_insn()
3038 static int validate_symbol(struct objtool_file *file, struct section *sec, in validate_symbol() argument
3052 insn = find_insn(file, sec, sym->offset); in validate_symbol()
3064 static int validate_section(struct objtool_file *file, struct section *sec) in validate_section() argument
3070 list_for_each_entry(func, &sec->symbol_list, list) { in validate_section()
3074 init_insn_state(&state, sec); in validate_section()
3077 warnings += validate_symbol(file, sec, func, &state); in validate_section()
3085 struct section *sec; in validate_vmlinux_functions() local
3088 sec = find_section_by_name(file->elf, ".noinstr.text"); in validate_vmlinux_functions()
3089 if (sec) { in validate_vmlinux_functions()
3090 warnings += validate_section(file, sec); in validate_vmlinux_functions()
3091 warnings += validate_unwind_hints(file, sec); in validate_vmlinux_functions()
3094 sec = find_section_by_name(file->elf, ".entry.text"); in validate_vmlinux_functions()
3095 if (sec) { in validate_vmlinux_functions()
3096 warnings += validate_section(file, sec); in validate_vmlinux_functions()
3097 warnings += validate_unwind_hints(file, sec); in validate_vmlinux_functions()
3105 struct section *sec; in validate_functions() local
3108 for_each_sec(file, sec) { in validate_functions()
3109 if (!(sec->sh.sh_flags & SHF_EXECINSTR)) in validate_functions()
3112 warnings += validate_section(file, sec); in validate_functions()
3129 WARN_FUNC("unreachable instruction", insn->sec, insn->offset); in validate_reachable_instructions()