| /* SPDX-License-Identifier: GPL-2.0-or-later */ | |
| /* | |
| * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com> | |
| */ | |
| #ifndef _SPECIAL_H | |
| #define _SPECIAL_H | |
| #include <stdbool.h> | |
| #include <objtool/check.h> | |
| #include <objtool/elf.h> | |
| #define C_JUMP_TABLE_SECTION ".data.rel.ro.c_jump_table" | |
| struct special_alt { | |
| struct list_head list; | |
| bool group; | |
| bool jump_or_nop; | |
| u8 key_addend; | |
| struct section *orig_sec; | |
| unsigned long orig_off; | |
| struct section *new_sec; | |
| unsigned long new_off; | |
| unsigned int orig_len, new_len, feature; /* group only */ | |
| }; | |
| int special_get_alts(struct elf *elf, struct list_head *alts); | |
| void arch_handle_alternative(struct special_alt *alt); | |
| /* | |
| * Should the reloc at @offset -- the "new" (replacement) field of a special | |
| * section group entry -- be ignored? The meaning of a zero-length replacement | |
| * is arch specific, so the arch decides. | |
| */ | |
| bool arch_alt_ignore_new_reloc(struct section *sec, unsigned long offset); | |
| bool arch_support_alt_relocation(struct special_alt *special_alt, | |
| struct instruction *insn, | |
| struct reloc *reloc); | |
| struct reloc *arch_find_switch_table(struct objtool_file *file, | |
| struct instruction *insn, | |
| unsigned long *table_size); | |
| const char *arch_cpu_feature_name(int feature_number); | |
| #endif /* _SPECIAL_H */ |