Merge tag 'docs-6.0' of git://git.lwn.net/linux
[sfrench/cifs-2.6.git] / tools / objtool / check.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2015-2017 Josh Poimboeuf <jpoimboe@redhat.com>
4  */
5
6 #include <string.h>
7 #include <stdlib.h>
8 #include <inttypes.h>
9 #include <sys/mman.h>
10
11 #include <arch/elf.h>
12 #include <objtool/builtin.h>
13 #include <objtool/cfi.h>
14 #include <objtool/arch.h>
15 #include <objtool/check.h>
16 #include <objtool/special.h>
17 #include <objtool/warn.h>
18 #include <objtool/endianness.h>
19
20 #include <linux/objtool.h>
21 #include <linux/hashtable.h>
22 #include <linux/kernel.h>
23 #include <linux/static_call_types.h>
24
25 struct alternative {
26         struct list_head list;
27         struct instruction *insn;
28         bool skip_orig;
29 };
30
31 static unsigned long nr_cfi, nr_cfi_reused, nr_cfi_cache;
32
33 static struct cfi_init_state initial_func_cfi;
34 static struct cfi_state init_cfi;
35 static struct cfi_state func_cfi;
36
37 struct instruction *find_insn(struct objtool_file *file,
38                               struct section *sec, unsigned long offset)
39 {
40         struct instruction *insn;
41
42         hash_for_each_possible(file->insn_hash, insn, hash, sec_offset_hash(sec, offset)) {
43                 if (insn->sec == sec && insn->offset == offset)
44                         return insn;
45         }
46
47         return NULL;
48 }
49
50 static struct instruction *next_insn_same_sec(struct objtool_file *file,
51                                               struct instruction *insn)
52 {
53         struct instruction *next = list_next_entry(insn, list);
54
55         if (!next || &next->list == &file->insn_list || next->sec != insn->sec)
56                 return NULL;
57
58         return next;
59 }
60
61 static struct instruction *next_insn_same_func(struct objtool_file *file,
62                                                struct instruction *insn)
63 {
64         struct instruction *next = list_next_entry(insn, list);
65         struct symbol *func = insn->func;
66
67         if (!func)
68                 return NULL;
69
70         if (&next->list != &file->insn_list && next->func == func)
71                 return next;
72
73         /* Check if we're already in the subfunction: */
74         if (func == func->cfunc)
75                 return NULL;
76
77         /* Move to the subfunction: */
78         return find_insn(file, func->cfunc->sec, func->cfunc->offset);
79 }
80
81 static struct instruction *prev_insn_same_sym(struct objtool_file *file,
82                                                struct instruction *insn)
83 {
84         struct instruction *prev = list_prev_entry(insn, list);
85
86         if (&prev->list != &file->insn_list && prev->func == insn->func)
87                 return prev;
88
89         return NULL;
90 }
91
92 #define func_for_each_insn(file, func, insn)                            \
93         for (insn = find_insn(file, func->sec, func->offset);           \
94              insn;                                                      \
95              insn = next_insn_same_func(file, insn))
96
97 #define sym_for_each_insn(file, sym, insn)                              \
98         for (insn = find_insn(file, sym->sec, sym->offset);             \
99              insn && &insn->list != &file->insn_list &&                 \
100                 insn->sec == sym->sec &&                                \
101                 insn->offset < sym->offset + sym->len;                  \
102              insn = list_next_entry(insn, list))
103
104 #define sym_for_each_insn_continue_reverse(file, sym, insn)             \
105         for (insn = list_prev_entry(insn, list);                        \
106              &insn->list != &file->insn_list &&                         \
107                 insn->sec == sym->sec && insn->offset >= sym->offset;   \
108              insn = list_prev_entry(insn, list))
109
110 #define sec_for_each_insn_from(file, insn)                              \
111         for (; insn; insn = next_insn_same_sec(file, insn))
112
113 #define sec_for_each_insn_continue(file, insn)                          \
114         for (insn = next_insn_same_sec(file, insn); insn;               \
115              insn = next_insn_same_sec(file, insn))
116
117 static bool is_jump_table_jump(struct instruction *insn)
118 {
119         struct alt_group *alt_group = insn->alt_group;
120
121         if (insn->jump_table)
122                 return true;
123
124         /* Retpoline alternative for a jump table? */
125         return alt_group && alt_group->orig_group &&
126                alt_group->orig_group->first_insn->jump_table;
127 }
128
129 static bool is_sibling_call(struct instruction *insn)
130 {
131         /*
132          * Assume only ELF functions can make sibling calls.  This ensures
133          * sibling call detection consistency between vmlinux.o and individual
134          * objects.
135          */
136         if (!insn->func)
137                 return false;
138
139         /* An indirect jump is either a sibling call or a jump to a table. */
140         if (insn->type == INSN_JUMP_DYNAMIC)
141                 return !is_jump_table_jump(insn);
142
143         /* add_jump_destinations() sets insn->call_dest for sibling calls. */
144         return (is_static_jump(insn) && insn->call_dest);
145 }
146
147 /*
148  * This checks to see if the given function is a "noreturn" function.
149  *
150  * For global functions which are outside the scope of this object file, we
151  * have to keep a manual list of them.
152  *
153  * For local functions, we have to detect them manually by simply looking for
154  * the lack of a return instruction.
155  */
156 static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
157                                 int recursion)
158 {
159         int i;
160         struct instruction *insn;
161         bool empty = true;
162
163         /*
164          * Unfortunately these have to be hard coded because the noreturn
165          * attribute isn't provided in ELF data.
166          */
167         static const char * const global_noreturns[] = {
168                 "__stack_chk_fail",
169                 "panic",
170                 "do_exit",
171                 "do_task_dead",
172                 "kthread_exit",
173                 "make_task_dead",
174                 "__module_put_and_kthread_exit",
175                 "kthread_complete_and_exit",
176                 "__reiserfs_panic",
177                 "lbug_with_loc",
178                 "fortify_panic",
179                 "usercopy_abort",
180                 "machine_real_restart",
181                 "rewind_stack_and_make_dead",
182                 "kunit_try_catch_throw",
183                 "xen_start_kernel",
184                 "cpu_bringup_and_idle",
185                 "do_group_exit",
186                 "stop_this_cpu",
187                 "__invalid_creds",
188                 "cpu_startup_entry",
189                 "__ubsan_handle_builtin_unreachable",
190                 "ex_handler_msr_mce",
191         };
192
193         if (!func)
194                 return false;
195
196         if (func->bind == STB_WEAK)
197                 return false;
198
199         if (func->bind == STB_GLOBAL)
200                 for (i = 0; i < ARRAY_SIZE(global_noreturns); i++)
201                         if (!strcmp(func->name, global_noreturns[i]))
202                                 return true;
203
204         if (!func->len)
205                 return false;
206
207         insn = find_insn(file, func->sec, func->offset);
208         if (!insn->func)
209                 return false;
210
211         func_for_each_insn(file, func, insn) {
212                 empty = false;
213
214                 if (insn->type == INSN_RETURN)
215                         return false;
216         }
217
218         if (empty)
219                 return false;
220
221         /*
222          * A function can have a sibling call instead of a return.  In that
223          * case, the function's dead-end status depends on whether the target
224          * of the sibling call returns.
225          */
226         func_for_each_insn(file, func, insn) {
227                 if (is_sibling_call(insn)) {
228                         struct instruction *dest = insn->jump_dest;
229
230                         if (!dest)
231                                 /* sibling call to another file */
232                                 return false;
233
234                         /* local sibling call */
235                         if (recursion == 5) {
236                                 /*
237                                  * Infinite recursion: two functions have
238                                  * sibling calls to each other.  This is a very
239                                  * rare case.  It means they aren't dead ends.
240                                  */
241                                 return false;
242                         }
243
244                         return __dead_end_function(file, dest->func, recursion+1);
245                 }
246         }
247
248         return true;
249 }
250
251 static bool dead_end_function(struct objtool_file *file, struct symbol *func)
252 {
253         return __dead_end_function(file, func, 0);
254 }
255
256 static void init_cfi_state(struct cfi_state *cfi)
257 {
258         int i;
259
260         for (i = 0; i < CFI_NUM_REGS; i++) {
261                 cfi->regs[i].base = CFI_UNDEFINED;
262                 cfi->vals[i].base = CFI_UNDEFINED;
263         }
264         cfi->cfa.base = CFI_UNDEFINED;
265         cfi->drap_reg = CFI_UNDEFINED;
266         cfi->drap_offset = -1;
267 }
268
269 static void init_insn_state(struct objtool_file *file, struct insn_state *state,
270                             struct section *sec)
271 {
272         memset(state, 0, sizeof(*state));
273         init_cfi_state(&state->cfi);
274
275         /*
276          * We need the full vmlinux for noinstr validation, otherwise we can
277          * not correctly determine insn->call_dest->sec (external symbols do
278          * not have a section).
279          */
280         if (opts.link && opts.noinstr && sec)
281                 state->noinstr = sec->noinstr;
282 }
283
284 static struct cfi_state *cfi_alloc(void)
285 {
286         struct cfi_state *cfi = calloc(sizeof(struct cfi_state), 1);
287         if (!cfi) {
288                 WARN("calloc failed");
289                 exit(1);
290         }
291         nr_cfi++;
292         return cfi;
293 }
294
295 static int cfi_bits;
296 static struct hlist_head *cfi_hash;
297
298 static inline bool cficmp(struct cfi_state *cfi1, struct cfi_state *cfi2)
299 {
300         return memcmp((void *)cfi1 + sizeof(cfi1->hash),
301                       (void *)cfi2 + sizeof(cfi2->hash),
302                       sizeof(struct cfi_state) - sizeof(struct hlist_node));
303 }
304
305 static inline u32 cfi_key(struct cfi_state *cfi)
306 {
307         return jhash((void *)cfi + sizeof(cfi->hash),
308                      sizeof(*cfi) - sizeof(cfi->hash), 0);
309 }
310
311 static struct cfi_state *cfi_hash_find_or_add(struct cfi_state *cfi)
312 {
313         struct hlist_head *head = &cfi_hash[hash_min(cfi_key(cfi), cfi_bits)];
314         struct cfi_state *obj;
315
316         hlist_for_each_entry(obj, head, hash) {
317                 if (!cficmp(cfi, obj)) {
318                         nr_cfi_cache++;
319                         return obj;
320                 }
321         }
322
323         obj = cfi_alloc();
324         *obj = *cfi;
325         hlist_add_head(&obj->hash, head);
326
327         return obj;
328 }
329
330 static void cfi_hash_add(struct cfi_state *cfi)
331 {
332         struct hlist_head *head = &cfi_hash[hash_min(cfi_key(cfi), cfi_bits)];
333
334         hlist_add_head(&cfi->hash, head);
335 }
336
337 static void *cfi_hash_alloc(unsigned long size)
338 {
339         cfi_bits = max(10, ilog2(size));
340         cfi_hash = mmap(NULL, sizeof(struct hlist_head) << cfi_bits,
341                         PROT_READ|PROT_WRITE,
342                         MAP_PRIVATE|MAP_ANON, -1, 0);
343         if (cfi_hash == (void *)-1L) {
344                 WARN("mmap fail cfi_hash");
345                 cfi_hash = NULL;
346         }  else if (opts.stats) {
347                 printf("cfi_bits: %d\n", cfi_bits);
348         }
349
350         return cfi_hash;
351 }
352
353 static unsigned long nr_insns;
354 static unsigned long nr_insns_visited;
355
356 /*
357  * Call the arch-specific instruction decoder for all the instructions and add
358  * them to the global instruction list.
359  */
360 static int decode_instructions(struct objtool_file *file)
361 {
362         struct section *sec;
363         struct symbol *func;
364         unsigned long offset;
365         struct instruction *insn;
366         int ret;
367
368         for_each_sec(file, sec) {
369
370                 if (!(sec->sh.sh_flags & SHF_EXECINSTR))
371                         continue;
372
373                 if (strcmp(sec->name, ".altinstr_replacement") &&
374                     strcmp(sec->name, ".altinstr_aux") &&
375                     strncmp(sec->name, ".discard.", 9))
376                         sec->text = true;
377
378                 if (!strcmp(sec->name, ".noinstr.text") ||
379                     !strcmp(sec->name, ".entry.text") ||
380                     !strncmp(sec->name, ".text.__x86.", 12))
381                         sec->noinstr = true;
382
383                 for (offset = 0; offset < sec->sh.sh_size; offset += insn->len) {
384                         insn = malloc(sizeof(*insn));
385                         if (!insn) {
386                                 WARN("malloc failed");
387                                 return -1;
388                         }
389                         memset(insn, 0, sizeof(*insn));
390                         INIT_LIST_HEAD(&insn->alts);
391                         INIT_LIST_HEAD(&insn->stack_ops);
392                         INIT_LIST_HEAD(&insn->call_node);
393
394                         insn->sec = sec;
395                         insn->offset = offset;
396
397                         ret = arch_decode_instruction(file, sec, offset,
398                                                       sec->sh.sh_size - offset,
399                                                       &insn->len, &insn->type,
400                                                       &insn->immediate,
401                                                       &insn->stack_ops);
402                         if (ret)
403                                 goto err;
404
405                         /*
406                          * By default, "ud2" is a dead end unless otherwise
407                          * annotated, because GCC 7 inserts it for certain
408                          * divide-by-zero cases.
409                          */
410                         if (insn->type == INSN_BUG)
411                                 insn->dead_end = true;
412
413                         hash_add(file->insn_hash, &insn->hash, sec_offset_hash(sec, insn->offset));
414                         list_add_tail(&insn->list, &file->insn_list);
415                         nr_insns++;
416                 }
417
418                 list_for_each_entry(func, &sec->symbol_list, list) {
419                         if (func->type != STT_FUNC || func->alias != func)
420                                 continue;
421
422                         if (!find_insn(file, sec, func->offset)) {
423                                 WARN("%s(): can't find starting instruction",
424                                      func->name);
425                                 return -1;
426                         }
427
428                         sym_for_each_insn(file, func, insn) {
429                                 insn->func = func;
430                                 if (insn->type == INSN_ENDBR && list_empty(&insn->call_node)) {
431                                         if (insn->offset == insn->func->offset) {
432                                                 list_add_tail(&insn->call_node, &file->endbr_list);
433                                                 file->nr_endbr++;
434                                         } else {
435                                                 file->nr_endbr_int++;
436                                         }
437                                 }
438                         }
439                 }
440         }
441
442         if (opts.stats)
443                 printf("nr_insns: %lu\n", nr_insns);
444
445         return 0;
446
447 err:
448         free(insn);
449         return ret;
450 }
451
452 /*
453  * Read the pv_ops[] .data table to find the static initialized values.
454  */
455 static int add_pv_ops(struct objtool_file *file, const char *symname)
456 {
457         struct symbol *sym, *func;
458         unsigned long off, end;
459         struct reloc *rel;
460         int idx;
461
462         sym = find_symbol_by_name(file->elf, symname);
463         if (!sym)
464                 return 0;
465
466         off = sym->offset;
467         end = off + sym->len;
468         for (;;) {
469                 rel = find_reloc_by_dest_range(file->elf, sym->sec, off, end - off);
470                 if (!rel)
471                         break;
472
473                 func = rel->sym;
474                 if (func->type == STT_SECTION)
475                         func = find_symbol_by_offset(rel->sym->sec, rel->addend);
476
477                 idx = (rel->offset - sym->offset) / sizeof(unsigned long);
478
479                 objtool_pv_add(file, idx, func);
480
481                 off = rel->offset + 1;
482                 if (off > end)
483                         break;
484         }
485
486         return 0;
487 }
488
489 /*
490  * Allocate and initialize file->pv_ops[].
491  */
492 static int init_pv_ops(struct objtool_file *file)
493 {
494         static const char *pv_ops_tables[] = {
495                 "pv_ops",
496                 "xen_cpu_ops",
497                 "xen_irq_ops",
498                 "xen_mmu_ops",
499                 NULL,
500         };
501         const char *pv_ops;
502         struct symbol *sym;
503         int idx, nr;
504
505         if (!opts.noinstr)
506                 return 0;
507
508         file->pv_ops = NULL;
509
510         sym = find_symbol_by_name(file->elf, "pv_ops");
511         if (!sym)
512                 return 0;
513
514         nr = sym->len / sizeof(unsigned long);
515         file->pv_ops = calloc(sizeof(struct pv_state), nr);
516         if (!file->pv_ops)
517                 return -1;
518
519         for (idx = 0; idx < nr; idx++)
520                 INIT_LIST_HEAD(&file->pv_ops[idx].targets);
521
522         for (idx = 0; (pv_ops = pv_ops_tables[idx]); idx++)
523                 add_pv_ops(file, pv_ops);
524
525         return 0;
526 }
527
528 static struct instruction *find_last_insn(struct objtool_file *file,
529                                           struct section *sec)
530 {
531         struct instruction *insn = NULL;
532         unsigned int offset;
533         unsigned int end = (sec->sh.sh_size > 10) ? sec->sh.sh_size - 10 : 0;
534
535         for (offset = sec->sh.sh_size - 1; offset >= end && !insn; offset--)
536                 insn = find_insn(file, sec, offset);
537
538         return insn;
539 }
540
541 /*
542  * Mark "ud2" instructions and manually annotated dead ends.
543  */
544 static int add_dead_ends(struct objtool_file *file)
545 {
546         struct section *sec;
547         struct reloc *reloc;
548         struct instruction *insn;
549
550         /*
551          * Check for manually annotated dead ends.
552          */
553         sec = find_section_by_name(file->elf, ".rela.discard.unreachable");
554         if (!sec)
555                 goto reachable;
556
557         list_for_each_entry(reloc, &sec->reloc_list, list) {
558                 if (reloc->sym->type != STT_SECTION) {
559                         WARN("unexpected relocation symbol type in %s", sec->name);
560                         return -1;
561                 }
562                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
563                 if (insn)
564                         insn = list_prev_entry(insn, list);
565                 else if (reloc->addend == reloc->sym->sec->sh.sh_size) {
566                         insn = find_last_insn(file, reloc->sym->sec);
567                         if (!insn) {
568                                 WARN("can't find unreachable insn at %s+0x%" PRIx64,
569                                      reloc->sym->sec->name, reloc->addend);
570                                 return -1;
571                         }
572                 } else {
573                         WARN("can't find unreachable insn at %s+0x%" PRIx64,
574                              reloc->sym->sec->name, reloc->addend);
575                         return -1;
576                 }
577
578                 insn->dead_end = true;
579         }
580
581 reachable:
582         /*
583          * These manually annotated reachable checks are needed for GCC 4.4,
584          * where the Linux unreachable() macro isn't supported.  In that case
585          * GCC doesn't know the "ud2" is fatal, so it generates code as if it's
586          * not a dead end.
587          */
588         sec = find_section_by_name(file->elf, ".rela.discard.reachable");
589         if (!sec)
590                 return 0;
591
592         list_for_each_entry(reloc, &sec->reloc_list, list) {
593                 if (reloc->sym->type != STT_SECTION) {
594                         WARN("unexpected relocation symbol type in %s", sec->name);
595                         return -1;
596                 }
597                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
598                 if (insn)
599                         insn = list_prev_entry(insn, list);
600                 else if (reloc->addend == reloc->sym->sec->sh.sh_size) {
601                         insn = find_last_insn(file, reloc->sym->sec);
602                         if (!insn) {
603                                 WARN("can't find reachable insn at %s+0x%" PRIx64,
604                                      reloc->sym->sec->name, reloc->addend);
605                                 return -1;
606                         }
607                 } else {
608                         WARN("can't find reachable insn at %s+0x%" PRIx64,
609                              reloc->sym->sec->name, reloc->addend);
610                         return -1;
611                 }
612
613                 insn->dead_end = false;
614         }
615
616         return 0;
617 }
618
619 static int create_static_call_sections(struct objtool_file *file)
620 {
621         struct section *sec;
622         struct static_call_site *site;
623         struct instruction *insn;
624         struct symbol *key_sym;
625         char *key_name, *tmp;
626         int idx;
627
628         sec = find_section_by_name(file->elf, ".static_call_sites");
629         if (sec) {
630                 INIT_LIST_HEAD(&file->static_call_list);
631                 WARN("file already has .static_call_sites section, skipping");
632                 return 0;
633         }
634
635         if (list_empty(&file->static_call_list))
636                 return 0;
637
638         idx = 0;
639         list_for_each_entry(insn, &file->static_call_list, call_node)
640                 idx++;
641
642         sec = elf_create_section(file->elf, ".static_call_sites", SHF_WRITE,
643                                  sizeof(struct static_call_site), idx);
644         if (!sec)
645                 return -1;
646
647         idx = 0;
648         list_for_each_entry(insn, &file->static_call_list, call_node) {
649
650                 site = (struct static_call_site *)sec->data->d_buf + idx;
651                 memset(site, 0, sizeof(struct static_call_site));
652
653                 /* populate reloc for 'addr' */
654                 if (elf_add_reloc_to_insn(file->elf, sec,
655                                           idx * sizeof(struct static_call_site),
656                                           R_X86_64_PC32,
657                                           insn->sec, insn->offset))
658                         return -1;
659
660                 /* find key symbol */
661                 key_name = strdup(insn->call_dest->name);
662                 if (!key_name) {
663                         perror("strdup");
664                         return -1;
665                 }
666                 if (strncmp(key_name, STATIC_CALL_TRAMP_PREFIX_STR,
667                             STATIC_CALL_TRAMP_PREFIX_LEN)) {
668                         WARN("static_call: trampoline name malformed: %s", key_name);
669                         return -1;
670                 }
671                 tmp = key_name + STATIC_CALL_TRAMP_PREFIX_LEN - STATIC_CALL_KEY_PREFIX_LEN;
672                 memcpy(tmp, STATIC_CALL_KEY_PREFIX_STR, STATIC_CALL_KEY_PREFIX_LEN);
673
674                 key_sym = find_symbol_by_name(file->elf, tmp);
675                 if (!key_sym) {
676                         if (!opts.module) {
677                                 WARN("static_call: can't find static_call_key symbol: %s", tmp);
678                                 return -1;
679                         }
680
681                         /*
682                          * For modules(), the key might not be exported, which
683                          * means the module can make static calls but isn't
684                          * allowed to change them.
685                          *
686                          * In that case we temporarily set the key to be the
687                          * trampoline address.  This is fixed up in
688                          * static_call_add_module().
689                          */
690                         key_sym = insn->call_dest;
691                 }
692                 free(key_name);
693
694                 /* populate reloc for 'key' */
695                 if (elf_add_reloc(file->elf, sec,
696                                   idx * sizeof(struct static_call_site) + 4,
697                                   R_X86_64_PC32, key_sym,
698                                   is_sibling_call(insn) * STATIC_CALL_SITE_TAIL))
699                         return -1;
700
701                 idx++;
702         }
703
704         return 0;
705 }
706
707 static int create_retpoline_sites_sections(struct objtool_file *file)
708 {
709         struct instruction *insn;
710         struct section *sec;
711         int idx;
712
713         sec = find_section_by_name(file->elf, ".retpoline_sites");
714         if (sec) {
715                 WARN("file already has .retpoline_sites, skipping");
716                 return 0;
717         }
718
719         idx = 0;
720         list_for_each_entry(insn, &file->retpoline_call_list, call_node)
721                 idx++;
722
723         if (!idx)
724                 return 0;
725
726         sec = elf_create_section(file->elf, ".retpoline_sites", 0,
727                                  sizeof(int), idx);
728         if (!sec) {
729                 WARN("elf_create_section: .retpoline_sites");
730                 return -1;
731         }
732
733         idx = 0;
734         list_for_each_entry(insn, &file->retpoline_call_list, call_node) {
735
736                 int *site = (int *)sec->data->d_buf + idx;
737                 *site = 0;
738
739                 if (elf_add_reloc_to_insn(file->elf, sec,
740                                           idx * sizeof(int),
741                                           R_X86_64_PC32,
742                                           insn->sec, insn->offset)) {
743                         WARN("elf_add_reloc_to_insn: .retpoline_sites");
744                         return -1;
745                 }
746
747                 idx++;
748         }
749
750         return 0;
751 }
752
753 static int create_return_sites_sections(struct objtool_file *file)
754 {
755         struct instruction *insn;
756         struct section *sec;
757         int idx;
758
759         sec = find_section_by_name(file->elf, ".return_sites");
760         if (sec) {
761                 WARN("file already has .return_sites, skipping");
762                 return 0;
763         }
764
765         idx = 0;
766         list_for_each_entry(insn, &file->return_thunk_list, call_node)
767                 idx++;
768
769         if (!idx)
770                 return 0;
771
772         sec = elf_create_section(file->elf, ".return_sites", 0,
773                                  sizeof(int), idx);
774         if (!sec) {
775                 WARN("elf_create_section: .return_sites");
776                 return -1;
777         }
778
779         idx = 0;
780         list_for_each_entry(insn, &file->return_thunk_list, call_node) {
781
782                 int *site = (int *)sec->data->d_buf + idx;
783                 *site = 0;
784
785                 if (elf_add_reloc_to_insn(file->elf, sec,
786                                           idx * sizeof(int),
787                                           R_X86_64_PC32,
788                                           insn->sec, insn->offset)) {
789                         WARN("elf_add_reloc_to_insn: .return_sites");
790                         return -1;
791                 }
792
793                 idx++;
794         }
795
796         return 0;
797 }
798
799 static int create_ibt_endbr_seal_sections(struct objtool_file *file)
800 {
801         struct instruction *insn;
802         struct section *sec;
803         int idx;
804
805         sec = find_section_by_name(file->elf, ".ibt_endbr_seal");
806         if (sec) {
807                 WARN("file already has .ibt_endbr_seal, skipping");
808                 return 0;
809         }
810
811         idx = 0;
812         list_for_each_entry(insn, &file->endbr_list, call_node)
813                 idx++;
814
815         if (opts.stats) {
816                 printf("ibt: ENDBR at function start: %d\n", file->nr_endbr);
817                 printf("ibt: ENDBR inside functions:  %d\n", file->nr_endbr_int);
818                 printf("ibt: superfluous ENDBR:       %d\n", idx);
819         }
820
821         if (!idx)
822                 return 0;
823
824         sec = elf_create_section(file->elf, ".ibt_endbr_seal", 0,
825                                  sizeof(int), idx);
826         if (!sec) {
827                 WARN("elf_create_section: .ibt_endbr_seal");
828                 return -1;
829         }
830
831         idx = 0;
832         list_for_each_entry(insn, &file->endbr_list, call_node) {
833
834                 int *site = (int *)sec->data->d_buf + idx;
835                 *site = 0;
836
837                 if (elf_add_reloc_to_insn(file->elf, sec,
838                                           idx * sizeof(int),
839                                           R_X86_64_PC32,
840                                           insn->sec, insn->offset)) {
841                         WARN("elf_add_reloc_to_insn: .ibt_endbr_seal");
842                         return -1;
843                 }
844
845                 idx++;
846         }
847
848         return 0;
849 }
850
851 static int create_mcount_loc_sections(struct objtool_file *file)
852 {
853         struct section *sec;
854         unsigned long *loc;
855         struct instruction *insn;
856         int idx;
857
858         sec = find_section_by_name(file->elf, "__mcount_loc");
859         if (sec) {
860                 INIT_LIST_HEAD(&file->mcount_loc_list);
861                 WARN("file already has __mcount_loc section, skipping");
862                 return 0;
863         }
864
865         if (list_empty(&file->mcount_loc_list))
866                 return 0;
867
868         idx = 0;
869         list_for_each_entry(insn, &file->mcount_loc_list, call_node)
870                 idx++;
871
872         sec = elf_create_section(file->elf, "__mcount_loc", 0, sizeof(unsigned long), idx);
873         if (!sec)
874                 return -1;
875
876         idx = 0;
877         list_for_each_entry(insn, &file->mcount_loc_list, call_node) {
878
879                 loc = (unsigned long *)sec->data->d_buf + idx;
880                 memset(loc, 0, sizeof(unsigned long));
881
882                 if (elf_add_reloc_to_insn(file->elf, sec,
883                                           idx * sizeof(unsigned long),
884                                           R_X86_64_64,
885                                           insn->sec, insn->offset))
886                         return -1;
887
888                 idx++;
889         }
890
891         return 0;
892 }
893
894 /*
895  * Warnings shouldn't be reported for ignored functions.
896  */
897 static void add_ignores(struct objtool_file *file)
898 {
899         struct instruction *insn;
900         struct section *sec;
901         struct symbol *func;
902         struct reloc *reloc;
903
904         sec = find_section_by_name(file->elf, ".rela.discard.func_stack_frame_non_standard");
905         if (!sec)
906                 return;
907
908         list_for_each_entry(reloc, &sec->reloc_list, list) {
909                 switch (reloc->sym->type) {
910                 case STT_FUNC:
911                         func = reloc->sym;
912                         break;
913
914                 case STT_SECTION:
915                         func = find_func_by_offset(reloc->sym->sec, reloc->addend);
916                         if (!func)
917                                 continue;
918                         break;
919
920                 default:
921                         WARN("unexpected relocation symbol type in %s: %d", sec->name, reloc->sym->type);
922                         continue;
923                 }
924
925                 func_for_each_insn(file, func, insn)
926                         insn->ignore = true;
927         }
928 }
929
930 /*
931  * This is a whitelist of functions that is allowed to be called with AC set.
932  * The list is meant to be minimal and only contains compiler instrumentation
933  * ABI and a few functions used to implement *_{to,from}_user() functions.
934  *
935  * These functions must not directly change AC, but may PUSHF/POPF.
936  */
937 static const char *uaccess_safe_builtin[] = {
938         /* KASAN */
939         "kasan_report",
940         "kasan_check_range",
941         /* KASAN out-of-line */
942         "__asan_loadN_noabort",
943         "__asan_load1_noabort",
944         "__asan_load2_noabort",
945         "__asan_load4_noabort",
946         "__asan_load8_noabort",
947         "__asan_load16_noabort",
948         "__asan_storeN_noabort",
949         "__asan_store1_noabort",
950         "__asan_store2_noabort",
951         "__asan_store4_noabort",
952         "__asan_store8_noabort",
953         "__asan_store16_noabort",
954         "__kasan_check_read",
955         "__kasan_check_write",
956         /* KASAN in-line */
957         "__asan_report_load_n_noabort",
958         "__asan_report_load1_noabort",
959         "__asan_report_load2_noabort",
960         "__asan_report_load4_noabort",
961         "__asan_report_load8_noabort",
962         "__asan_report_load16_noabort",
963         "__asan_report_store_n_noabort",
964         "__asan_report_store1_noabort",
965         "__asan_report_store2_noabort",
966         "__asan_report_store4_noabort",
967         "__asan_report_store8_noabort",
968         "__asan_report_store16_noabort",
969         /* KCSAN */
970         "__kcsan_check_access",
971         "__kcsan_mb",
972         "__kcsan_wmb",
973         "__kcsan_rmb",
974         "__kcsan_release",
975         "kcsan_found_watchpoint",
976         "kcsan_setup_watchpoint",
977         "kcsan_check_scoped_accesses",
978         "kcsan_disable_current",
979         "kcsan_enable_current_nowarn",
980         /* KCSAN/TSAN */
981         "__tsan_func_entry",
982         "__tsan_func_exit",
983         "__tsan_read_range",
984         "__tsan_write_range",
985         "__tsan_read1",
986         "__tsan_read2",
987         "__tsan_read4",
988         "__tsan_read8",
989         "__tsan_read16",
990         "__tsan_write1",
991         "__tsan_write2",
992         "__tsan_write4",
993         "__tsan_write8",
994         "__tsan_write16",
995         "__tsan_read_write1",
996         "__tsan_read_write2",
997         "__tsan_read_write4",
998         "__tsan_read_write8",
999         "__tsan_read_write16",
1000         "__tsan_atomic8_load",
1001         "__tsan_atomic16_load",
1002         "__tsan_atomic32_load",
1003         "__tsan_atomic64_load",
1004         "__tsan_atomic8_store",
1005         "__tsan_atomic16_store",
1006         "__tsan_atomic32_store",
1007         "__tsan_atomic64_store",
1008         "__tsan_atomic8_exchange",
1009         "__tsan_atomic16_exchange",
1010         "__tsan_atomic32_exchange",
1011         "__tsan_atomic64_exchange",
1012         "__tsan_atomic8_fetch_add",
1013         "__tsan_atomic16_fetch_add",
1014         "__tsan_atomic32_fetch_add",
1015         "__tsan_atomic64_fetch_add",
1016         "__tsan_atomic8_fetch_sub",
1017         "__tsan_atomic16_fetch_sub",
1018         "__tsan_atomic32_fetch_sub",
1019         "__tsan_atomic64_fetch_sub",
1020         "__tsan_atomic8_fetch_and",
1021         "__tsan_atomic16_fetch_and",
1022         "__tsan_atomic32_fetch_and",
1023         "__tsan_atomic64_fetch_and",
1024         "__tsan_atomic8_fetch_or",
1025         "__tsan_atomic16_fetch_or",
1026         "__tsan_atomic32_fetch_or",
1027         "__tsan_atomic64_fetch_or",
1028         "__tsan_atomic8_fetch_xor",
1029         "__tsan_atomic16_fetch_xor",
1030         "__tsan_atomic32_fetch_xor",
1031         "__tsan_atomic64_fetch_xor",
1032         "__tsan_atomic8_fetch_nand",
1033         "__tsan_atomic16_fetch_nand",
1034         "__tsan_atomic32_fetch_nand",
1035         "__tsan_atomic64_fetch_nand",
1036         "__tsan_atomic8_compare_exchange_strong",
1037         "__tsan_atomic16_compare_exchange_strong",
1038         "__tsan_atomic32_compare_exchange_strong",
1039         "__tsan_atomic64_compare_exchange_strong",
1040         "__tsan_atomic8_compare_exchange_weak",
1041         "__tsan_atomic16_compare_exchange_weak",
1042         "__tsan_atomic32_compare_exchange_weak",
1043         "__tsan_atomic64_compare_exchange_weak",
1044         "__tsan_atomic8_compare_exchange_val",
1045         "__tsan_atomic16_compare_exchange_val",
1046         "__tsan_atomic32_compare_exchange_val",
1047         "__tsan_atomic64_compare_exchange_val",
1048         "__tsan_atomic_thread_fence",
1049         "__tsan_atomic_signal_fence",
1050         /* KCOV */
1051         "write_comp_data",
1052         "check_kcov_mode",
1053         "__sanitizer_cov_trace_pc",
1054         "__sanitizer_cov_trace_const_cmp1",
1055         "__sanitizer_cov_trace_const_cmp2",
1056         "__sanitizer_cov_trace_const_cmp4",
1057         "__sanitizer_cov_trace_const_cmp8",
1058         "__sanitizer_cov_trace_cmp1",
1059         "__sanitizer_cov_trace_cmp2",
1060         "__sanitizer_cov_trace_cmp4",
1061         "__sanitizer_cov_trace_cmp8",
1062         "__sanitizer_cov_trace_switch",
1063         /* UBSAN */
1064         "ubsan_type_mismatch_common",
1065         "__ubsan_handle_type_mismatch",
1066         "__ubsan_handle_type_mismatch_v1",
1067         "__ubsan_handle_shift_out_of_bounds",
1068         /* misc */
1069         "csum_partial_copy_generic",
1070         "copy_mc_fragile",
1071         "copy_mc_fragile_handle_tail",
1072         "copy_mc_enhanced_fast_string",
1073         "ftrace_likely_update", /* CONFIG_TRACE_BRANCH_PROFILING */
1074         NULL
1075 };
1076
1077 static void add_uaccess_safe(struct objtool_file *file)
1078 {
1079         struct symbol *func;
1080         const char **name;
1081
1082         if (!opts.uaccess)
1083                 return;
1084
1085         for (name = uaccess_safe_builtin; *name; name++) {
1086                 func = find_symbol_by_name(file->elf, *name);
1087                 if (!func)
1088                         continue;
1089
1090                 func->uaccess_safe = true;
1091         }
1092 }
1093
1094 /*
1095  * FIXME: For now, just ignore any alternatives which add retpolines.  This is
1096  * a temporary hack, as it doesn't allow ORC to unwind from inside a retpoline.
1097  * But it at least allows objtool to understand the control flow *around* the
1098  * retpoline.
1099  */
1100 static int add_ignore_alternatives(struct objtool_file *file)
1101 {
1102         struct section *sec;
1103         struct reloc *reloc;
1104         struct instruction *insn;
1105
1106         sec = find_section_by_name(file->elf, ".rela.discard.ignore_alts");
1107         if (!sec)
1108                 return 0;
1109
1110         list_for_each_entry(reloc, &sec->reloc_list, list) {
1111                 if (reloc->sym->type != STT_SECTION) {
1112                         WARN("unexpected relocation symbol type in %s", sec->name);
1113                         return -1;
1114                 }
1115
1116                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
1117                 if (!insn) {
1118                         WARN("bad .discard.ignore_alts entry");
1119                         return -1;
1120                 }
1121
1122                 insn->ignore_alts = true;
1123         }
1124
1125         return 0;
1126 }
1127
1128 __weak bool arch_is_retpoline(struct symbol *sym)
1129 {
1130         return false;
1131 }
1132
1133 __weak bool arch_is_rethunk(struct symbol *sym)
1134 {
1135         return false;
1136 }
1137
1138 #define NEGATIVE_RELOC  ((void *)-1L)
1139
1140 static struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn)
1141 {
1142         if (insn->reloc == NEGATIVE_RELOC)
1143                 return NULL;
1144
1145         if (!insn->reloc) {
1146                 if (!file)
1147                         return NULL;
1148
1149                 insn->reloc = find_reloc_by_dest_range(file->elf, insn->sec,
1150                                                        insn->offset, insn->len);
1151                 if (!insn->reloc) {
1152                         insn->reloc = NEGATIVE_RELOC;
1153                         return NULL;
1154                 }
1155         }
1156
1157         return insn->reloc;
1158 }
1159
1160 static void remove_insn_ops(struct instruction *insn)
1161 {
1162         struct stack_op *op, *tmp;
1163
1164         list_for_each_entry_safe(op, tmp, &insn->stack_ops, list) {
1165                 list_del(&op->list);
1166                 free(op);
1167         }
1168 }
1169
1170 static void annotate_call_site(struct objtool_file *file,
1171                                struct instruction *insn, bool sibling)
1172 {
1173         struct reloc *reloc = insn_reloc(file, insn);
1174         struct symbol *sym = insn->call_dest;
1175
1176         if (!sym)
1177                 sym = reloc->sym;
1178
1179         /*
1180          * Alternative replacement code is just template code which is
1181          * sometimes copied to the original instruction. For now, don't
1182          * annotate it. (In the future we might consider annotating the
1183          * original instruction if/when it ever makes sense to do so.)
1184          */
1185         if (!strcmp(insn->sec->name, ".altinstr_replacement"))
1186                 return;
1187
1188         if (sym->static_call_tramp) {
1189                 list_add_tail(&insn->call_node, &file->static_call_list);
1190                 return;
1191         }
1192
1193         if (sym->retpoline_thunk) {
1194                 list_add_tail(&insn->call_node, &file->retpoline_call_list);
1195                 return;
1196         }
1197
1198         /*
1199          * Many compilers cannot disable KCOV or sanitizer calls with a function
1200          * attribute so they need a little help, NOP out any such calls from
1201          * noinstr text.
1202          */
1203         if (opts.hack_noinstr && insn->sec->noinstr && sym->profiling_func) {
1204                 if (reloc) {
1205                         reloc->type = R_NONE;
1206                         elf_write_reloc(file->elf, reloc);
1207                 }
1208
1209                 elf_write_insn(file->elf, insn->sec,
1210                                insn->offset, insn->len,
1211                                sibling ? arch_ret_insn(insn->len)
1212                                        : arch_nop_insn(insn->len));
1213
1214                 insn->type = sibling ? INSN_RETURN : INSN_NOP;
1215
1216                 if (sibling) {
1217                         /*
1218                          * We've replaced the tail-call JMP insn by two new
1219                          * insn: RET; INT3, except we only have a single struct
1220                          * insn here. Mark it retpoline_safe to avoid the SLS
1221                          * warning, instead of adding another insn.
1222                          */
1223                         insn->retpoline_safe = true;
1224                 }
1225
1226                 return;
1227         }
1228
1229         if (opts.mcount && sym->fentry) {
1230                 if (sibling)
1231                         WARN_FUNC("Tail call to __fentry__ !?!?", insn->sec, insn->offset);
1232
1233                 if (reloc) {
1234                         reloc->type = R_NONE;
1235                         elf_write_reloc(file->elf, reloc);
1236                 }
1237
1238                 elf_write_insn(file->elf, insn->sec,
1239                                insn->offset, insn->len,
1240                                arch_nop_insn(insn->len));
1241
1242                 insn->type = INSN_NOP;
1243
1244                 list_add_tail(&insn->call_node, &file->mcount_loc_list);
1245                 return;
1246         }
1247
1248         if (!sibling && dead_end_function(file, sym))
1249                 insn->dead_end = true;
1250 }
1251
1252 static void add_call_dest(struct objtool_file *file, struct instruction *insn,
1253                           struct symbol *dest, bool sibling)
1254 {
1255         insn->call_dest = dest;
1256         if (!dest)
1257                 return;
1258
1259         /*
1260          * Whatever stack impact regular CALLs have, should be undone
1261          * by the RETURN of the called function.
1262          *
1263          * Annotated intra-function calls retain the stack_ops but
1264          * are converted to JUMP, see read_intra_function_calls().
1265          */
1266         remove_insn_ops(insn);
1267
1268         annotate_call_site(file, insn, sibling);
1269 }
1270
1271 static void add_retpoline_call(struct objtool_file *file, struct instruction *insn)
1272 {
1273         /*
1274          * Retpoline calls/jumps are really dynamic calls/jumps in disguise,
1275          * so convert them accordingly.
1276          */
1277         switch (insn->type) {
1278         case INSN_CALL:
1279                 insn->type = INSN_CALL_DYNAMIC;
1280                 break;
1281         case INSN_JUMP_UNCONDITIONAL:
1282                 insn->type = INSN_JUMP_DYNAMIC;
1283                 break;
1284         case INSN_JUMP_CONDITIONAL:
1285                 insn->type = INSN_JUMP_DYNAMIC_CONDITIONAL;
1286                 break;
1287         default:
1288                 return;
1289         }
1290
1291         insn->retpoline_safe = true;
1292
1293         /*
1294          * Whatever stack impact regular CALLs have, should be undone
1295          * by the RETURN of the called function.
1296          *
1297          * Annotated intra-function calls retain the stack_ops but
1298          * are converted to JUMP, see read_intra_function_calls().
1299          */
1300         remove_insn_ops(insn);
1301
1302         annotate_call_site(file, insn, false);
1303 }
1304
1305 static void add_return_call(struct objtool_file *file, struct instruction *insn, bool add)
1306 {
1307         /*
1308          * Return thunk tail calls are really just returns in disguise,
1309          * so convert them accordingly.
1310          */
1311         insn->type = INSN_RETURN;
1312         insn->retpoline_safe = true;
1313
1314         if (add)
1315                 list_add_tail(&insn->call_node, &file->return_thunk_list);
1316 }
1317
1318 static bool same_function(struct instruction *insn1, struct instruction *insn2)
1319 {
1320         return insn1->func->pfunc == insn2->func->pfunc;
1321 }
1322
1323 static bool is_first_func_insn(struct objtool_file *file, struct instruction *insn)
1324 {
1325         if (insn->offset == insn->func->offset)
1326                 return true;
1327
1328         if (opts.ibt) {
1329                 struct instruction *prev = prev_insn_same_sym(file, insn);
1330
1331                 if (prev && prev->type == INSN_ENDBR &&
1332                     insn->offset == insn->func->offset + prev->len)
1333                         return true;
1334         }
1335
1336         return false;
1337 }
1338
1339 /*
1340  * Find the destination instructions for all jumps.
1341  */
1342 static int add_jump_destinations(struct objtool_file *file)
1343 {
1344         struct instruction *insn, *jump_dest;
1345         struct reloc *reloc;
1346         struct section *dest_sec;
1347         unsigned long dest_off;
1348
1349         for_each_insn(file, insn) {
1350                 if (insn->jump_dest) {
1351                         /*
1352                          * handle_group_alt() may have previously set
1353                          * 'jump_dest' for some alternatives.
1354                          */
1355                         continue;
1356                 }
1357                 if (!is_static_jump(insn))
1358                         continue;
1359
1360                 reloc = insn_reloc(file, insn);
1361                 if (!reloc) {
1362                         dest_sec = insn->sec;
1363                         dest_off = arch_jump_destination(insn);
1364                 } else if (reloc->sym->type == STT_SECTION) {
1365                         dest_sec = reloc->sym->sec;
1366                         dest_off = arch_dest_reloc_offset(reloc->addend);
1367                 } else if (reloc->sym->retpoline_thunk) {
1368                         add_retpoline_call(file, insn);
1369                         continue;
1370                 } else if (reloc->sym->return_thunk) {
1371                         add_return_call(file, insn, true);
1372                         continue;
1373                 } else if (insn->func) {
1374                         /*
1375                          * External sibling call or internal sibling call with
1376                          * STT_FUNC reloc.
1377                          */
1378                         add_call_dest(file, insn, reloc->sym, true);
1379                         continue;
1380                 } else if (reloc->sym->sec->idx) {
1381                         dest_sec = reloc->sym->sec;
1382                         dest_off = reloc->sym->sym.st_value +
1383                                    arch_dest_reloc_offset(reloc->addend);
1384                 } else {
1385                         /* non-func asm code jumping to another file */
1386                         continue;
1387                 }
1388
1389                 jump_dest = find_insn(file, dest_sec, dest_off);
1390                 if (!jump_dest) {
1391                         struct symbol *sym = find_symbol_by_offset(dest_sec, dest_off);
1392
1393                         /*
1394                          * This is a special case for zen_untrain_ret().
1395                          * It jumps to __x86_return_thunk(), but objtool
1396                          * can't find the thunk's starting RET
1397                          * instruction, because the RET is also in the
1398                          * middle of another instruction.  Objtool only
1399                          * knows about the outer instruction.
1400                          */
1401                         if (sym && sym->return_thunk) {
1402                                 add_return_call(file, insn, false);
1403                                 continue;
1404                         }
1405
1406                         WARN_FUNC("can't find jump dest instruction at %s+0x%lx",
1407                                   insn->sec, insn->offset, dest_sec->name,
1408                                   dest_off);
1409                         return -1;
1410                 }
1411
1412                 /*
1413                  * Cross-function jump.
1414                  */
1415                 if (insn->func && jump_dest->func &&
1416                     insn->func != jump_dest->func) {
1417
1418                         /*
1419                          * For GCC 8+, create parent/child links for any cold
1420                          * subfunctions.  This is _mostly_ redundant with a
1421                          * similar initialization in read_symbols().
1422                          *
1423                          * If a function has aliases, we want the *first* such
1424                          * function in the symbol table to be the subfunction's
1425                          * parent.  In that case we overwrite the
1426                          * initialization done in read_symbols().
1427                          *
1428                          * However this code can't completely replace the
1429                          * read_symbols() code because this doesn't detect the
1430                          * case where the parent function's only reference to a
1431                          * subfunction is through a jump table.
1432                          */
1433                         if (!strstr(insn->func->name, ".cold") &&
1434                             strstr(jump_dest->func->name, ".cold")) {
1435                                 insn->func->cfunc = jump_dest->func;
1436                                 jump_dest->func->pfunc = insn->func;
1437
1438                         } else if (!same_function(insn, jump_dest) &&
1439                                    is_first_func_insn(file, jump_dest)) {
1440                                 /*
1441                                  * Internal sibling call without reloc or with
1442                                  * STT_SECTION reloc.
1443                                  */
1444                                 add_call_dest(file, insn, jump_dest->func, true);
1445                                 continue;
1446                         }
1447                 }
1448
1449                 insn->jump_dest = jump_dest;
1450         }
1451
1452         return 0;
1453 }
1454
1455 static struct symbol *find_call_destination(struct section *sec, unsigned long offset)
1456 {
1457         struct symbol *call_dest;
1458
1459         call_dest = find_func_by_offset(sec, offset);
1460         if (!call_dest)
1461                 call_dest = find_symbol_by_offset(sec, offset);
1462
1463         return call_dest;
1464 }
1465
1466 /*
1467  * Find the destination instructions for all calls.
1468  */
1469 static int add_call_destinations(struct objtool_file *file)
1470 {
1471         struct instruction *insn;
1472         unsigned long dest_off;
1473         struct symbol *dest;
1474         struct reloc *reloc;
1475
1476         for_each_insn(file, insn) {
1477                 if (insn->type != INSN_CALL)
1478                         continue;
1479
1480                 reloc = insn_reloc(file, insn);
1481                 if (!reloc) {
1482                         dest_off = arch_jump_destination(insn);
1483                         dest = find_call_destination(insn->sec, dest_off);
1484
1485                         add_call_dest(file, insn, dest, false);
1486
1487                         if (insn->ignore)
1488                                 continue;
1489
1490                         if (!insn->call_dest) {
1491                                 WARN_FUNC("unannotated intra-function call", insn->sec, insn->offset);
1492                                 return -1;
1493                         }
1494
1495                         if (insn->func && insn->call_dest->type != STT_FUNC) {
1496                                 WARN_FUNC("unsupported call to non-function",
1497                                           insn->sec, insn->offset);
1498                                 return -1;
1499                         }
1500
1501                 } else if (reloc->sym->type == STT_SECTION) {
1502                         dest_off = arch_dest_reloc_offset(reloc->addend);
1503                         dest = find_call_destination(reloc->sym->sec, dest_off);
1504                         if (!dest) {
1505                                 WARN_FUNC("can't find call dest symbol at %s+0x%lx",
1506                                           insn->sec, insn->offset,
1507                                           reloc->sym->sec->name,
1508                                           dest_off);
1509                                 return -1;
1510                         }
1511
1512                         add_call_dest(file, insn, dest, false);
1513
1514                 } else if (reloc->sym->retpoline_thunk) {
1515                         add_retpoline_call(file, insn);
1516
1517                 } else
1518                         add_call_dest(file, insn, reloc->sym, false);
1519         }
1520
1521         return 0;
1522 }
1523
1524 /*
1525  * The .alternatives section requires some extra special care over and above
1526  * other special sections because alternatives are patched in place.
1527  */
1528 static int handle_group_alt(struct objtool_file *file,
1529                             struct special_alt *special_alt,
1530                             struct instruction *orig_insn,
1531                             struct instruction **new_insn)
1532 {
1533         struct instruction *last_orig_insn, *last_new_insn = NULL, *insn, *nop = NULL;
1534         struct alt_group *orig_alt_group, *new_alt_group;
1535         unsigned long dest_off;
1536
1537
1538         orig_alt_group = malloc(sizeof(*orig_alt_group));
1539         if (!orig_alt_group) {
1540                 WARN("malloc failed");
1541                 return -1;
1542         }
1543         orig_alt_group->cfi = calloc(special_alt->orig_len,
1544                                      sizeof(struct cfi_state *));
1545         if (!orig_alt_group->cfi) {
1546                 WARN("calloc failed");
1547                 return -1;
1548         }
1549
1550         last_orig_insn = NULL;
1551         insn = orig_insn;
1552         sec_for_each_insn_from(file, insn) {
1553                 if (insn->offset >= special_alt->orig_off + special_alt->orig_len)
1554                         break;
1555
1556                 insn->alt_group = orig_alt_group;
1557                 last_orig_insn = insn;
1558         }
1559         orig_alt_group->orig_group = NULL;
1560         orig_alt_group->first_insn = orig_insn;
1561         orig_alt_group->last_insn = last_orig_insn;
1562
1563
1564         new_alt_group = malloc(sizeof(*new_alt_group));
1565         if (!new_alt_group) {
1566                 WARN("malloc failed");
1567                 return -1;
1568         }
1569
1570         if (special_alt->new_len < special_alt->orig_len) {
1571                 /*
1572                  * Insert a fake nop at the end to make the replacement
1573                  * alt_group the same size as the original.  This is needed to
1574                  * allow propagate_alt_cfi() to do its magic.  When the last
1575                  * instruction affects the stack, the instruction after it (the
1576                  * nop) will propagate the new state to the shared CFI array.
1577                  */
1578                 nop = malloc(sizeof(*nop));
1579                 if (!nop) {
1580                         WARN("malloc failed");
1581                         return -1;
1582                 }
1583                 memset(nop, 0, sizeof(*nop));
1584                 INIT_LIST_HEAD(&nop->alts);
1585                 INIT_LIST_HEAD(&nop->stack_ops);
1586
1587                 nop->sec = special_alt->new_sec;
1588                 nop->offset = special_alt->new_off + special_alt->new_len;
1589                 nop->len = special_alt->orig_len - special_alt->new_len;
1590                 nop->type = INSN_NOP;
1591                 nop->func = orig_insn->func;
1592                 nop->alt_group = new_alt_group;
1593                 nop->ignore = orig_insn->ignore_alts;
1594         }
1595
1596         if (!special_alt->new_len) {
1597                 *new_insn = nop;
1598                 goto end;
1599         }
1600
1601         insn = *new_insn;
1602         sec_for_each_insn_from(file, insn) {
1603                 struct reloc *alt_reloc;
1604
1605                 if (insn->offset >= special_alt->new_off + special_alt->new_len)
1606                         break;
1607
1608                 last_new_insn = insn;
1609
1610                 insn->ignore = orig_insn->ignore_alts;
1611                 insn->func = orig_insn->func;
1612                 insn->alt_group = new_alt_group;
1613
1614                 /*
1615                  * Since alternative replacement code is copy/pasted by the
1616                  * kernel after applying relocations, generally such code can't
1617                  * have relative-address relocation references to outside the
1618                  * .altinstr_replacement section, unless the arch's
1619                  * alternatives code can adjust the relative offsets
1620                  * accordingly.
1621                  */
1622                 alt_reloc = insn_reloc(file, insn);
1623                 if (alt_reloc &&
1624                     !arch_support_alt_relocation(special_alt, insn, alt_reloc)) {
1625
1626                         WARN_FUNC("unsupported relocation in alternatives section",
1627                                   insn->sec, insn->offset);
1628                         return -1;
1629                 }
1630
1631                 if (!is_static_jump(insn))
1632                         continue;
1633
1634                 if (!insn->immediate)
1635                         continue;
1636
1637                 dest_off = arch_jump_destination(insn);
1638                 if (dest_off == special_alt->new_off + special_alt->new_len) {
1639                         insn->jump_dest = next_insn_same_sec(file, last_orig_insn);
1640                         if (!insn->jump_dest) {
1641                                 WARN_FUNC("can't find alternative jump destination",
1642                                           insn->sec, insn->offset);
1643                                 return -1;
1644                         }
1645                 }
1646         }
1647
1648         if (!last_new_insn) {
1649                 WARN_FUNC("can't find last new alternative instruction",
1650                           special_alt->new_sec, special_alt->new_off);
1651                 return -1;
1652         }
1653
1654         if (nop)
1655                 list_add(&nop->list, &last_new_insn->list);
1656 end:
1657         new_alt_group->orig_group = orig_alt_group;
1658         new_alt_group->first_insn = *new_insn;
1659         new_alt_group->last_insn = nop ? : last_new_insn;
1660         new_alt_group->cfi = orig_alt_group->cfi;
1661         return 0;
1662 }
1663
1664 /*
1665  * A jump table entry can either convert a nop to a jump or a jump to a nop.
1666  * If the original instruction is a jump, make the alt entry an effective nop
1667  * by just skipping the original instruction.
1668  */
1669 static int handle_jump_alt(struct objtool_file *file,
1670                            struct special_alt *special_alt,
1671                            struct instruction *orig_insn,
1672                            struct instruction **new_insn)
1673 {
1674         if (orig_insn->type != INSN_JUMP_UNCONDITIONAL &&
1675             orig_insn->type != INSN_NOP) {
1676
1677                 WARN_FUNC("unsupported instruction at jump label",
1678                           orig_insn->sec, orig_insn->offset);
1679                 return -1;
1680         }
1681
1682         if (opts.hack_jump_label && special_alt->key_addend & 2) {
1683                 struct reloc *reloc = insn_reloc(file, orig_insn);
1684
1685                 if (reloc) {
1686                         reloc->type = R_NONE;
1687                         elf_write_reloc(file->elf, reloc);
1688                 }
1689                 elf_write_insn(file->elf, orig_insn->sec,
1690                                orig_insn->offset, orig_insn->len,
1691                                arch_nop_insn(orig_insn->len));
1692                 orig_insn->type = INSN_NOP;
1693         }
1694
1695         if (orig_insn->type == INSN_NOP) {
1696                 if (orig_insn->len == 2)
1697                         file->jl_nop_short++;
1698                 else
1699                         file->jl_nop_long++;
1700
1701                 return 0;
1702         }
1703
1704         if (orig_insn->len == 2)
1705                 file->jl_short++;
1706         else
1707                 file->jl_long++;
1708
1709         *new_insn = list_next_entry(orig_insn, list);
1710         return 0;
1711 }
1712
1713 /*
1714  * Read all the special sections which have alternate instructions which can be
1715  * patched in or redirected to at runtime.  Each instruction having alternate
1716  * instruction(s) has them added to its insn->alts list, which will be
1717  * traversed in validate_branch().
1718  */
1719 static int add_special_section_alts(struct objtool_file *file)
1720 {
1721         struct list_head special_alts;
1722         struct instruction *orig_insn, *new_insn;
1723         struct special_alt *special_alt, *tmp;
1724         struct alternative *alt;
1725         int ret;
1726
1727         ret = special_get_alts(file->elf, &special_alts);
1728         if (ret)
1729                 return ret;
1730
1731         list_for_each_entry_safe(special_alt, tmp, &special_alts, list) {
1732
1733                 orig_insn = find_insn(file, special_alt->orig_sec,
1734                                       special_alt->orig_off);
1735                 if (!orig_insn) {
1736                         WARN_FUNC("special: can't find orig instruction",
1737                                   special_alt->orig_sec, special_alt->orig_off);
1738                         ret = -1;
1739                         goto out;
1740                 }
1741
1742                 new_insn = NULL;
1743                 if (!special_alt->group || special_alt->new_len) {
1744                         new_insn = find_insn(file, special_alt->new_sec,
1745                                              special_alt->new_off);
1746                         if (!new_insn) {
1747                                 WARN_FUNC("special: can't find new instruction",
1748                                           special_alt->new_sec,
1749                                           special_alt->new_off);
1750                                 ret = -1;
1751                                 goto out;
1752                         }
1753                 }
1754
1755                 if (special_alt->group) {
1756                         if (!special_alt->orig_len) {
1757                                 WARN_FUNC("empty alternative entry",
1758                                           orig_insn->sec, orig_insn->offset);
1759                                 continue;
1760                         }
1761
1762                         ret = handle_group_alt(file, special_alt, orig_insn,
1763                                                &new_insn);
1764                         if (ret)
1765                                 goto out;
1766                 } else if (special_alt->jump_or_nop) {
1767                         ret = handle_jump_alt(file, special_alt, orig_insn,
1768                                               &new_insn);
1769                         if (ret)
1770                                 goto out;
1771                 }
1772
1773                 alt = malloc(sizeof(*alt));
1774                 if (!alt) {
1775                         WARN("malloc failed");
1776                         ret = -1;
1777                         goto out;
1778                 }
1779
1780                 alt->insn = new_insn;
1781                 alt->skip_orig = special_alt->skip_orig;
1782                 orig_insn->ignore_alts |= special_alt->skip_alt;
1783                 list_add_tail(&alt->list, &orig_insn->alts);
1784
1785                 list_del(&special_alt->list);
1786                 free(special_alt);
1787         }
1788
1789         if (opts.stats) {
1790                 printf("jl\\\tNOP\tJMP\n");
1791                 printf("short:\t%ld\t%ld\n", file->jl_nop_short, file->jl_short);
1792                 printf("long:\t%ld\t%ld\n", file->jl_nop_long, file->jl_long);
1793         }
1794
1795 out:
1796         return ret;
1797 }
1798
1799 static int add_jump_table(struct objtool_file *file, struct instruction *insn,
1800                             struct reloc *table)
1801 {
1802         struct reloc *reloc = table;
1803         struct instruction *dest_insn;
1804         struct alternative *alt;
1805         struct symbol *pfunc = insn->func->pfunc;
1806         unsigned int prev_offset = 0;
1807
1808         /*
1809          * Each @reloc is a switch table relocation which points to the target
1810          * instruction.
1811          */
1812         list_for_each_entry_from(reloc, &table->sec->reloc_list, list) {
1813
1814                 /* Check for the end of the table: */
1815                 if (reloc != table && reloc->jump_table_start)
1816                         break;
1817
1818                 /* Make sure the table entries are consecutive: */
1819                 if (prev_offset && reloc->offset != prev_offset + 8)
1820                         break;
1821
1822                 /* Detect function pointers from contiguous objects: */
1823                 if (reloc->sym->sec == pfunc->sec &&
1824                     reloc->addend == pfunc->offset)
1825                         break;
1826
1827                 dest_insn = find_insn(file, reloc->sym->sec, reloc->addend);
1828                 if (!dest_insn)
1829                         break;
1830
1831                 /* Make sure the destination is in the same function: */
1832                 if (!dest_insn->func || dest_insn->func->pfunc != pfunc)
1833                         break;
1834
1835                 alt = malloc(sizeof(*alt));
1836                 if (!alt) {
1837                         WARN("malloc failed");
1838                         return -1;
1839                 }
1840
1841                 alt->insn = dest_insn;
1842                 list_add_tail(&alt->list, &insn->alts);
1843                 prev_offset = reloc->offset;
1844         }
1845
1846         if (!prev_offset) {
1847                 WARN_FUNC("can't find switch jump table",
1848                           insn->sec, insn->offset);
1849                 return -1;
1850         }
1851
1852         return 0;
1853 }
1854
1855 /*
1856  * find_jump_table() - Given a dynamic jump, find the switch jump table
1857  * associated with it.
1858  */
1859 static struct reloc *find_jump_table(struct objtool_file *file,
1860                                       struct symbol *func,
1861                                       struct instruction *insn)
1862 {
1863         struct reloc *table_reloc;
1864         struct instruction *dest_insn, *orig_insn = insn;
1865
1866         /*
1867          * Backward search using the @first_jump_src links, these help avoid
1868          * much of the 'in between' code. Which avoids us getting confused by
1869          * it.
1870          */
1871         for (;
1872              insn && insn->func && insn->func->pfunc == func;
1873              insn = insn->first_jump_src ?: prev_insn_same_sym(file, insn)) {
1874
1875                 if (insn != orig_insn && insn->type == INSN_JUMP_DYNAMIC)
1876                         break;
1877
1878                 /* allow small jumps within the range */
1879                 if (insn->type == INSN_JUMP_UNCONDITIONAL &&
1880                     insn->jump_dest &&
1881                     (insn->jump_dest->offset <= insn->offset ||
1882                      insn->jump_dest->offset > orig_insn->offset))
1883                     break;
1884
1885                 table_reloc = arch_find_switch_table(file, insn);
1886                 if (!table_reloc)
1887                         continue;
1888                 dest_insn = find_insn(file, table_reloc->sym->sec, table_reloc->addend);
1889                 if (!dest_insn || !dest_insn->func || dest_insn->func->pfunc != func)
1890                         continue;
1891
1892                 return table_reloc;
1893         }
1894
1895         return NULL;
1896 }
1897
1898 /*
1899  * First pass: Mark the head of each jump table so that in the next pass,
1900  * we know when a given jump table ends and the next one starts.
1901  */
1902 static void mark_func_jump_tables(struct objtool_file *file,
1903                                     struct symbol *func)
1904 {
1905         struct instruction *insn, *last = NULL;
1906         struct reloc *reloc;
1907
1908         func_for_each_insn(file, func, insn) {
1909                 if (!last)
1910                         last = insn;
1911
1912                 /*
1913                  * Store back-pointers for unconditional forward jumps such
1914                  * that find_jump_table() can back-track using those and
1915                  * avoid some potentially confusing code.
1916                  */
1917                 if (insn->type == INSN_JUMP_UNCONDITIONAL && insn->jump_dest &&
1918                     insn->offset > last->offset &&
1919                     insn->jump_dest->offset > insn->offset &&
1920                     !insn->jump_dest->first_jump_src) {
1921
1922                         insn->jump_dest->first_jump_src = insn;
1923                         last = insn->jump_dest;
1924                 }
1925
1926                 if (insn->type != INSN_JUMP_DYNAMIC)
1927                         continue;
1928
1929                 reloc = find_jump_table(file, func, insn);
1930                 if (reloc) {
1931                         reloc->jump_table_start = true;
1932                         insn->jump_table = reloc;
1933                 }
1934         }
1935 }
1936
1937 static int add_func_jump_tables(struct objtool_file *file,
1938                                   struct symbol *func)
1939 {
1940         struct instruction *insn;
1941         int ret;
1942
1943         func_for_each_insn(file, func, insn) {
1944                 if (!insn->jump_table)
1945                         continue;
1946
1947                 ret = add_jump_table(file, insn, insn->jump_table);
1948                 if (ret)
1949                         return ret;
1950         }
1951
1952         return 0;
1953 }
1954
1955 /*
1956  * For some switch statements, gcc generates a jump table in the .rodata
1957  * section which contains a list of addresses within the function to jump to.
1958  * This finds these jump tables and adds them to the insn->alts lists.
1959  */
1960 static int add_jump_table_alts(struct objtool_file *file)
1961 {
1962         struct section *sec;
1963         struct symbol *func;
1964         int ret;
1965
1966         if (!file->rodata)
1967                 return 0;
1968
1969         for_each_sec(file, sec) {
1970                 list_for_each_entry(func, &sec->symbol_list, list) {
1971                         if (func->type != STT_FUNC)
1972                                 continue;
1973
1974                         mark_func_jump_tables(file, func);
1975                         ret = add_func_jump_tables(file, func);
1976                         if (ret)
1977                                 return ret;
1978                 }
1979         }
1980
1981         return 0;
1982 }
1983
1984 static void set_func_state(struct cfi_state *state)
1985 {
1986         state->cfa = initial_func_cfi.cfa;
1987         memcpy(&state->regs, &initial_func_cfi.regs,
1988                CFI_NUM_REGS * sizeof(struct cfi_reg));
1989         state->stack_size = initial_func_cfi.cfa.offset;
1990 }
1991
1992 static int read_unwind_hints(struct objtool_file *file)
1993 {
1994         struct cfi_state cfi = init_cfi;
1995         struct section *sec, *relocsec;
1996         struct unwind_hint *hint;
1997         struct instruction *insn;
1998         struct reloc *reloc;
1999         int i;
2000
2001         sec = find_section_by_name(file->elf, ".discard.unwind_hints");
2002         if (!sec)
2003                 return 0;
2004
2005         relocsec = sec->reloc;
2006         if (!relocsec) {
2007                 WARN("missing .rela.discard.unwind_hints section");
2008                 return -1;
2009         }
2010
2011         if (sec->sh.sh_size % sizeof(struct unwind_hint)) {
2012                 WARN("struct unwind_hint size mismatch");
2013                 return -1;
2014         }
2015
2016         file->hints = true;
2017
2018         for (i = 0; i < sec->sh.sh_size / sizeof(struct unwind_hint); i++) {
2019                 hint = (struct unwind_hint *)sec->data->d_buf + i;
2020
2021                 reloc = find_reloc_by_dest(file->elf, sec, i * sizeof(*hint));
2022                 if (!reloc) {
2023                         WARN("can't find reloc for unwind_hints[%d]", i);
2024                         return -1;
2025                 }
2026
2027                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
2028                 if (!insn) {
2029                         WARN("can't find insn for unwind_hints[%d]", i);
2030                         return -1;
2031                 }
2032
2033                 insn->hint = true;
2034
2035                 if (hint->type == UNWIND_HINT_TYPE_SAVE) {
2036                         insn->hint = false;
2037                         insn->save = true;
2038                         continue;
2039                 }
2040
2041                 if (hint->type == UNWIND_HINT_TYPE_RESTORE) {
2042                         insn->restore = true;
2043                         continue;
2044                 }
2045
2046                 if (hint->type == UNWIND_HINT_TYPE_REGS_PARTIAL) {
2047                         struct symbol *sym = find_symbol_by_offset(insn->sec, insn->offset);
2048
2049                         if (sym && sym->bind == STB_GLOBAL) {
2050                                 if (opts.ibt && insn->type != INSN_ENDBR && !insn->noendbr) {
2051                                         WARN_FUNC("UNWIND_HINT_IRET_REGS without ENDBR",
2052                                                   insn->sec, insn->offset);
2053                                 }
2054
2055                                 insn->entry = 1;
2056                         }
2057                 }
2058
2059                 if (hint->type == UNWIND_HINT_TYPE_ENTRY) {
2060                         hint->type = UNWIND_HINT_TYPE_CALL;
2061                         insn->entry = 1;
2062                 }
2063
2064                 if (hint->type == UNWIND_HINT_TYPE_FUNC) {
2065                         insn->cfi = &func_cfi;
2066                         continue;
2067                 }
2068
2069                 if (insn->cfi)
2070                         cfi = *(insn->cfi);
2071
2072                 if (arch_decode_hint_reg(hint->sp_reg, &cfi.cfa.base)) {
2073                         WARN_FUNC("unsupported unwind_hint sp base reg %d",
2074                                   insn->sec, insn->offset, hint->sp_reg);
2075                         return -1;
2076                 }
2077
2078                 cfi.cfa.offset = bswap_if_needed(hint->sp_offset);
2079                 cfi.type = hint->type;
2080                 cfi.end = hint->end;
2081
2082                 insn->cfi = cfi_hash_find_or_add(&cfi);
2083         }
2084
2085         return 0;
2086 }
2087
2088 static int read_noendbr_hints(struct objtool_file *file)
2089 {
2090         struct section *sec;
2091         struct instruction *insn;
2092         struct reloc *reloc;
2093
2094         sec = find_section_by_name(file->elf, ".rela.discard.noendbr");
2095         if (!sec)
2096                 return 0;
2097
2098         list_for_each_entry(reloc, &sec->reloc_list, list) {
2099                 insn = find_insn(file, reloc->sym->sec, reloc->sym->offset + reloc->addend);
2100                 if (!insn) {
2101                         WARN("bad .discard.noendbr entry");
2102                         return -1;
2103                 }
2104
2105                 if (insn->type == INSN_ENDBR)
2106                         WARN_FUNC("ANNOTATE_NOENDBR on ENDBR", insn->sec, insn->offset);
2107
2108                 insn->noendbr = 1;
2109         }
2110
2111         return 0;
2112 }
2113
2114 static int read_retpoline_hints(struct objtool_file *file)
2115 {
2116         struct section *sec;
2117         struct instruction *insn;
2118         struct reloc *reloc;
2119
2120         sec = find_section_by_name(file->elf, ".rela.discard.retpoline_safe");
2121         if (!sec)
2122                 return 0;
2123
2124         list_for_each_entry(reloc, &sec->reloc_list, list) {
2125                 if (reloc->sym->type != STT_SECTION) {
2126                         WARN("unexpected relocation symbol type in %s", sec->name);
2127                         return -1;
2128                 }
2129
2130                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
2131                 if (!insn) {
2132                         WARN("bad .discard.retpoline_safe entry");
2133                         return -1;
2134                 }
2135
2136                 if (insn->type != INSN_JUMP_DYNAMIC &&
2137                     insn->type != INSN_CALL_DYNAMIC &&
2138                     insn->type != INSN_RETURN &&
2139                     insn->type != INSN_NOP) {
2140                         WARN_FUNC("retpoline_safe hint not an indirect jump/call/ret/nop",
2141                                   insn->sec, insn->offset);
2142                         return -1;
2143                 }
2144
2145                 insn->retpoline_safe = true;
2146         }
2147
2148         return 0;
2149 }
2150
2151 static int read_instr_hints(struct objtool_file *file)
2152 {
2153         struct section *sec;
2154         struct instruction *insn;
2155         struct reloc *reloc;
2156
2157         sec = find_section_by_name(file->elf, ".rela.discard.instr_end");
2158         if (!sec)
2159                 return 0;
2160
2161         list_for_each_entry(reloc, &sec->reloc_list, list) {
2162                 if (reloc->sym->type != STT_SECTION) {
2163                         WARN("unexpected relocation symbol type in %s", sec->name);
2164                         return -1;
2165                 }
2166
2167                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
2168                 if (!insn) {
2169                         WARN("bad .discard.instr_end entry");
2170                         return -1;
2171                 }
2172
2173                 insn->instr--;
2174         }
2175
2176         sec = find_section_by_name(file->elf, ".rela.discard.instr_begin");
2177         if (!sec)
2178                 return 0;
2179
2180         list_for_each_entry(reloc, &sec->reloc_list, list) {
2181                 if (reloc->sym->type != STT_SECTION) {
2182                         WARN("unexpected relocation symbol type in %s", sec->name);
2183                         return -1;
2184                 }
2185
2186                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
2187                 if (!insn) {
2188                         WARN("bad .discard.instr_begin entry");
2189                         return -1;
2190                 }
2191
2192                 insn->instr++;
2193         }
2194
2195         return 0;
2196 }
2197
2198 static int read_intra_function_calls(struct objtool_file *file)
2199 {
2200         struct instruction *insn;
2201         struct section *sec;
2202         struct reloc *reloc;
2203
2204         sec = find_section_by_name(file->elf, ".rela.discard.intra_function_calls");
2205         if (!sec)
2206                 return 0;
2207
2208         list_for_each_entry(reloc, &sec->reloc_list, list) {
2209                 unsigned long dest_off;
2210
2211                 if (reloc->sym->type != STT_SECTION) {
2212                         WARN("unexpected relocation symbol type in %s",
2213                              sec->name);
2214                         return -1;
2215                 }
2216
2217                 insn = find_insn(file, reloc->sym->sec, reloc->addend);
2218                 if (!insn) {
2219                         WARN("bad .discard.intra_function_call entry");
2220                         return -1;
2221                 }
2222
2223                 if (insn->type != INSN_CALL) {
2224                         WARN_FUNC("intra_function_call not a direct call",
2225                                   insn->sec, insn->offset);
2226                         return -1;
2227                 }
2228
2229                 /*
2230                  * Treat intra-function CALLs as JMPs, but with a stack_op.
2231                  * See add_call_destinations(), which strips stack_ops from
2232                  * normal CALLs.
2233                  */
2234                 insn->type = INSN_JUMP_UNCONDITIONAL;
2235
2236                 dest_off = insn->offset + insn->len + insn->immediate;
2237                 insn->jump_dest = find_insn(file, insn->sec, dest_off);
2238                 if (!insn->jump_dest) {
2239                         WARN_FUNC("can't find call dest at %s+0x%lx",
2240                                   insn->sec, insn->offset,
2241                                   insn->sec->name, dest_off);
2242                         return -1;
2243                 }
2244         }
2245
2246         return 0;
2247 }
2248
2249 /*
2250  * Return true if name matches an instrumentation function, where calls to that
2251  * function from noinstr code can safely be removed, but compilers won't do so.
2252  */
2253 static bool is_profiling_func(const char *name)
2254 {
2255         /*
2256          * Many compilers cannot disable KCOV with a function attribute.
2257          */
2258         if (!strncmp(name, "__sanitizer_cov_", 16))
2259                 return true;
2260
2261         /*
2262          * Some compilers currently do not remove __tsan_func_entry/exit nor
2263          * __tsan_atomic_signal_fence (used for barrier instrumentation) with
2264          * the __no_sanitize_thread attribute, remove them. Once the kernel's
2265          * minimum Clang version is 14.0, this can be removed.
2266          */
2267         if (!strncmp(name, "__tsan_func_", 12) ||
2268             !strcmp(name, "__tsan_atomic_signal_fence"))
2269                 return true;
2270
2271         return false;
2272 }
2273
2274 static int classify_symbols(struct objtool_file *file)
2275 {
2276         struct section *sec;
2277         struct symbol *func;
2278
2279         for_each_sec(file, sec) {
2280                 list_for_each_entry(func, &sec->symbol_list, list) {
2281                         if (func->bind != STB_GLOBAL)
2282                                 continue;
2283
2284                         if (!strncmp(func->name, STATIC_CALL_TRAMP_PREFIX_STR,
2285                                      strlen(STATIC_CALL_TRAMP_PREFIX_STR)))
2286                                 func->static_call_tramp = true;
2287
2288                         if (arch_is_retpoline(func))
2289                                 func->retpoline_thunk = true;
2290
2291                         if (arch_is_rethunk(func))
2292                                 func->return_thunk = true;
2293
2294                         if (!strcmp(func->name, "__fentry__"))
2295                                 func->fentry = true;
2296
2297                         if (is_profiling_func(func->name))
2298                                 func->profiling_func = true;
2299                 }
2300         }
2301
2302         return 0;
2303 }
2304
2305 static void mark_rodata(struct objtool_file *file)
2306 {
2307         struct section *sec;
2308         bool found = false;
2309
2310         /*
2311          * Search for the following rodata sections, each of which can
2312          * potentially contain jump tables:
2313          *
2314          * - .rodata: can contain GCC switch tables
2315          * - .rodata.<func>: same, if -fdata-sections is being used
2316          * - .rodata..c_jump_table: contains C annotated jump tables
2317          *
2318          * .rodata.str1.* sections are ignored; they don't contain jump tables.
2319          */
2320         for_each_sec(file, sec) {
2321                 if (!strncmp(sec->name, ".rodata", 7) &&
2322                     !strstr(sec->name, ".str1.")) {
2323                         sec->rodata = true;
2324                         found = true;
2325                 }
2326         }
2327
2328         file->rodata = found;
2329 }
2330
2331 static int decode_sections(struct objtool_file *file)
2332 {
2333         int ret;
2334
2335         mark_rodata(file);
2336
2337         ret = init_pv_ops(file);
2338         if (ret)
2339                 return ret;
2340
2341         ret = decode_instructions(file);
2342         if (ret)
2343                 return ret;
2344
2345         add_ignores(file);
2346         add_uaccess_safe(file);
2347
2348         ret = add_ignore_alternatives(file);
2349         if (ret)
2350                 return ret;
2351
2352         /*
2353          * Must be before read_unwind_hints() since that needs insn->noendbr.
2354          */
2355         ret = read_noendbr_hints(file);
2356         if (ret)
2357                 return ret;
2358
2359         /*
2360          * Must be before add_{jump_call}_destination.
2361          */
2362         ret = classify_symbols(file);
2363         if (ret)
2364                 return ret;
2365
2366         /*
2367          * Must be before add_jump_destinations(), which depends on 'func'
2368          * being set for alternatives, to enable proper sibling call detection.
2369          */
2370         ret = add_special_section_alts(file);
2371         if (ret)
2372                 return ret;
2373
2374         ret = add_jump_destinations(file);
2375         if (ret)
2376                 return ret;
2377
2378         /*
2379          * Must be before add_call_destination(); it changes INSN_CALL to
2380          * INSN_JUMP.
2381          */
2382         ret = read_intra_function_calls(file);
2383         if (ret)
2384                 return ret;
2385
2386         ret = add_call_destinations(file);
2387         if (ret)
2388                 return ret;
2389
2390         /*
2391          * Must be after add_call_destinations() such that it can override
2392          * dead_end_function() marks.
2393          */
2394         ret = add_dead_ends(file);
2395         if (ret)
2396                 return ret;
2397
2398         ret = add_jump_table_alts(file);
2399         if (ret)
2400                 return ret;
2401
2402         ret = read_unwind_hints(file);
2403         if (ret)
2404                 return ret;
2405
2406         ret = read_retpoline_hints(file);
2407         if (ret)
2408                 return ret;
2409
2410         ret = read_instr_hints(file);
2411         if (ret)
2412                 return ret;
2413
2414         return 0;
2415 }
2416
2417 static bool is_fentry_call(struct instruction *insn)
2418 {
2419         if (insn->type == INSN_CALL &&
2420             insn->call_dest &&
2421             insn->call_dest->fentry)
2422                 return true;
2423
2424         return false;
2425 }
2426
2427 static bool has_modified_stack_frame(struct instruction *insn, struct insn_state *state)
2428 {
2429         struct cfi_state *cfi = &state->cfi;
2430         int i;
2431
2432         if (cfi->cfa.base != initial_func_cfi.cfa.base || cfi->drap)
2433                 return true;
2434
2435         if (cfi->cfa.offset != initial_func_cfi.cfa.offset)
2436                 return true;
2437
2438         if (cfi->stack_size != initial_func_cfi.cfa.offset)
2439                 return true;
2440
2441         for (i = 0; i < CFI_NUM_REGS; i++) {
2442                 if (cfi->regs[i].base != initial_func_cfi.regs[i].base ||
2443                     cfi->regs[i].offset != initial_func_cfi.regs[i].offset)
2444                         return true;
2445         }
2446
2447         return false;
2448 }
2449
2450 static bool check_reg_frame_pos(const struct cfi_reg *reg,
2451                                 int expected_offset)
2452 {
2453         return reg->base == CFI_CFA &&
2454                reg->offset == expected_offset;
2455 }
2456
2457 static bool has_valid_stack_frame(struct insn_state *state)
2458 {
2459         struct cfi_state *cfi = &state->cfi;
2460
2461         if (cfi->cfa.base == CFI_BP &&
2462             check_reg_frame_pos(&cfi->regs[CFI_BP], -cfi->cfa.offset) &&
2463             check_reg_frame_pos(&cfi->regs[CFI_RA], -cfi->cfa.offset + 8))
2464                 return true;
2465
2466         if (cfi->drap && cfi->regs[CFI_BP].base == CFI_BP)
2467                 return true;
2468
2469         return false;
2470 }
2471
2472 static int update_cfi_state_regs(struct instruction *insn,
2473                                   struct cfi_state *cfi,
2474                                   struct stack_op *op)
2475 {
2476         struct cfi_reg *cfa = &cfi->cfa;
2477
2478         if (cfa->base != CFI_SP && cfa->base != CFI_SP_INDIRECT)
2479                 return 0;
2480
2481         /* push */
2482         if (op->dest.type == OP_DEST_PUSH || op->dest.type == OP_DEST_PUSHF)
2483                 cfa->offset += 8;
2484
2485         /* pop */
2486         if (op->src.type == OP_SRC_POP || op->src.type == OP_SRC_POPF)
2487                 cfa->offset -= 8;
2488
2489         /* add immediate to sp */
2490         if (op->dest.type == OP_DEST_REG && op->src.type == OP_SRC_ADD &&
2491             op->dest.reg == CFI_SP && op->src.reg == CFI_SP)
2492                 cfa->offset -= op->src.offset;
2493
2494         return 0;
2495 }
2496
2497 static void save_reg(struct cfi_state *cfi, unsigned char reg, int base, int offset)
2498 {
2499         if (arch_callee_saved_reg(reg) &&
2500             cfi->regs[reg].base == CFI_UNDEFINED) {
2501                 cfi->regs[reg].base = base;
2502                 cfi->regs[reg].offset = offset;
2503         }
2504 }
2505
2506 static void restore_reg(struct cfi_state *cfi, unsigned char reg)
2507 {
2508         cfi->regs[reg].base = initial_func_cfi.regs[reg].base;
2509         cfi->regs[reg].offset = initial_func_cfi.regs[reg].offset;
2510 }
2511
2512 /*
2513  * A note about DRAP stack alignment:
2514  *
2515  * GCC has the concept of a DRAP register, which is used to help keep track of
2516  * the stack pointer when aligning the stack.  r10 or r13 is used as the DRAP
2517  * register.  The typical DRAP pattern is:
2518  *
2519  *   4c 8d 54 24 08             lea    0x8(%rsp),%r10
2520  *   48 83 e4 c0                and    $0xffffffffffffffc0,%rsp
2521  *   41 ff 72 f8                pushq  -0x8(%r10)
2522  *   55                         push   %rbp
2523  *   48 89 e5                   mov    %rsp,%rbp
2524  *                              (more pushes)
2525  *   41 52                      push   %r10
2526  *                              ...
2527  *   41 5a                      pop    %r10
2528  *                              (more pops)
2529  *   5d                         pop    %rbp
2530  *   49 8d 62 f8                lea    -0x8(%r10),%rsp
2531  *   c3                         retq
2532  *
2533  * There are some variations in the epilogues, like:
2534  *
2535  *   5b                         pop    %rbx
2536  *   41 5a                      pop    %r10
2537  *   41 5c                      pop    %r12
2538  *   41 5d                      pop    %r13
2539  *   41 5e                      pop    %r14
2540  *   c9                         leaveq
2541  *   49 8d 62 f8                lea    -0x8(%r10),%rsp
2542  *   c3                         retq
2543  *
2544  * and:
2545  *
2546  *   4c 8b 55 e8                mov    -0x18(%rbp),%r10
2547  *   48 8b 5d e0                mov    -0x20(%rbp),%rbx
2548  *   4c 8b 65 f0                mov    -0x10(%rbp),%r12
2549  *   4c 8b 6d f8                mov    -0x8(%rbp),%r13
2550  *   c9                         leaveq
2551  *   49 8d 62 f8                lea    -0x8(%r10),%rsp
2552  *   c3                         retq
2553  *
2554  * Sometimes r13 is used as the DRAP register, in which case it's saved and
2555  * restored beforehand:
2556  *
2557  *   41 55                      push   %r13
2558  *   4c 8d 6c 24 10             lea    0x10(%rsp),%r13
2559  *   48 83 e4 f0                and    $0xfffffffffffffff0,%rsp
2560  *                              ...
2561  *   49 8d 65 f0                lea    -0x10(%r13),%rsp
2562  *   41 5d                      pop    %r13
2563  *   c3                         retq
2564  */
2565 static int update_cfi_state(struct instruction *insn,
2566                             struct instruction *next_insn,
2567                             struct cfi_state *cfi, struct stack_op *op)
2568 {
2569         struct cfi_reg *cfa = &cfi->cfa;
2570         struct cfi_reg *regs = cfi->regs;
2571
2572         /* stack operations don't make sense with an undefined CFA */
2573         if (cfa->base == CFI_UNDEFINED) {
2574                 if (insn->func) {
2575                         WARN_FUNC("undefined stack state", insn->sec, insn->offset);
2576                         return -1;
2577                 }
2578                 return 0;
2579         }
2580
2581         if (cfi->type == UNWIND_HINT_TYPE_REGS ||
2582             cfi->type == UNWIND_HINT_TYPE_REGS_PARTIAL)
2583                 return update_cfi_state_regs(insn, cfi, op);
2584
2585         switch (op->dest.type) {
2586
2587         case OP_DEST_REG:
2588                 switch (op->src.type) {
2589
2590                 case OP_SRC_REG:
2591                         if (op->src.reg == CFI_SP && op->dest.reg == CFI_BP &&
2592                             cfa->base == CFI_SP &&
2593                             check_reg_frame_pos(&regs[CFI_BP], -cfa->offset)) {
2594
2595                                 /* mov %rsp, %rbp */
2596                                 cfa->base = op->dest.reg;
2597                                 cfi->bp_scratch = false;
2598                         }
2599
2600                         else if (op->src.reg == CFI_SP &&
2601                                  op->dest.reg == CFI_BP && cfi->drap) {
2602
2603                                 /* drap: mov %rsp, %rbp */
2604                                 regs[CFI_BP].base = CFI_BP;
2605                                 regs[CFI_BP].offset = -cfi->stack_size;
2606                                 cfi->bp_scratch = false;
2607                         }
2608
2609                         else if (op->src.reg == CFI_SP && cfa->base == CFI_SP) {
2610
2611                                 /*
2612                                  * mov %rsp, %reg
2613                                  *
2614                                  * This is needed for the rare case where GCC
2615                                  * does:
2616                                  *
2617                                  *   mov    %rsp, %rax
2618                                  *   ...
2619                                  *   mov    %rax, %rsp
2620                                  */
2621                                 cfi->vals[op->dest.reg].base = CFI_CFA;
2622                                 cfi->vals[op->dest.reg].offset = -cfi->stack_size;
2623                         }
2624
2625                         else if (op->src.reg == CFI_BP && op->dest.reg == CFI_SP &&
2626                                  (cfa->base == CFI_BP || cfa->base == cfi->drap_reg)) {
2627
2628                                 /*
2629                                  * mov %rbp, %rsp
2630                                  *
2631                                  * Restore the original stack pointer (Clang).
2632                                  */
2633                                 cfi->stack_size = -cfi->regs[CFI_BP].offset;
2634                         }
2635
2636                         else if (op->dest.reg == cfa->base) {
2637
2638                                 /* mov %reg, %rsp */
2639                                 if (cfa->base == CFI_SP &&
2640                                     cfi->vals[op->src.reg].base == CFI_CFA) {
2641
2642                                         /*
2643                                          * This is needed for the rare case
2644                                          * where GCC does something dumb like:
2645                                          *
2646                                          *   lea    0x8(%rsp), %rcx
2647                                          *   ...
2648                                          *   mov    %rcx, %rsp
2649                                          */
2650                                         cfa->offset = -cfi->vals[op->src.reg].offset;
2651                                         cfi->stack_size = cfa->offset;
2652
2653                                 } else if (cfa->base == CFI_SP &&
2654                                            cfi->vals[op->src.reg].base == CFI_SP_INDIRECT &&
2655                                            cfi->vals[op->src.reg].offset == cfa->offset) {
2656
2657                                         /*
2658                                          * Stack swizzle:
2659                                          *
2660                                          * 1: mov %rsp, (%[tos])
2661                                          * 2: mov %[tos], %rsp
2662                                          *    ...
2663                                          * 3: pop %rsp
2664                                          *
2665                                          * Where:
2666                                          *
2667                                          * 1 - places a pointer to the previous
2668                                          *     stack at the Top-of-Stack of the
2669                                          *     new stack.
2670                                          *
2671                                          * 2 - switches to the new stack.
2672                                          *
2673                                          * 3 - pops the Top-of-Stack to restore
2674                                          *     the original stack.
2675                                          *
2676                                          * Note: we set base to SP_INDIRECT
2677                                          * here and preserve offset. Therefore
2678                                          * when the unwinder reaches ToS it
2679                                          * will dereference SP and then add the
2680                                          * offset to find the next frame, IOW:
2681                                          * (%rsp) + offset.
2682                                          */
2683                                         cfa->base = CFI_SP_INDIRECT;
2684
2685                                 } else {
2686                                         cfa->base = CFI_UNDEFINED;
2687                                         cfa->offset = 0;
2688                                 }
2689                         }
2690
2691                         else if (op->dest.reg == CFI_SP &&
2692                                  cfi->vals[op->src.reg].base == CFI_SP_INDIRECT &&
2693                                  cfi->vals[op->src.reg].offset == cfa->offset) {
2694
2695                                 /*
2696                                  * The same stack swizzle case 2) as above. But
2697                                  * because we can't change cfa->base, case 3)
2698                                  * will become a regular POP. Pretend we're a
2699                                  * PUSH so things don't go unbalanced.
2700                                  */
2701                                 cfi->stack_size += 8;
2702                         }
2703
2704
2705                         break;
2706
2707                 case OP_SRC_ADD:
2708                         if (op->dest.reg == CFI_SP && op->src.reg == CFI_SP) {
2709
2710                                 /* add imm, %rsp */
2711                                 cfi->stack_size -= op->src.offset;
2712                                 if (cfa->base == CFI_SP)
2713                                         cfa->offset -= op->src.offset;
2714                                 break;
2715                         }
2716
2717                         if (op->dest.reg == CFI_SP && op->src.reg == CFI_BP) {
2718
2719                                 /* lea disp(%rbp), %rsp */
2720                                 cfi->stack_size = -(op->src.offset + regs[CFI_BP].offset);
2721                                 break;
2722                         }
2723
2724                         if (!cfi->drap && op->src.reg == CFI_SP &&
2725                             op->dest.reg == CFI_BP && cfa->base == CFI_SP &&
2726                             check_reg_frame_pos(&regs[CFI_BP], -cfa->offset + op->src.offset)) {
2727
2728                                 /* lea disp(%rsp), %rbp */
2729                                 cfa->base = CFI_BP;
2730                                 cfa->offset -= op->src.offset;
2731                                 cfi->bp_scratch = false;
2732                                 break;
2733                         }
2734
2735                         if (op->src.reg == CFI_SP && cfa->base == CFI_SP) {
2736
2737                                 /* drap: lea disp(%rsp), %drap */
2738                                 cfi->drap_reg = op->dest.reg;
2739
2740                                 /*
2741                                  * lea disp(%rsp), %reg
2742                                  *
2743                                  * This is needed for the rare case where GCC
2744                                  * does something dumb like:
2745                                  *
2746                                  *   lea    0x8(%rsp), %rcx
2747                                  *   ...
2748                                  *   mov    %rcx, %rsp
2749                                  */
2750                                 cfi->vals[op->dest.reg].base = CFI_CFA;
2751                                 cfi->vals[op->dest.reg].offset = \
2752                                         -cfi->stack_size + op->src.offset;
2753
2754                                 break;
2755                         }
2756
2757                         if (cfi->drap && op->dest.reg == CFI_SP &&
2758                             op->src.reg == cfi->drap_reg) {
2759
2760                                  /* drap: lea disp(%drap), %rsp */
2761                                 cfa->base = CFI_SP;
2762                                 cfa->offset = cfi->stack_size = -op->src.offset;
2763                                 cfi->drap_reg = CFI_UNDEFINED;
2764                                 cfi->drap = false;
2765                                 break;
2766                         }
2767
2768                         if (op->dest.reg == cfi->cfa.base && !(next_insn && next_insn->hint)) {
2769                                 WARN_FUNC("unsupported stack register modification",
2770                                           insn->sec, insn->offset);
2771                                 return -1;
2772                         }
2773
2774                         break;
2775
2776                 case OP_SRC_AND:
2777                         if (op->dest.reg != CFI_SP ||
2778                             (cfi->drap_reg != CFI_UNDEFINED && cfa->base != CFI_SP) ||
2779                             (cfi->drap_reg == CFI_UNDEFINED && cfa->base != CFI_BP)) {
2780                                 WARN_FUNC("unsupported stack pointer realignment",
2781                                           insn->sec, insn->offset);
2782                                 return -1;
2783                         }
2784
2785                         if (cfi->drap_reg != CFI_UNDEFINED) {
2786                                 /* drap: and imm, %rsp */
2787                                 cfa->base = cfi->drap_reg;
2788                                 cfa->offset = cfi->stack_size = 0;
2789                                 cfi->drap = true;
2790                         }
2791
2792                         /*
2793                          * Older versions of GCC (4.8ish) realign the stack
2794                          * without DRAP, with a frame pointer.
2795                          */
2796
2797                         break;
2798
2799                 case OP_SRC_POP:
2800                 case OP_SRC_POPF:
2801                         if (op->dest.reg == CFI_SP && cfa->base == CFI_SP_INDIRECT) {
2802
2803                                 /* pop %rsp; # restore from a stack swizzle */
2804                                 cfa->base = CFI_SP;
2805                                 break;
2806                         }
2807
2808                         if (!cfi->drap && op->dest.reg == cfa->base) {
2809
2810                                 /* pop %rbp */
2811                                 cfa->base = CFI_SP;
2812                         }
2813
2814                         if (cfi->drap && cfa->base == CFI_BP_INDIRECT &&
2815                             op->dest.reg == cfi->drap_reg &&
2816                             cfi->drap_offset == -cfi->stack_size) {
2817
2818                                 /* drap: pop %drap */
2819                                 cfa->base = cfi->drap_reg;
2820                                 cfa->offset = 0;
2821                                 cfi->drap_offset = -1;
2822
2823                         } else if (cfi->stack_size == -regs[op->dest.reg].offset) {
2824
2825                                 /* pop %reg */
2826                                 restore_reg(cfi, op->dest.reg);
2827                         }
2828
2829                         cfi->stack_size -= 8;
2830                         if (cfa->base == CFI_SP)
2831                                 cfa->offset -= 8;
2832
2833                         break;
2834
2835                 case OP_SRC_REG_INDIRECT:
2836                         if (!cfi->drap && op->dest.reg == cfa->base &&
2837                             op->dest.reg == CFI_BP) {
2838
2839                                 /* mov disp(%rsp), %rbp */
2840                                 cfa->base = CFI_SP;
2841                                 cfa->offset = cfi->stack_size;
2842                         }
2843
2844                         if (cfi->drap && op->src.reg == CFI_BP &&
2845                             op->src.offset == cfi->drap_offset) {
2846
2847                                 /* drap: mov disp(%rbp), %drap */
2848                                 cfa->base = cfi->drap_reg;
2849                                 cfa->offset = 0;
2850                                 cfi->drap_offset = -1;
2851                         }
2852
2853                         if (cfi->drap && op->src.reg == CFI_BP &&
2854                             op->src.offset == regs[op->dest.reg].offset) {
2855
2856                                 /* drap: mov disp(%rbp), %reg */
2857                                 restore_reg(cfi, op->dest.reg);
2858
2859                         } else if (op->src.reg == cfa->base &&
2860                             op->src.offset == regs[op->dest.reg].offset + cfa->offset) {
2861
2862                                 /* mov disp(%rbp), %reg */
2863                                 /* mov disp(%rsp), %reg */
2864                                 restore_reg(cfi, op->dest.reg);
2865
2866                         } else if (op->src.reg == CFI_SP &&
2867                                    op->src.offset == regs[op->dest.reg].offset + cfi->stack_size) {
2868
2869                                 /* mov disp(%rsp), %reg */
2870                                 restore_reg(cfi, op->dest.reg);
2871                         }
2872
2873                         break;
2874
2875                 default:
2876                         WARN_FUNC("unknown stack-related instruction",
2877                                   insn->sec, insn->offset);
2878                         return -1;
2879                 }
2880
2881                 break;
2882
2883         case OP_DEST_PUSH:
2884         case OP_DEST_PUSHF:
2885                 cfi->stack_size += 8;
2886                 if (cfa->base == CFI_SP)
2887                         cfa->offset += 8;
2888
2889                 if (op->src.type != OP_SRC_REG)
2890                         break;
2891
2892                 if (cfi->drap) {
2893                         if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) {
2894
2895                                 /* drap: push %drap */
2896                                 cfa->base = CFI_BP_INDIRECT;
2897                                 cfa->offset = -cfi->stack_size;
2898
2899                                 /* save drap so we know when to restore it */
2900                                 cfi->drap_offset = -cfi->stack_size;
2901
2902                         } else if (op->src.reg == CFI_BP && cfa->base == cfi->drap_reg) {
2903
2904                                 /* drap: push %rbp */
2905                                 cfi->stack_size = 0;
2906
2907                         } else {
2908
2909                                 /* drap: push %reg */
2910                                 save_reg(cfi, op->src.reg, CFI_BP, -cfi->stack_size);
2911                         }
2912
2913                 } else {
2914
2915                         /* push %reg */
2916                         save_reg(cfi, op->src.reg, CFI_CFA, -cfi->stack_size);
2917                 }
2918
2919                 /* detect when asm code uses rbp as a scratch register */
2920                 if (opts.stackval && insn->func && op->src.reg == CFI_BP &&
2921                     cfa->base != CFI_BP)
2922                         cfi->bp_scratch = true;
2923                 break;
2924
2925         case OP_DEST_REG_INDIRECT:
2926
2927                 if (cfi->drap) {
2928                         if (op->src.reg == cfa->base && op->src.reg == cfi->drap_reg) {
2929
2930                                 /* drap: mov %drap, disp(%rbp) */
2931                                 cfa->base = CFI_BP_INDIRECT;
2932                                 cfa->offset = op->dest.offset;
2933
2934                                 /* save drap offset so we know when to restore it */
2935                                 cfi->drap_offset = op->dest.offset;
2936                         } else {
2937
2938                                 /* drap: mov reg, disp(%rbp) */
2939                                 save_reg(cfi, op->src.reg, CFI_BP, op->dest.offset);
2940                         }
2941
2942                 } else if (op->dest.reg == cfa->base) {
2943
2944                         /* mov reg, disp(%rbp) */
2945                         /* mov reg, disp(%rsp) */
2946                         save_reg(cfi, op->src.reg, CFI_CFA,
2947                                  op->dest.offset - cfi->cfa.offset);
2948
2949                 } else if (op->dest.reg == CFI_SP) {
2950
2951                         /* mov reg, disp(%rsp) */
2952                         save_reg(cfi, op->src.reg, CFI_CFA,
2953                                  op->dest.offset - cfi->stack_size);
2954
2955                 } else if (op->src.reg == CFI_SP && op->dest.offset == 0) {
2956
2957                         /* mov %rsp, (%reg); # setup a stack swizzle. */
2958                         cfi->vals[op->dest.reg].base = CFI_SP_INDIRECT;
2959                         cfi->vals[op->dest.reg].offset = cfa->offset;
2960                 }
2961
2962                 break;
2963
2964         case OP_DEST_MEM:
2965                 if (op->src.type != OP_SRC_POP && op->src.type != OP_SRC_POPF) {
2966                         WARN_FUNC("unknown stack-related memory operation",
2967                                   insn->sec, insn->offset);
2968                         return -1;
2969                 }
2970
2971                 /* pop mem */
2972                 cfi->stack_size -= 8;
2973                 if (cfa->base == CFI_SP)
2974                         cfa->offset -= 8;
2975
2976                 break;
2977
2978         default:
2979                 WARN_FUNC("unknown stack-related instruction",
2980                           insn->sec, insn->offset);
2981                 return -1;
2982         }
2983
2984         return 0;
2985 }
2986
2987 /*
2988  * The stack layouts of alternatives instructions can sometimes diverge when
2989  * they have stack modifications.  That's fine as long as the potential stack
2990  * layouts don't conflict at any given potential instruction boundary.
2991  *
2992  * Flatten the CFIs of the different alternative code streams (both original
2993  * and replacement) into a single shared CFI array which can be used to detect
2994  * conflicts and nicely feed a linear array of ORC entries to the unwinder.
2995  */
2996 static int propagate_alt_cfi(struct objtool_file *file, struct instruction *insn)
2997 {
2998         struct cfi_state **alt_cfi;
2999         int group_off;
3000
3001         if (!insn->alt_group)
3002                 return 0;
3003
3004         if (!insn->cfi) {
3005                 WARN("CFI missing");
3006                 return -1;
3007         }
3008
3009         alt_cfi = insn->alt_group->cfi;
3010         group_off = insn->offset - insn->alt_group->first_insn->offset;
3011
3012         if (!alt_cfi[group_off]) {
3013                 alt_cfi[group_off] = insn->cfi;
3014         } else {
3015                 if (cficmp(alt_cfi[group_off], insn->cfi)) {
3016                         WARN_FUNC("stack layout conflict in alternatives",
3017                                   insn->sec, insn->offset);
3018                         return -1;
3019                 }
3020         }
3021
3022         return 0;
3023 }
3024
3025 static int handle_insn_ops(struct instruction *insn,
3026                            struct instruction *next_insn,
3027                            struct insn_state *state)
3028 {
3029         struct stack_op *op;
3030
3031         list_for_each_entry(op, &insn->stack_ops, list) {
3032
3033                 if (update_cfi_state(insn, next_insn, &state->cfi, op))
3034                         return 1;
3035
3036                 if (!insn->alt_group)
3037                         continue;
3038
3039                 if (op->dest.type == OP_DEST_PUSHF) {
3040                         if (!state->uaccess_stack) {
3041                                 state->uaccess_stack = 1;
3042                         } else if (state->uaccess_stack >> 31) {
3043                                 WARN_FUNC("PUSHF stack exhausted",
3044                                           insn->sec, insn->offset);
3045                                 return 1;
3046                         }
3047                         state->uaccess_stack <<= 1;
3048                         state->uaccess_stack  |= state->uaccess;
3049                 }
3050
3051                 if (op->src.type == OP_SRC_POPF) {
3052                         if (state->uaccess_stack) {
3053                                 state->uaccess = state->uaccess_stack & 1;
3054                                 state->uaccess_stack >>= 1;
3055                                 if (state->uaccess_stack == 1)
3056                                         state->uaccess_stack = 0;
3057                         }
3058                 }
3059         }
3060
3061         return 0;
3062 }
3063
3064 static bool insn_cfi_match(struct instruction *insn, struct cfi_state *cfi2)
3065 {
3066         struct cfi_state *cfi1 = insn->cfi;
3067         int i;
3068
3069         if (!cfi1) {
3070                 WARN("CFI missing");
3071                 return false;
3072         }
3073
3074         if (memcmp(&cfi1->cfa, &cfi2->cfa, sizeof(cfi1->cfa))) {
3075
3076                 WARN_FUNC("stack state mismatch: cfa1=%d%+d cfa2=%d%+d",
3077                           insn->sec, insn->offset,
3078                           cfi1->cfa.base, cfi1->cfa.offset,
3079                           cfi2->cfa.base, cfi2->cfa.offset);
3080
3081         } else if (memcmp(&cfi1->regs, &cfi2->regs, sizeof(cfi1->regs))) {
3082                 for (i = 0; i < CFI_NUM_REGS; i++) {
3083                         if (!memcmp(&cfi1->regs[i], &cfi2->regs[i],
3084                                     sizeof(struct cfi_reg)))
3085                                 continue;
3086
3087                         WARN_FUNC("stack state mismatch: reg1[%d]=%d%+d reg2[%d]=%d%+d",
3088                                   insn->sec, insn->offset,
3089                                   i, cfi1->regs[i].base, cfi1->regs[i].offset,
3090                                   i, cfi2->regs[i].base, cfi2->regs[i].offset);
3091                         break;
3092                 }
3093
3094         } else if (cfi1->type != cfi2->type) {
3095
3096                 WARN_FUNC("stack state mismatch: type1=%d type2=%d",
3097                           insn->sec, insn->offset, cfi1->type, cfi2->type);
3098
3099         } else if (cfi1->drap != cfi2->drap ||
3100                    (cfi1->drap && cfi1->drap_reg != cfi2->drap_reg) ||
3101                    (cfi1->drap && cfi1->drap_offset != cfi2->drap_offset)) {
3102
3103                 WARN_FUNC("stack state mismatch: drap1=%d(%d,%d) drap2=%d(%d,%d)",
3104                           insn->sec, insn->offset,
3105                           cfi1->drap, cfi1->drap_reg, cfi1->drap_offset,
3106                           cfi2->drap, cfi2->drap_reg, cfi2->drap_offset);
3107
3108         } else
3109                 return true;
3110
3111         return false;
3112 }
3113
3114 static inline bool func_uaccess_safe(struct symbol *func)
3115 {
3116         if (func)
3117                 return func->uaccess_safe;
3118
3119         return false;
3120 }
3121
3122 static inline const char *call_dest_name(struct instruction *insn)
3123 {
3124         static char pvname[19];
3125         struct reloc *rel;
3126         int idx;
3127
3128         if (insn->call_dest)
3129                 return insn->call_dest->name;
3130
3131         rel = insn_reloc(NULL, insn);
3132         if (rel && !strcmp(rel->sym->name, "pv_ops")) {
3133                 idx = (rel->addend / sizeof(void *));
3134                 snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
3135                 return pvname;
3136         }
3137
3138         return "{dynamic}";
3139 }
3140
3141 static bool pv_call_dest(struct objtool_file *file, struct instruction *insn)
3142 {
3143         struct symbol *target;
3144         struct reloc *rel;
3145         int idx;
3146
3147         rel = insn_reloc(file, insn);
3148         if (!rel || strcmp(rel->sym->name, "pv_ops"))
3149                 return false;
3150
3151         idx = (arch_dest_reloc_offset(rel->addend) / sizeof(void *));
3152
3153         if (file->pv_ops[idx].clean)
3154                 return true;
3155
3156         file->pv_ops[idx].clean = true;
3157
3158         list_for_each_entry(target, &file->pv_ops[idx].targets, pv_target) {
3159                 if (!target->sec->noinstr) {
3160                         WARN("pv_ops[%d]: %s", idx, target->name);
3161                         file->pv_ops[idx].clean = false;
3162                 }
3163         }
3164
3165         return file->pv_ops[idx].clean;
3166 }
3167
3168 static inline bool noinstr_call_dest(struct objtool_file *file,
3169                                      struct instruction *insn,
3170                                      struct symbol *func)
3171 {
3172         /*
3173          * We can't deal with indirect function calls at present;
3174          * assume they're instrumented.
3175          */
3176         if (!func) {
3177                 if (file->pv_ops)
3178                         return pv_call_dest(file, insn);
3179
3180                 return false;
3181         }
3182
3183         /*
3184          * If the symbol is from a noinstr section; we good.
3185          */
3186         if (func->sec->noinstr)
3187                 return true;
3188
3189         /*
3190          * The __ubsan_handle_*() calls are like WARN(), they only happen when
3191          * something 'BAD' happened. At the risk of taking the machine down,
3192          * let them proceed to get the message out.
3193          */
3194         if (!strncmp(func->name, "__ubsan_handle_", 15))
3195                 return true;
3196
3197         return false;
3198 }
3199
3200 static int validate_call(struct objtool_file *file,
3201                          struct instruction *insn,
3202                          struct insn_state *state)
3203 {
3204         if (state->noinstr && state->instr <= 0 &&
3205             !noinstr_call_dest(file, insn, insn->call_dest)) {
3206                 WARN_FUNC("call to %s() leaves .noinstr.text section",
3207                                 insn->sec, insn->offset, call_dest_name(insn));
3208                 return 1;
3209         }
3210
3211         if (state->uaccess && !func_uaccess_safe(insn->call_dest)) {
3212                 WARN_FUNC("call to %s() with UACCESS enabled",
3213                                 insn->sec, insn->offset, call_dest_name(insn));
3214                 return 1;
3215         }
3216
3217         if (state->df) {
3218                 WARN_FUNC("call to %s() with DF set",
3219                                 insn->sec, insn->offset, call_dest_name(insn));
3220                 return 1;
3221         }
3222
3223         return 0;
3224 }
3225
3226 static int validate_sibling_call(struct objtool_file *file,
3227                                  struct instruction *insn,
3228                                  struct insn_state *state)
3229 {
3230         if (has_modified_stack_frame(insn, state)) {
3231                 WARN_FUNC("sibling call from callable instruction with modified stack frame",
3232                                 insn->sec, insn->offset);
3233                 return 1;
3234         }
3235
3236         return validate_call(file, insn, state);
3237 }
3238
3239 static int validate_return(struct symbol *func, struct instruction *insn, struct insn_state *state)
3240 {
3241         if (state->noinstr && state->instr > 0) {
3242                 WARN_FUNC("return with instrumentation enabled",
3243                           insn->sec, insn->offset);
3244                 return 1;
3245         }
3246
3247         if (state->uaccess && !func_uaccess_safe(func)) {
3248                 WARN_FUNC("return with UACCESS enabled",
3249                           insn->sec, insn->offset);
3250                 return 1;
3251         }
3252
3253         if (!state->uaccess && func_uaccess_safe(func)) {
3254                 WARN_FUNC("return with UACCESS disabled from a UACCESS-safe function",
3255                           insn->sec, insn->offset);
3256                 return 1;
3257         }
3258
3259         if (state->df) {
3260                 WARN_FUNC("return with DF set",
3261                           insn->sec, insn->offset);
3262                 return 1;
3263         }
3264
3265         if (func && has_modified_stack_frame(insn, state)) {
3266                 WARN_FUNC("return with modified stack frame",
3267                           insn->sec, insn->offset);
3268                 return 1;
3269         }
3270
3271         if (state->cfi.bp_scratch) {
3272                 WARN_FUNC("BP used as a scratch register",
3273                           insn->sec, insn->offset);
3274                 return 1;
3275         }
3276
3277         return 0;
3278 }
3279
3280 static struct instruction *next_insn_to_validate(struct objtool_file *file,
3281                                                  struct instruction *insn)
3282 {
3283         struct alt_group *alt_group = insn->alt_group;
3284
3285         /*
3286          * Simulate the fact that alternatives are patched in-place.  When the
3287          * end of a replacement alt_group is reached, redirect objtool flow to
3288          * the end of the original alt_group.
3289          */
3290         if (alt_group && insn == alt_group->last_insn && alt_group->orig_group)
3291                 return next_insn_same_sec(file, alt_group->orig_group->last_insn);
3292
3293         return next_insn_same_sec(file, insn);
3294 }
3295
3296 /*
3297  * Follow the branch starting at the given instruction, and recursively follow
3298  * any other branches (jumps).  Meanwhile, track the frame pointer state at
3299  * each instruction and validate all the rules described in
3300  * tools/objtool/Documentation/objtool.txt.
3301  */
3302 static int validate_branch(struct objtool_file *file, struct symbol *func,
3303                            struct instruction *insn, struct insn_state state)
3304 {
3305         struct alternative *alt;
3306         struct instruction *next_insn, *prev_insn = NULL;
3307         struct section *sec;
3308         u8 visited;
3309         int ret;
3310
3311         sec = insn->sec;
3312
3313         while (1) {
3314                 next_insn = next_insn_to_validate(file, insn);
3315
3316                 if (func && insn->func && func != insn->func->pfunc) {
3317                         WARN("%s() falls through to next function %s()",
3318                              func->name, insn->func->name);
3319                         return 1;
3320                 }
3321
3322                 if (func && insn->ignore) {
3323                         WARN_FUNC("BUG: why am I validating an ignored function?",
3324                                   sec, insn->offset);
3325                         return 1;
3326                 }
3327
3328                 visited = VISITED_BRANCH << state.uaccess;
3329                 if (insn->visited & VISITED_BRANCH_MASK) {
3330                         if (!insn->hint && !insn_cfi_match(insn, &state.cfi))
3331                                 return 1;
3332
3333                         if (insn->visited & visited)
3334                                 return 0;
3335                 } else {
3336                         nr_insns_visited++;
3337                 }
3338
3339                 if (state.noinstr)
3340                         state.instr += insn->instr;
3341
3342                 if (insn->hint) {
3343                         if (insn->restore) {
3344                                 struct instruction *save_insn, *i;
3345
3346                                 i = insn;
3347                                 save_insn = NULL;
3348
3349                                 sym_for_each_insn_continue_reverse(file, func, i) {
3350                                         if (i->save) {
3351                                                 save_insn = i;
3352                                                 break;
3353                                         }
3354                                 }
3355
3356                                 if (!save_insn) {
3357                                         WARN_FUNC("no corresponding CFI save for CFI restore",
3358                                                   sec, insn->offset);
3359                                         return 1;
3360                                 }
3361
3362                                 if (!save_insn->visited) {
3363                                         WARN_FUNC("objtool isn't smart enough to handle this CFI save/restore combo",
3364                                                   sec, insn->offset);
3365                                         return 1;
3366                                 }
3367
3368                                 insn->cfi = save_insn->cfi;
3369                                 nr_cfi_reused++;
3370                         }
3371
3372                         state.cfi = *insn->cfi;
3373                 } else {
3374                         /* XXX track if we actually changed state.cfi */
3375
3376                         if (prev_insn && !cficmp(prev_insn->cfi, &state.cfi)) {
3377                                 insn->cfi = prev_insn->cfi;
3378                                 nr_cfi_reused++;
3379                         } else {
3380                                 insn->cfi = cfi_hash_find_or_add(&state.cfi);
3381                         }
3382                 }
3383
3384                 insn->visited |= visited;
3385
3386                 if (propagate_alt_cfi(file, insn))
3387                         return 1;
3388
3389                 if (!insn->ignore_alts && !list_empty(&insn->alts)) {
3390                         bool skip_orig = false;
3391
3392                         list_for_each_entry(alt, &insn->alts, list) {
3393                                 if (alt->skip_orig)
3394                                         skip_orig = true;
3395
3396                                 ret = validate_branch(file, func, alt->insn, state);
3397                                 if (ret) {
3398                                         if (opts.backtrace)
3399                                                 BT_FUNC("(alt)", insn);
3400                                         return ret;
3401                                 }
3402                         }
3403
3404                         if (skip_orig)
3405                                 return 0;
3406                 }
3407
3408                 if (handle_insn_ops(insn, next_insn, &state))
3409                         return 1;
3410
3411                 switch (insn->type) {
3412
3413                 case INSN_RETURN:
3414                         return validate_return(func, insn, &state);
3415
3416                 case INSN_CALL:
3417                 case INSN_CALL_DYNAMIC:
3418                         ret = validate_call(file, insn, &state);
3419                         if (ret)
3420                                 return ret;
3421
3422                         if (opts.stackval && func && !is_fentry_call(insn) &&
3423                             !has_valid_stack_frame(&state)) {
3424                                 WARN_FUNC("call without frame pointer save/setup",
3425                                           sec, insn->offset);
3426                                 return 1;
3427                         }
3428
3429                         if (insn->dead_end)
3430                                 return 0;
3431
3432                         break;
3433
3434                 case INSN_JUMP_CONDITIONAL:
3435                 case INSN_JUMP_UNCONDITIONAL:
3436                         if (is_sibling_call(insn)) {
3437                                 ret = validate_sibling_call(file, insn, &state);
3438                                 if (ret)
3439                                         return ret;
3440
3441                         } else if (insn->jump_dest) {
3442                                 ret = validate_branch(file, func,
3443                                                       insn->jump_dest, state);
3444                                 if (ret) {
3445                                         if (opts.backtrace)
3446                                                 BT_FUNC("(branch)", insn);
3447                                         return ret;
3448                                 }
3449                         }
3450
3451                         if (insn->type == INSN_JUMP_UNCONDITIONAL)
3452                                 return 0;
3453
3454                         break;
3455
3456                 case INSN_JUMP_DYNAMIC:
3457                 case INSN_JUMP_DYNAMIC_CONDITIONAL:
3458                         if (is_sibling_call(insn)) {
3459                                 ret = validate_sibling_call(file, insn, &state);
3460                                 if (ret)
3461                                         return ret;
3462                         }
3463
3464                         if (insn->type == INSN_JUMP_DYNAMIC)
3465                                 return 0;
3466
3467                         break;
3468
3469                 case INSN_CONTEXT_SWITCH:
3470                         if (func && (!next_insn || !next_insn->hint)) {
3471                                 WARN_FUNC("unsupported instruction in callable function",
3472                                           sec, insn->offset);
3473                                 return 1;
3474                         }
3475                         return 0;
3476
3477                 case INSN_STAC:
3478                         if (state.uaccess) {
3479                                 WARN_FUNC("recursive UACCESS enable", sec, insn->offset);
3480                                 return 1;
3481                         }
3482
3483                         state.uaccess = true;
3484                         break;
3485
3486                 case INSN_CLAC:
3487                         if (!state.uaccess && func) {
3488                                 WARN_FUNC("redundant UACCESS disable", sec, insn->offset);
3489                                 return 1;
3490                         }
3491
3492                         if (func_uaccess_safe(func) && !state.uaccess_stack) {
3493                                 WARN_FUNC("UACCESS-safe disables UACCESS", sec, insn->offset);
3494                                 return 1;
3495                         }
3496
3497                         state.uaccess = false;
3498                         break;
3499
3500                 case INSN_STD:
3501                         if (state.df) {
3502                                 WARN_FUNC("recursive STD", sec, insn->offset);
3503                                 return 1;
3504                         }
3505
3506                         state.df = true;
3507                         break;
3508
3509                 case INSN_CLD:
3510                         if (!state.df && func) {
3511                                 WARN_FUNC("redundant CLD", sec, insn->offset);
3512                                 return 1;
3513                         }
3514
3515                         state.df = false;
3516                         break;
3517
3518                 default:
3519                         break;
3520                 }
3521
3522                 if (insn->dead_end)
3523                         return 0;
3524
3525                 if (!next_insn) {
3526                         if (state.cfi.cfa.base == CFI_UNDEFINED)
3527                                 return 0;
3528                         WARN("%s: unexpected end of section", sec->name);
3529                         return 1;
3530                 }
3531
3532                 prev_insn = insn;
3533                 insn = next_insn;
3534         }
3535
3536         return 0;
3537 }
3538
3539 static int validate_unwind_hints(struct objtool_file *file, struct section *sec)
3540 {
3541         struct instruction *insn;
3542         struct insn_state state;
3543         int ret, warnings = 0;
3544
3545         if (!file->hints)
3546                 return 0;
3547
3548         init_insn_state(file, &state, sec);
3549
3550         if (sec) {
3551                 insn = find_insn(file, sec, 0);
3552                 if (!insn)
3553                         return 0;
3554         } else {
3555                 insn = list_first_entry(&file->insn_list, typeof(*insn), list);
3556         }
3557
3558         while (&insn->list != &file->insn_list && (!sec || insn->sec == sec)) {
3559                 if (insn->hint && !insn->visited && !insn->ignore) {
3560                         ret = validate_branch(file, insn->func, insn, state);
3561                         if (ret && opts.backtrace)
3562                                 BT_FUNC("<=== (hint)", insn);
3563                         warnings += ret;
3564                 }
3565
3566                 insn = list_next_entry(insn, list);
3567         }
3568
3569         return warnings;
3570 }
3571
3572 /*
3573  * Validate rethunk entry constraint: must untrain RET before the first RET.
3574  *
3575  * Follow every branch (intra-function) and ensure ANNOTATE_UNRET_END comes
3576  * before an actual RET instruction.
3577  */
3578 static int validate_entry(struct objtool_file *file, struct instruction *insn)
3579 {
3580         struct instruction *next, *dest;
3581         int ret, warnings = 0;
3582
3583         for (;;) {
3584                 next = next_insn_to_validate(file, insn);
3585
3586                 if (insn->visited & VISITED_ENTRY)
3587                         return 0;
3588
3589                 insn->visited |= VISITED_ENTRY;
3590
3591                 if (!insn->ignore_alts && !list_empty(&insn->alts)) {
3592                         struct alternative *alt;
3593                         bool skip_orig = false;
3594
3595                         list_for_each_entry(alt, &insn->alts, list) {
3596                                 if (alt->skip_orig)
3597                                         skip_orig = true;
3598
3599                                 ret = validate_entry(file, alt->insn);
3600                                 if (ret) {
3601                                         if (opts.backtrace)
3602                                                 BT_FUNC("(alt)", insn);
3603                                         return ret;
3604                                 }
3605                         }
3606
3607                         if (skip_orig)
3608                                 return 0;
3609                 }
3610
3611                 switch (insn->type) {
3612
3613                 case INSN_CALL_DYNAMIC:
3614                 case INSN_JUMP_DYNAMIC:
3615                 case INSN_JUMP_DYNAMIC_CONDITIONAL:
3616                         WARN_FUNC("early indirect call", insn->sec, insn->offset);
3617                         return 1;
3618
3619                 case INSN_JUMP_UNCONDITIONAL:
3620                 case INSN_JUMP_CONDITIONAL:
3621                         if (!is_sibling_call(insn)) {
3622                                 if (!insn->jump_dest) {
3623                                         WARN_FUNC("unresolved jump target after linking?!?",
3624                                                   insn->sec, insn->offset);
3625                                         return -1;
3626                                 }
3627                                 ret = validate_entry(file, insn->jump_dest);
3628                                 if (ret) {
3629                                         if (opts.backtrace) {
3630                                                 BT_FUNC("(branch%s)", insn,
3631                                                         insn->type == INSN_JUMP_CONDITIONAL ? "-cond" : "");
3632                                         }
3633                                         return ret;
3634                                 }
3635
3636                                 if (insn->type == INSN_JUMP_UNCONDITIONAL)
3637                                         return 0;
3638
3639                                 break;
3640                         }
3641
3642                         /* fallthrough */
3643                 case INSN_CALL:
3644                         dest = find_insn(file, insn->call_dest->sec,
3645                                          insn->call_dest->offset);
3646                         if (!dest) {
3647                                 WARN("Unresolved function after linking!?: %s",
3648                                      insn->call_dest->name);
3649                                 return -1;
3650                         }
3651
3652                         ret = validate_entry(file, dest);
3653                         if (ret) {
3654                                 if (opts.backtrace)
3655                                         BT_FUNC("(call)", insn);
3656                                 return ret;
3657                         }
3658                         /*
3659                          * If a call returns without error, it must have seen UNTRAIN_RET.
3660                          * Therefore any non-error return is a success.
3661                          */
3662                         return 0;
3663
3664                 case INSN_RETURN:
3665                         WARN_FUNC("RET before UNTRAIN", insn->sec, insn->offset);
3666                         return 1;
3667
3668                 case INSN_NOP:
3669                         if (insn->retpoline_safe)
3670                                 return 0;
3671                         break;
3672
3673                 default:
3674                         break;
3675                 }
3676
3677                 if (!next) {
3678                         WARN_FUNC("teh end!", insn->sec, insn->offset);
3679                         return -1;
3680                 }
3681                 insn = next;
3682         }
3683
3684         return warnings;
3685 }
3686
3687 /*
3688  * Validate that all branches starting at 'insn->entry' encounter UNRET_END
3689  * before RET.
3690  */
3691 static int validate_unret(struct objtool_file *file)
3692 {
3693         struct instruction *insn;
3694         int ret, warnings = 0;
3695
3696         for_each_insn(file, insn) {
3697                 if (!insn->entry)
3698                         continue;
3699
3700                 ret = validate_entry(file, insn);
3701                 if (ret < 0) {
3702                         WARN_FUNC("Failed UNRET validation", insn->sec, insn->offset);
3703                         return ret;
3704                 }
3705                 warnings += ret;
3706         }
3707
3708         return warnings;
3709 }
3710
3711 static int validate_retpoline(struct objtool_file *file)
3712 {
3713         struct instruction *insn;
3714         int warnings = 0;
3715
3716         for_each_insn(file, insn) {
3717                 if (insn->type != INSN_JUMP_DYNAMIC &&
3718                     insn->type != INSN_CALL_DYNAMIC &&
3719                     insn->type != INSN_RETURN)
3720                         continue;
3721
3722                 if (insn->retpoline_safe)
3723                         continue;
3724
3725                 /*
3726                  * .init.text code is ran before userspace and thus doesn't
3727                  * strictly need retpolines, except for modules which are
3728                  * loaded late, they very much do need retpoline in their
3729                  * .init.text
3730                  */
3731                 if (!strcmp(insn->sec->name, ".init.text") && !opts.module)
3732                         continue;
3733
3734                 if (insn->type == INSN_RETURN) {
3735                         if (opts.rethunk) {
3736                                 WARN_FUNC("'naked' return found in RETHUNK build",
3737                                           insn->sec, insn->offset);
3738                         } else
3739                                 continue;
3740                 } else {
3741                         WARN_FUNC("indirect %s found in RETPOLINE build",
3742                                   insn->sec, insn->offset,
3743                                   insn->type == INSN_JUMP_DYNAMIC ? "jump" : "call");
3744                 }
3745
3746                 warnings++;
3747         }
3748
3749         return warnings;
3750 }
3751
3752 static bool is_kasan_insn(struct instruction *insn)
3753 {
3754         return (insn->type == INSN_CALL &&
3755                 !strcmp(insn->call_dest->name, "__asan_handle_no_return"));
3756 }
3757
3758 static bool is_ubsan_insn(struct instruction *insn)
3759 {
3760         return (insn->type == INSN_CALL &&
3761                 !strcmp(insn->call_dest->name,
3762                         "__ubsan_handle_builtin_unreachable"));
3763 }
3764
3765 static bool ignore_unreachable_insn(struct objtool_file *file, struct instruction *insn)
3766 {
3767         int i;
3768         struct instruction *prev_insn;
3769
3770         if (insn->ignore || insn->type == INSN_NOP || insn->type == INSN_TRAP)
3771                 return true;
3772
3773         /*
3774          * Ignore alternative replacement instructions.  This can happen
3775          * when a whitelisted function uses one of the ALTERNATIVE macros.
3776          */
3777         if (!strcmp(insn->sec->name, ".altinstr_replacement") ||
3778             !strcmp(insn->sec->name, ".altinstr_aux"))
3779                 return true;
3780
3781         /*
3782          * Whole archive runs might encounter dead code from weak symbols.
3783          * This is where the linker will have dropped the weak symbol in
3784          * favour of a regular symbol, but leaves the code in place.
3785          *
3786          * In this case we'll find a piece of code (whole function) that is not
3787          * covered by a !section symbol. Ignore them.
3788          */
3789         if (opts.link && !insn->func) {
3790                 int size = find_symbol_hole_containing(insn->sec, insn->offset);
3791                 unsigned long end = insn->offset + size;
3792
3793                 if (!size) /* not a hole */
3794                         return false;
3795
3796                 if (size < 0) /* hole until the end */
3797                         return true;
3798
3799                 sec_for_each_insn_continue(file, insn) {
3800                         /*
3801                          * If we reach a visited instruction at or before the
3802                          * end of the hole, ignore the unreachable.
3803                          */
3804                         if (insn->visited)
3805                                 return true;
3806
3807                         if (insn->offset >= end)
3808                                 break;
3809
3810                         /*
3811                          * If this hole jumps to a .cold function, mark it ignore too.
3812                          */
3813                         if (insn->jump_dest && insn->jump_dest->func &&
3814                             strstr(insn->jump_dest->func->name, ".cold")) {
3815                                 struct instruction *dest = insn->jump_dest;
3816                                 func_for_each_insn(file, dest->func, dest)
3817                                         dest->ignore = true;
3818                         }
3819                 }
3820
3821                 return false;
3822         }
3823
3824         if (!insn->func)
3825                 return false;
3826
3827         if (insn->func->static_call_tramp)
3828                 return true;
3829
3830         /*
3831          * CONFIG_UBSAN_TRAP inserts a UD2 when it sees
3832          * __builtin_unreachable().  The BUG() macro has an unreachable() after
3833          * the UD2, which causes GCC's undefined trap logic to emit another UD2
3834          * (or occasionally a JMP to UD2).
3835          *
3836          * It may also insert a UD2 after calling a __noreturn function.
3837          */
3838         prev_insn = list_prev_entry(insn, list);
3839         if ((prev_insn->dead_end || dead_end_function(file, prev_insn->call_dest)) &&
3840             (insn->type == INSN_BUG ||
3841              (insn->type == INSN_JUMP_UNCONDITIONAL &&
3842               insn->jump_dest && insn->jump_dest->type == INSN_BUG)))
3843                 return true;
3844
3845         /*
3846          * Check if this (or a subsequent) instruction is related to
3847          * CONFIG_UBSAN or CONFIG_KASAN.
3848          *
3849          * End the search at 5 instructions to avoid going into the weeds.
3850          */
3851         for (i = 0; i < 5; i++) {
3852
3853                 if (is_kasan_insn(insn) || is_ubsan_insn(insn))
3854                         return true;
3855
3856                 if (insn->type == INSN_JUMP_UNCONDITIONAL) {
3857                         if (insn->jump_dest &&
3858                             insn->jump_dest->func == insn->func) {
3859                                 insn = insn->jump_dest;
3860                                 continue;
3861                         }
3862
3863                         break;
3864                 }
3865
3866                 if (insn->offset + insn->len >= insn->func->offset + insn->func->len)
3867                         break;
3868
3869                 insn = list_next_entry(insn, list);
3870         }
3871
3872         return false;
3873 }
3874
3875 static int validate_symbol(struct objtool_file *file, struct section *sec,
3876                            struct symbol *sym, struct insn_state *state)
3877 {
3878         struct instruction *insn;
3879         int ret;
3880
3881         if (!sym->len) {
3882                 WARN("%s() is missing an ELF size annotation", sym->name);
3883                 return 1;
3884         }
3885
3886         if (sym->pfunc != sym || sym->alias != sym)
3887                 return 0;
3888
3889         insn = find_insn(file, sec, sym->offset);
3890         if (!insn || insn->ignore || insn->visited)
3891                 return 0;
3892
3893         state->uaccess = sym->uaccess_safe;
3894
3895         ret = validate_branch(file, insn->func, insn, *state);
3896         if (ret && opts.backtrace)
3897                 BT_FUNC("<=== (sym)", insn);
3898         return ret;
3899 }
3900
3901 static int validate_section(struct objtool_file *file, struct section *sec)
3902 {
3903         struct insn_state state;
3904         struct symbol *func;
3905         int warnings = 0;
3906
3907         list_for_each_entry(func, &sec->symbol_list, list) {
3908                 if (func->type != STT_FUNC)
3909                         continue;
3910
3911                 init_insn_state(file, &state, sec);
3912                 set_func_state(&state.cfi);
3913
3914                 warnings += validate_symbol(file, sec, func, &state);
3915         }
3916
3917         return warnings;
3918 }
3919
3920 static int validate_noinstr_sections(struct objtool_file *file)
3921 {
3922         struct section *sec;
3923         int warnings = 0;
3924
3925         sec = find_section_by_name(file->elf, ".noinstr.text");
3926         if (sec) {
3927                 warnings += validate_section(file, sec);
3928                 warnings += validate_unwind_hints(file, sec);
3929         }
3930
3931         sec = find_section_by_name(file->elf, ".entry.text");
3932         if (sec) {
3933                 warnings += validate_section(file, sec);
3934                 warnings += validate_unwind_hints(file, sec);
3935         }
3936
3937         return warnings;
3938 }
3939
3940 static int validate_functions(struct objtool_file *file)
3941 {
3942         struct section *sec;
3943         int warnings = 0;
3944
3945         for_each_sec(file, sec) {
3946                 if (!(sec->sh.sh_flags & SHF_EXECINSTR))
3947                         continue;
3948
3949                 warnings += validate_section(file, sec);
3950         }
3951
3952         return warnings;
3953 }
3954
3955 static void mark_endbr_used(struct instruction *insn)
3956 {
3957         if (!list_empty(&insn->call_node))
3958                 list_del_init(&insn->call_node);
3959 }
3960
3961 static int validate_ibt_insn(struct objtool_file *file, struct instruction *insn)
3962 {
3963         struct instruction *dest;
3964         struct reloc *reloc;
3965         unsigned long off;
3966         int warnings = 0;
3967
3968         /*
3969          * Looking for function pointer load relocations.  Ignore
3970          * direct/indirect branches:
3971          */
3972         switch (insn->type) {
3973         case INSN_CALL:
3974         case INSN_CALL_DYNAMIC:
3975         case INSN_JUMP_CONDITIONAL:
3976         case INSN_JUMP_UNCONDITIONAL:
3977         case INSN_JUMP_DYNAMIC:
3978         case INSN_JUMP_DYNAMIC_CONDITIONAL:
3979         case INSN_RETURN:
3980         case INSN_NOP:
3981                 return 0;
3982         default:
3983                 break;
3984         }
3985
3986         for (reloc = insn_reloc(file, insn);
3987              reloc;
3988              reloc = find_reloc_by_dest_range(file->elf, insn->sec,
3989                                               reloc->offset + 1,
3990                                               (insn->offset + insn->len) - (reloc->offset + 1))) {
3991
3992                 /*
3993                  * static_call_update() references the trampoline, which
3994                  * doesn't have (or need) ENDBR.  Skip warning in that case.
3995                  */
3996                 if (reloc->sym->static_call_tramp)
3997                         continue;
3998
3999                 off = reloc->sym->offset;
4000                 if (reloc->type == R_X86_64_PC32 || reloc->type == R_X86_64_PLT32)
4001                         off += arch_dest_reloc_offset(reloc->addend);
4002                 else
4003                         off += reloc->addend;
4004
4005                 dest = find_insn(file, reloc->sym->sec, off);
4006                 if (!dest)
4007                         continue;
4008
4009                 if (dest->type == INSN_ENDBR) {
4010                         mark_endbr_used(dest);
4011                         continue;
4012                 }
4013
4014                 if (dest->func && dest->func == insn->func) {
4015                         /*
4016                          * Anything from->to self is either _THIS_IP_ or
4017                          * IRET-to-self.
4018                          *
4019                          * There is no sane way to annotate _THIS_IP_ since the
4020                          * compiler treats the relocation as a constant and is
4021                          * happy to fold in offsets, skewing any annotation we
4022                          * do, leading to vast amounts of false-positives.
4023                          *
4024                          * There's also compiler generated _THIS_IP_ through
4025                          * KCOV and such which we have no hope of annotating.
4026                          *
4027                          * As such, blanket accept self-references without
4028                          * issue.
4029                          */
4030                         continue;
4031                 }
4032
4033                 if (dest->noendbr)
4034                         continue;
4035
4036                 WARN_FUNC("relocation to !ENDBR: %s",
4037                           insn->sec, insn->offset,
4038                           offstr(dest->sec, dest->offset));
4039
4040                 warnings++;
4041         }
4042
4043         return warnings;
4044 }
4045
4046 static int validate_ibt_data_reloc(struct objtool_file *file,
4047                                    struct reloc *reloc)
4048 {
4049         struct instruction *dest;
4050
4051         dest = find_insn(file, reloc->sym->sec,
4052                          reloc->sym->offset + reloc->addend);
4053         if (!dest)
4054                 return 0;
4055
4056         if (dest->type == INSN_ENDBR) {
4057                 mark_endbr_used(dest);
4058                 return 0;
4059         }
4060
4061         if (dest->noendbr)
4062                 return 0;
4063
4064         WARN_FUNC("data relocation to !ENDBR: %s",
4065                   reloc->sec->base, reloc->offset,
4066                   offstr(dest->sec, dest->offset));
4067
4068         return 1;
4069 }
4070
4071 /*
4072  * Validate IBT rules and remove used ENDBR instructions from the seal list.
4073  * Unused ENDBR instructions will be annotated for sealing (i.e., replaced with
4074  * NOPs) later, in create_ibt_endbr_seal_sections().
4075  */
4076 static int validate_ibt(struct objtool_file *file)
4077 {
4078         struct section *sec;
4079         struct reloc *reloc;
4080         struct instruction *insn;
4081         int warnings = 0;
4082
4083         for_each_insn(file, insn)
4084                 warnings += validate_ibt_insn(file, insn);
4085
4086         for_each_sec(file, sec) {
4087
4088                 /* Already done by validate_ibt_insn() */
4089                 if (sec->sh.sh_flags & SHF_EXECINSTR)
4090                         continue;
4091
4092                 if (!sec->reloc)
4093                         continue;
4094
4095                 /*
4096                  * These sections can reference text addresses, but not with
4097                  * the intent to indirect branch to them.
4098                  */
4099                 if (!strncmp(sec->name, ".discard", 8)                  ||
4100                     !strncmp(sec->name, ".debug", 6)                    ||
4101                     !strcmp(sec->name, ".altinstructions")              ||
4102                     !strcmp(sec->name, ".ibt_endbr_seal")               ||
4103                     !strcmp(sec->name, ".orc_unwind_ip")                ||
4104                     !strcmp(sec->name, ".parainstructions")             ||
4105                     !strcmp(sec->name, ".retpoline_sites")              ||
4106                     !strcmp(sec->name, ".smp_locks")                    ||
4107                     !strcmp(sec->name, ".static_call_sites")            ||
4108                     !strcmp(sec->name, "_error_injection_whitelist")    ||
4109                     !strcmp(sec->name, "_kprobe_blacklist")             ||
4110                     !strcmp(sec->name, "__bug_table")                   ||
4111                     !strcmp(sec->name, "__ex_table")                    ||
4112                     !strcmp(sec->name, "__jump_table")                  ||
4113                     !strcmp(sec->name, "__mcount_loc"))
4114                         continue;
4115
4116                 list_for_each_entry(reloc, &sec->reloc->reloc_list, list)
4117                         warnings += validate_ibt_data_reloc(file, reloc);
4118         }
4119
4120         return warnings;
4121 }
4122
4123 static int validate_sls(struct objtool_file *file)
4124 {
4125         struct instruction *insn, *next_insn;
4126         int warnings = 0;
4127
4128         for_each_insn(file, insn) {
4129                 next_insn = next_insn_same_sec(file, insn);
4130
4131                 if (insn->retpoline_safe)
4132                         continue;
4133
4134                 switch (insn->type) {
4135                 case INSN_RETURN:
4136                         if (!next_insn || next_insn->type != INSN_TRAP) {
4137                                 WARN_FUNC("missing int3 after ret",
4138                                           insn->sec, insn->offset);
4139                                 warnings++;
4140                         }
4141
4142                         break;
4143                 case INSN_JUMP_DYNAMIC:
4144                         if (!next_insn || next_insn->type != INSN_TRAP) {
4145                                 WARN_FUNC("missing int3 after indirect jump",
4146                                           insn->sec, insn->offset);
4147                                 warnings++;
4148                         }
4149                         break;
4150                 default:
4151                         break;
4152                 }
4153         }
4154
4155         return warnings;
4156 }
4157
4158 static int validate_reachable_instructions(struct objtool_file *file)
4159 {
4160         struct instruction *insn;
4161
4162         if (file->ignore_unreachables)
4163                 return 0;
4164
4165         for_each_insn(file, insn) {
4166                 if (insn->visited || ignore_unreachable_insn(file, insn))
4167                         continue;
4168
4169                 WARN_FUNC("unreachable instruction", insn->sec, insn->offset);
4170                 return 1;
4171         }
4172
4173         return 0;
4174 }
4175
4176 int check(struct objtool_file *file)
4177 {
4178         int ret, warnings = 0;
4179
4180         arch_initial_func_cfi_state(&initial_func_cfi);
4181         init_cfi_state(&init_cfi);
4182         init_cfi_state(&func_cfi);
4183         set_func_state(&func_cfi);
4184
4185         if (!cfi_hash_alloc(1UL << (file->elf->symbol_bits - 3)))
4186                 goto out;
4187
4188         cfi_hash_add(&init_cfi);
4189         cfi_hash_add(&func_cfi);
4190
4191         ret = decode_sections(file);
4192         if (ret < 0)
4193                 goto out;
4194
4195         warnings += ret;
4196
4197         if (list_empty(&file->insn_list))
4198                 goto out;
4199
4200         if (opts.retpoline) {
4201                 ret = validate_retpoline(file);
4202                 if (ret < 0)
4203                         return ret;
4204                 warnings += ret;
4205         }
4206
4207         if (opts.stackval || opts.orc || opts.uaccess) {
4208                 ret = validate_functions(file);
4209                 if (ret < 0)
4210                         goto out;
4211                 warnings += ret;
4212
4213                 ret = validate_unwind_hints(file, NULL);
4214                 if (ret < 0)
4215                         goto out;
4216                 warnings += ret;
4217
4218                 if (!warnings) {
4219                         ret = validate_reachable_instructions(file);
4220                         if (ret < 0)
4221                                 goto out;
4222                         warnings += ret;
4223                 }
4224
4225         } else if (opts.noinstr) {
4226                 ret = validate_noinstr_sections(file);
4227                 if (ret < 0)
4228                         goto out;
4229                 warnings += ret;
4230         }
4231
4232         if (opts.unret) {
4233                 /*
4234                  * Must be after validate_branch() and friends, it plays
4235                  * further games with insn->visited.
4236                  */
4237                 ret = validate_unret(file);
4238                 if (ret < 0)
4239                         return ret;
4240                 warnings += ret;
4241         }
4242
4243         if (opts.ibt) {
4244                 ret = validate_ibt(file);
4245                 if (ret < 0)
4246                         goto out;
4247                 warnings += ret;
4248         }
4249
4250         if (opts.sls) {
4251                 ret = validate_sls(file);
4252                 if (ret < 0)
4253                         goto out;
4254                 warnings += ret;
4255         }
4256
4257         if (opts.static_call) {
4258                 ret = create_static_call_sections(file);
4259                 if (ret < 0)
4260                         goto out;
4261                 warnings += ret;
4262         }
4263
4264         if (opts.retpoline) {
4265                 ret = create_retpoline_sites_sections(file);
4266                 if (ret < 0)
4267                         goto out;
4268                 warnings += ret;
4269         }
4270
4271         if (opts.rethunk) {
4272                 ret = create_return_sites_sections(file);
4273                 if (ret < 0)
4274                         goto out;
4275                 warnings += ret;
4276         }
4277
4278         if (opts.mcount) {
4279                 ret = create_mcount_loc_sections(file);
4280                 if (ret < 0)
4281                         goto out;
4282                 warnings += ret;
4283         }
4284
4285         if (opts.ibt) {
4286                 ret = create_ibt_endbr_seal_sections(file);
4287                 if (ret < 0)
4288                         goto out;
4289                 warnings += ret;
4290         }
4291
4292         if (opts.orc && !list_empty(&file->insn_list)) {
4293                 ret = orc_create(file);
4294                 if (ret < 0)
4295                         goto out;
4296                 warnings += ret;
4297         }
4298
4299
4300         if (opts.stats) {
4301                 printf("nr_insns_visited: %ld\n", nr_insns_visited);
4302                 printf("nr_cfi: %ld\n", nr_cfi);
4303                 printf("nr_cfi_reused: %ld\n", nr_cfi_reused);
4304                 printf("nr_cfi_cache: %ld\n", nr_cfi_cache);
4305         }
4306
4307 out:
4308         /*
4309          *  For now, don't fail the kernel build on fatal warnings.  These
4310          *  errors are still fairly common due to the growing matrix of
4311          *  supported toolchains and their recent pace of change.
4312          */
4313         return 0;
4314 }