Lines Matching +full:- +full:alt

1 // SPDX-License-Identifier: GPL-2.0-or-later
54 void __weak arch_handle_alternative(unsigned short feature, struct special_alt *alt) in arch_handle_alternative() argument
61 *sec = reloc->sym->sec; in reloc_to_sec_off()
62 *off = reloc->sym->offset + reloc->addend; in reloc_to_sec_off()
67 struct special_alt *alt) in get_alt_entry() argument
72 offset = idx * entry->size; in get_alt_entry()
74 alt->group = entry->group; in get_alt_entry()
75 alt->jump_or_nop = entry->jump_or_nop; in get_alt_entry()
77 if (alt->group) { in get_alt_entry()
78 alt->orig_len = *(unsigned char *)(sec->data->d_buf + offset + in get_alt_entry()
79 entry->orig_len); in get_alt_entry()
80 alt->new_len = *(unsigned char *)(sec->data->d_buf + offset + in get_alt_entry()
81 entry->new_len); in get_alt_entry()
84 if (entry->feature) { in get_alt_entry()
87 feature = *(unsigned short *)(sec->data->d_buf + offset + in get_alt_entry()
88 entry->feature); in get_alt_entry()
89 arch_handle_alternative(feature, alt); in get_alt_entry()
92 orig_reloc = find_reloc_by_dest(elf, sec, offset + entry->orig); in get_alt_entry()
94 WARN_FUNC("can't find orig reloc", sec, offset + entry->orig); in get_alt_entry()
95 return -1; in get_alt_entry()
98 reloc_to_sec_off(orig_reloc, &alt->orig_sec, &alt->orig_off); in get_alt_entry()
100 if (!entry->group || alt->new_len) { in get_alt_entry()
101 new_reloc = find_reloc_by_dest(elf, sec, offset + entry->new); in get_alt_entry()
104 sec, offset + entry->new); in get_alt_entry()
105 return -1; in get_alt_entry()
108 reloc_to_sec_off(new_reloc, &alt->new_sec, &alt->new_off); in get_alt_entry()
111 if (alt->new_off >= 0x7ffffff0) in get_alt_entry()
112 alt->new_off -= 0x7ffffff0; in get_alt_entry()
128 struct special_alt *alt; in special_get_alts() local
133 for (entry = entries; entry->sec; entry++) { in special_get_alts()
134 sec = find_section_by_name(elf, entry->sec); in special_get_alts()
138 if (sec->len % entry->size != 0) { in special_get_alts()
140 sec->name, entry->size); in special_get_alts()
141 return -1; in special_get_alts()
144 nr_entries = sec->len / entry->size; in special_get_alts()
147 alt = malloc(sizeof(*alt)); in special_get_alts()
148 if (!alt) { in special_get_alts()
150 return -1; in special_get_alts()
152 memset(alt, 0, sizeof(*alt)); in special_get_alts()
154 ret = get_alt_entry(elf, entry, sec, idx, alt); in special_get_alts()
160 list_add_tail(&alt->list, alts); in special_get_alts()