objtool-args-$(CONFIG_HAVE_JUMP_LABEL_HACK)           += --hacks=jump_label
  objtool-args-$(CONFIG_HAVE_NOINSTR_HACK)              += --hacks=noinstr
 +objtool-args-$(CONFIG_CALL_DEPTH_TRACKING)            += --hacks=skylake
  objtool-args-$(CONFIG_X86_KERNEL_IBT)                 += --ibt
 +objtool-args-$(CONFIG_FINEIBT)                                += --cfi
  objtool-args-$(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL)      += --mcount
+ ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL
+ objtool-args-$(CONFIG_HAVE_OBJTOOL_NOP_MCOUNT)                += --mnop
+ endif
  objtool-args-$(CONFIG_UNWINDER_ORC)                   += --orc
  objtool-args-$(CONFIG_RETPOLINE)                      += --retpoline
  objtool-args-$(CONFIG_RETHUNK)                                += --rethunk
 
                return false;
  
        insn = find_insn(file, func->sec, func->offset);
-       if (!insn_func(insn))
 -      if (!insn || !insn->func)
++      if (!insn || !insn_func(insn))
                return false;
  
        func_for_each_insn(file, func, insn) {
        return 0;
  }
  
 +static int create_cfi_sections(struct objtool_file *file)
 +{
 +      struct section *sec, *s;
 +      struct symbol *sym;
 +      unsigned int *loc;
 +      int idx;
 +
 +      sec = find_section_by_name(file->elf, ".cfi_sites");
 +      if (sec) {
 +              INIT_LIST_HEAD(&file->call_list);
 +              WARN("file already has .cfi_sites section, skipping");
 +              return 0;
 +      }
 +
 +      idx = 0;
 +      for_each_sec(file, s) {
 +              if (!s->text)
 +                      continue;
 +
 +              list_for_each_entry(sym, &s->symbol_list, list) {
 +                      if (sym->type != STT_FUNC)
 +                              continue;
 +
 +                      if (strncmp(sym->name, "__cfi_", 6))
 +                              continue;
 +
 +                      idx++;
 +              }
 +      }
 +
 +      sec = elf_create_section(file->elf, ".cfi_sites", 0, sizeof(unsigned int), idx);
 +      if (!sec)
 +              return -1;
 +
 +      idx = 0;
 +      for_each_sec(file, s) {
 +              if (!s->text)
 +                      continue;
 +
 +              list_for_each_entry(sym, &s->symbol_list, list) {
 +                      if (sym->type != STT_FUNC)
 +                              continue;
 +
 +                      if (strncmp(sym->name, "__cfi_", 6))
 +                              continue;
 +
 +                      loc = (unsigned int *)sec->data->d_buf + idx;
 +                      memset(loc, 0, sizeof(unsigned int));
 +
 +                      if (elf_add_reloc_to_insn(file->elf, sec,
 +                                                idx * sizeof(unsigned int),
 +                                                R_X86_64_PC32,
 +                                                s, sym->offset))
 +                              return -1;
 +
 +                      idx++;
 +              }
 +      }
 +
 +      return 0;
 +}
 +
  static int create_mcount_loc_sections(struct objtool_file *file)
  {
-       struct section *sec;
-       unsigned long *loc;
+       int addrsize = elf_class_addrsize(file->elf);
        struct instruction *insn;
+       struct section *sec;
        int idx;
  
        sec = find_section_by_name(file->elf, "__mcount_loc");