Lines Matching refs:sec
37 struct section *sec, unsigned long offset) in find_insn() argument
41 hash_for_each_possible(file->insn_hash, insn, hash, sec_offset_hash(sec, offset)) { in find_insn()
42 if (insn->sec == sec && insn->offset == offset) in find_insn()
54 if (!next || &next->list == &file->insn_list || next->sec != insn->sec) in next_insn_same_sec()
77 return find_insn(file, func->cfunc->sec, func->cfunc->offset); in next_insn_same_func()
92 for (insn = find_insn(file, func->sec, func->offset); \
97 for (insn = find_insn(file, sym->sec, sym->offset); \
99 insn->sec == sym->sec && \
106 insn->sec == sym->sec && insn->offset >= sym->offset; \
198 insn = find_insn(file, func->sec, func->offset); in __dead_end_function()
260 static void init_insn_state(struct insn_state *state, struct section *sec) in init_insn_state() argument
270 if (vmlinux && noinstr && sec) in init_insn_state()
271 state->noinstr = sec->noinstr; in init_insn_state()
352 struct section *sec; in decode_instructions() local
358 for_each_sec(file, sec) { in decode_instructions()
360 if (!(sec->sh.sh_flags & SHF_EXECINSTR)) in decode_instructions()
363 if (strcmp(sec->name, ".altinstr_replacement") && in decode_instructions()
364 strcmp(sec->name, ".altinstr_aux") && in decode_instructions()
365 strncmp(sec->name, ".discard.", 9)) in decode_instructions()
366 sec->text = true; in decode_instructions()
368 if (!strcmp(sec->name, ".noinstr.text") || in decode_instructions()
369 !strcmp(sec->name, ".entry.text")) in decode_instructions()
370 sec->noinstr = true; in decode_instructions()
372 for (offset = 0; offset < sec->sh.sh_size; offset += insn->len) { in decode_instructions()
382 insn->sec = sec; in decode_instructions()
385 ret = arch_decode_instruction(file, sec, offset, in decode_instructions()
386 sec->sh.sh_size - offset, in decode_instructions()
393 hash_add(file->insn_hash, &insn->hash, sec_offset_hash(sec, insn->offset)); in decode_instructions()
398 list_for_each_entry(func, &sec->symbol_list, list) { in decode_instructions()
402 if (!find_insn(file, sec, func->offset)) { in decode_instructions()
440 rel = find_reloc_by_dest_range(file->elf, sym->sec, off, end - off); in add_pv_ops()
446 func = find_symbol_by_offset(rel->sym->sec, rel->addend); in add_pv_ops()
500 struct section *sec) in find_last_insn() argument
504 unsigned int end = (sec->sh.sh_size > 10) ? sec->sh.sh_size - 10 : 0; in find_last_insn()
506 for (offset = sec->sh.sh_size - 1; offset >= end && !insn; offset--) in find_last_insn()
507 insn = find_insn(file, sec, offset); in find_last_insn()
517 struct section *sec; in add_dead_ends() local
532 sec = find_section_by_name(file->elf, ".rela.discard.unreachable"); in add_dead_ends()
533 if (!sec) in add_dead_ends()
536 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_dead_ends()
538 WARN("unexpected relocation symbol type in %s", sec->name); in add_dead_ends()
541 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_dead_ends()
544 else if (reloc->addend == reloc->sym->sec->sh.sh_size) { in add_dead_ends()
545 insn = find_last_insn(file, reloc->sym->sec); in add_dead_ends()
548 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
553 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
567 sec = find_section_by_name(file->elf, ".rela.discard.reachable"); in add_dead_ends()
568 if (!sec) in add_dead_ends()
571 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_dead_ends()
573 WARN("unexpected relocation symbol type in %s", sec->name); in add_dead_ends()
576 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_dead_ends()
579 else if (reloc->addend == reloc->sym->sec->sh.sh_size) { in add_dead_ends()
580 insn = find_last_insn(file, reloc->sym->sec); in add_dead_ends()
583 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
588 reloc->sym->sec->name, reloc->addend); in add_dead_ends()
600 struct section *sec; in create_static_call_sections() local
607 sec = find_section_by_name(file->elf, ".static_call_sites"); in create_static_call_sections()
608 if (sec) { in create_static_call_sections()
621 sec = elf_create_section(file->elf, ".static_call_sites", SHF_WRITE, in create_static_call_sections()
623 if (!sec) in create_static_call_sections()
629 site = (struct static_call_site *)sec->data->d_buf + idx; in create_static_call_sections()
633 if (elf_add_reloc_to_insn(file->elf, sec, in create_static_call_sections()
636 insn->sec, insn->offset)) in create_static_call_sections()
674 if (elf_add_reloc(file->elf, sec, in create_static_call_sections()
689 struct section *sec; in create_retpoline_sites_sections() local
692 sec = find_section_by_name(file->elf, ".retpoline_sites"); in create_retpoline_sites_sections()
693 if (sec) { in create_retpoline_sites_sections()
705 sec = elf_create_section(file->elf, ".retpoline_sites", 0, in create_retpoline_sites_sections()
707 if (!sec) { in create_retpoline_sites_sections()
715 int *site = (int *)sec->data->d_buf + idx; in create_retpoline_sites_sections()
718 if (elf_add_reloc_to_insn(file->elf, sec, in create_retpoline_sites_sections()
721 insn->sec, insn->offset)) { in create_retpoline_sites_sections()
734 struct section *sec; in create_mcount_loc_sections() local
739 sec = find_section_by_name(file->elf, "__mcount_loc"); in create_mcount_loc_sections()
740 if (sec) { in create_mcount_loc_sections()
753 sec = elf_create_section(file->elf, "__mcount_loc", 0, sizeof(unsigned long), idx); in create_mcount_loc_sections()
754 if (!sec) in create_mcount_loc_sections()
760 loc = (unsigned long *)sec->data->d_buf + idx; in create_mcount_loc_sections()
763 if (elf_add_reloc_to_insn(file->elf, sec, in create_mcount_loc_sections()
766 insn->sec, insn->offset)) in create_mcount_loc_sections()
781 struct section *sec; in add_ignores() local
785 sec = find_section_by_name(file->elf, ".rela.discard.func_stack_frame_non_standard"); in add_ignores()
786 if (!sec) in add_ignores()
789 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_ignores()
796 func = find_func_by_offset(reloc->sym->sec, reloc->addend); in add_ignores()
802 WARN("unexpected relocation symbol type in %s: %d", sec->name, reloc->sym->type); in add_ignores()
979 struct section *sec; in add_ignore_alternatives() local
983 sec = find_section_by_name(file->elf, ".rela.discard.ignore_alts"); in add_ignore_alternatives()
984 if (!sec) in add_ignore_alternatives()
987 list_for_each_entry(reloc, &sec->reloc_list, list) { in add_ignore_alternatives()
989 WARN("unexpected relocation symbol type in %s", sec->name); in add_ignore_alternatives()
993 insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_ignore_alternatives()
1021 insn->reloc = find_reloc_by_dest_range(file->elf, insn->sec, in insn_reloc()
1057 if (!strcmp(insn->sec->name, ".altinstr_replacement")) in annotate_call_site()
1075 if (insn->sec->noinstr && sym->kcov) { in annotate_call_site()
1081 elf_write_insn(file->elf, insn->sec, in annotate_call_site()
1092 WARN_FUNC("Tail call to __fentry__ !?!?", insn->sec, insn->offset); in annotate_call_site()
1099 elf_write_insn(file->elf, insn->sec, in annotate_call_site()
1178 dest_sec = insn->sec; in add_jump_destinations()
1181 dest_sec = reloc->sym->sec; in add_jump_destinations()
1190 } else if (reloc->sym->sec->idx) { in add_jump_destinations()
1191 dest_sec = reloc->sym->sec; in add_jump_destinations()
1207 if (!strcmp(insn->sec->name, ".altinstr_replacement")) in add_jump_destinations()
1211 insn->sec, insn->offset, dest_sec->name, in add_jump_destinations()
1253 static struct symbol *find_call_destination(struct section *sec, unsigned long offset) in find_call_destination() argument
1257 call_dest = find_func_by_offset(sec, offset); in find_call_destination()
1259 call_dest = find_symbol_by_offset(sec, offset); in find_call_destination()
1281 dest = find_call_destination(insn->sec, dest_off); in add_call_destinations()
1289 WARN_FUNC("unannotated intra-function call", insn->sec, insn->offset); in add_call_destinations()
1295 insn->sec, insn->offset); in add_call_destinations()
1301 dest = find_call_destination(reloc->sym->sec, dest_off); in add_call_destinations()
1304 insn->sec, insn->offset, in add_call_destinations()
1305 reloc->sym->sec->name, in add_call_destinations()
1385 nop->sec = special_alt->new_sec; in handle_group_alt()
1425 insn->sec, insn->offset); in handle_group_alt()
1441 insn->sec, insn->offset); in handle_group_alt()
1476 orig_insn->sec, orig_insn->offset); in handle_jump_alt()
1487 elf_write_insn(file->elf, orig_insn->sec, in handle_jump_alt()
1556 orig_insn->sec, orig_insn->offset); in add_special_section_alts()
1610 list_for_each_entry_from(reloc, &table->sec->reloc_list, list) { in add_jump_table()
1621 if (reloc->sym->sec == pfunc->sec && in add_jump_table()
1625 dest_insn = find_insn(file, reloc->sym->sec, reloc->addend); in add_jump_table()
1646 insn->sec, insn->offset); in add_jump_table()
1686 dest_insn = find_insn(file, table_reloc->sym->sec, table_reloc->addend); in find_jump_table()
1760 struct section *sec; in add_jump_table_alts() local
1767 for_each_sec(file, sec) { in add_jump_table_alts()
1768 list_for_each_entry(func, &sec->symbol_list, list) { in add_jump_table_alts()
1793 struct section *sec, *relocsec; in read_unwind_hints() local
1799 sec = find_section_by_name(file->elf, ".discard.unwind_hints"); in read_unwind_hints()
1800 if (!sec) in read_unwind_hints()
1803 relocsec = sec->reloc; in read_unwind_hints()
1809 if (sec->sh.sh_size % sizeof(struct unwind_hint)) { in read_unwind_hints()
1816 for (i = 0; i < sec->sh.sh_size / sizeof(struct unwind_hint); i++) { in read_unwind_hints()
1817 hint = (struct unwind_hint *)sec->data->d_buf + i; in read_unwind_hints()
1819 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint)); in read_unwind_hints()
1825 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_unwind_hints()
1843 insn->sec, insn->offset, hint->sp_reg); in read_unwind_hints()
1859 struct section *sec; in read_retpoline_hints() local
1863 sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe"); in read_retpoline_hints()
1864 if (!sec) in read_retpoline_hints()
1867 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_retpoline_hints()
1869 WARN("unexpected relocation symbol type in %s", sec->name); in read_retpoline_hints()
1873 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_retpoline_hints()
1882 insn->sec, insn->offset); in read_retpoline_hints()
1894 struct section *sec; in read_instr_hints() local
1898 sec = find_section_by_name(file->elf, ".rela.discard.instr_end"); in read_instr_hints()
1899 if (!sec) in read_instr_hints()
1902 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_instr_hints()
1904 WARN("unexpected relocation symbol type in %s", sec->name); in read_instr_hints()
1908 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_instr_hints()
1917 sec = find_section_by_name(file->elf, ".rela.discard.instr_begin"); in read_instr_hints()
1918 if (!sec) in read_instr_hints()
1921 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_instr_hints()
1923 WARN("unexpected relocation symbol type in %s", sec->name); in read_instr_hints()
1927 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_instr_hints()
1942 struct section *sec; in read_intra_function_calls() local
1945 sec = find_section_by_name(file->elf, ".rela.discard.intra_function_calls"); in read_intra_function_calls()
1946 if (!sec) in read_intra_function_calls()
1949 list_for_each_entry(reloc, &sec->reloc_list, list) { in read_intra_function_calls()
1954 sec->name); in read_intra_function_calls()
1958 insn = find_insn(file, reloc->sym->sec, reloc->addend); in read_intra_function_calls()
1966 insn->sec, insn->offset); in read_intra_function_calls()
1978 insn->jump_dest = find_insn(file, insn->sec, dest_off); in read_intra_function_calls()
1981 insn->sec, insn->offset, in read_intra_function_calls()
1982 insn->sec->name, dest_off); in read_intra_function_calls()
1992 struct section *sec; in classify_symbols() local
1995 for_each_sec(file, sec) { in classify_symbols()
1996 list_for_each_entry(func, &sec->symbol_list, list) { in classify_symbols()
2020 struct section *sec; in mark_rodata() local
2033 for_each_sec(file, sec) { in mark_rodata()
2034 if (!strncmp(sec->name, ".rodata", 7) && in mark_rodata()
2035 !strstr(sec->name, ".str1.")) { in mark_rodata()
2036 sec->rodata = true; in mark_rodata()
2277 WARN_FUNC("undefined stack state", insn->sec, insn->offset); in update_cfi_state()
2472 insn->sec, insn->offset); in update_cfi_state()
2483 insn->sec, insn->offset); in update_cfi_state()
2579 insn->sec, insn->offset); in update_cfi_state()
2669 insn->sec, insn->offset); in update_cfi_state()
2682 insn->sec, insn->offset); in update_cfi_state()
2719 insn->sec, insn->offset); in propagate_alt_cfi()
2746 insn->sec, insn->offset); in handle_insn_ops()
2779 insn->sec, insn->offset, in insn_cfi_match()
2790 insn->sec, insn->offset, in insn_cfi_match()
2799 insn->sec, insn->offset, cfi1->type, cfi2->type); in insn_cfi_match()
2806 insn->sec, insn->offset, in insn_cfi_match()
2861 if (!target->sec->noinstr) { in pv_call_dest()
2888 if (func->sec->noinstr) in noinstr_call_dest()
2909 insn->sec, insn->offset, call_dest_name(insn)); in validate_call()
2915 insn->sec, insn->offset, call_dest_name(insn)); in validate_call()
2921 insn->sec, insn->offset, call_dest_name(insn)); in validate_call()
2934 insn->sec, insn->offset); in validate_sibling_call()
2945 insn->sec, insn->offset); in validate_return()
2951 insn->sec, insn->offset); in validate_return()
2957 insn->sec, insn->offset); in validate_return()
2963 insn->sec, insn->offset); in validate_return()
2969 insn->sec, insn->offset); in validate_return()
2975 insn->sec, insn->offset); in validate_return()
3009 struct section *sec; in validate_branch() local
3013 sec = insn->sec; in validate_branch()
3026 sec, insn->offset); in validate_branch()
3098 sec, insn->offset); in validate_branch()
3145 sec, insn->offset); in validate_branch()
3152 WARN_FUNC("recursive UACCESS enable", sec, insn->offset); in validate_branch()
3161 WARN_FUNC("redundant UACCESS disable", sec, insn->offset); in validate_branch()
3166 WARN_FUNC("UACCESS-safe disables UACCESS", sec, insn->offset); in validate_branch()
3175 WARN_FUNC("recursive STD", sec, insn->offset); in validate_branch()
3184 WARN_FUNC("redundant CLD", sec, insn->offset); in validate_branch()
3201 WARN("%s: unexpected end of section", sec->name); in validate_branch()
3212 static int validate_unwind_hints(struct objtool_file *file, struct section *sec) in validate_unwind_hints() argument
3221 init_insn_state(&state, sec); in validate_unwind_hints()
3223 if (sec) { in validate_unwind_hints()
3224 insn = find_insn(file, sec, 0); in validate_unwind_hints()
3231 while (&insn->list != &file->insn_list && (!sec || insn->sec == sec)) { in validate_unwind_hints()
3264 if (!strcmp(insn->sec->name, ".init.text") && !module) in validate_retpoline()
3268 insn->sec, insn->offset, in validate_retpoline()
3305 if (!strcmp(insn->sec->name, ".fixup") || in ignore_unreachable_insn()
3306 !strcmp(insn->sec->name, ".altinstr_replacement") || in ignore_unreachable_insn()
3307 !strcmp(insn->sec->name, ".altinstr_aux")) in ignore_unreachable_insn()
3361 static int validate_symbol(struct objtool_file *file, struct section *sec, in validate_symbol() argument
3375 insn = find_insn(file, sec, sym->offset); in validate_symbol()
3387 static int validate_section(struct objtool_file *file, struct section *sec) in validate_section() argument
3393 list_for_each_entry(func, &sec->symbol_list, list) { in validate_section()
3397 init_insn_state(&state, sec); in validate_section()
3400 warnings += validate_symbol(file, sec, func, &state); in validate_section()
3408 struct section *sec; in validate_vmlinux_functions() local
3411 sec = find_section_by_name(file->elf, ".noinstr.text"); in validate_vmlinux_functions()
3412 if (sec) { in validate_vmlinux_functions()
3413 warnings += validate_section(file, sec); in validate_vmlinux_functions()
3414 warnings += validate_unwind_hints(file, sec); in validate_vmlinux_functions()
3417 sec = find_section_by_name(file->elf, ".entry.text"); in validate_vmlinux_functions()
3418 if (sec) { in validate_vmlinux_functions()
3419 warnings += validate_section(file, sec); in validate_vmlinux_functions()
3420 warnings += validate_unwind_hints(file, sec); in validate_vmlinux_functions()
3428 struct section *sec; in validate_functions() local
3431 for_each_sec(file, sec) { in validate_functions()
3432 if (!(sec->sh.sh_flags & SHF_EXECINSTR)) in validate_functions()
3435 warnings += validate_section(file, sec); in validate_functions()
3452 WARN_FUNC("unreachable instruction", insn->sec, insn->offset); in validate_reachable_instructions()