On Tue, 2025-02-11 at 10:33 +0800, Yafang Shao wrote: [...] > diff --git a/tools/include/linux/noreturns.h b/tools/include/linux/noreturns.h > new file mode 100644 > index 000000000000..b2174894f9f7 > --- /dev/null > +++ b/tools/include/linux/noreturns.h > @@ -0,0 +1,52 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > + > +/* > + * This is a (sorted!) list of all known __noreturn functions in the kernel. > + * It's needed for objtool to properly reverse-engineer the control flow graph. > + * > + * Yes, this is unfortunate. A better solution is in the works. > + */ I'm probably out of context for this discussion, sorry if I'm raising points already discussed. The DW_AT_noreturn attribute is defined for DWARF. A simple script like [1] could be used to find all functions with this attribute known to DWARF. Using this script I see several functions present in my kernel but not present in the NORETURN list from this patch: - abort - devtmpfs_work_loop - play_dead - rcu_gp_kthread - rcu_tasks_kthread All these are marked as FUNC symbols when doing 'readelf --symbols vmlinux'. 'pahole' could be modified to look for DW_AT_noreturn attributes and add this information in BTF. E.g. by adding special btf_decl_tag to corresponding FUNC definitions. This won't work if kernel is compiled w/o BTF, of-course. [1] https://gist.github.com/eddyz87/d8513a731dfe7e2be52b346aef1de353 > +NORETURN(__fortify_panic) > +NORETURN(__ia32_sys_exit) > +NORETURN(__ia32_sys_exit_group) > +NORETURN(__kunit_abort) > +NORETURN(__module_put_and_kthread_exit) > +NORETURN(__stack_chk_fail) > +NORETURN(__tdx_hypercall_failed) > +NORETURN(__ubsan_handle_builtin_unreachable) > +NORETURN(__x64_sys_exit) > +NORETURN(__x64_sys_exit_group) > +NORETURN(arch_cpu_idle_dead) > +NORETURN(bch2_trans_in_restart_error) > +NORETURN(bch2_trans_restart_error) > +NORETURN(bch2_trans_unlocked_error) > +NORETURN(cpu_bringup_and_idle) > +NORETURN(cpu_startup_entry) > +NORETURN(do_exit) > +NORETURN(do_group_exit) > +NORETURN(do_task_dead) > +NORETURN(ex_handler_msr_mce) > +NORETURN(hlt_play_dead) > +NORETURN(hv_ghcb_terminate) > +NORETURN(kthread_complete_and_exit) > +NORETURN(kthread_exit) > +NORETURN(kunit_try_catch_throw) > +NORETURN(machine_real_restart) > +NORETURN(make_task_dead) > +NORETURN(mpt_halt_firmware) > +NORETURN(nmi_panic_self_stop) > +NORETURN(panic) > +NORETURN(panic_smp_self_stop) > +NORETURN(rest_init) > +NORETURN(rewind_stack_and_make_dead) > +NORETURN(rust_begin_unwind) > +NORETURN(rust_helper_BUG) > +NORETURN(sev_es_terminate) > +NORETURN(snp_abort) > +NORETURN(start_kernel) > +NORETURN(stop_this_cpu) > +NORETURN(usercopy_abort) > +NORETURN(x86_64_start_kernel) > +NORETURN(x86_64_start_reservations) > +NORETURN(xen_cpu_bringup_again) > +NORETURN(xen_start_kernel) [...]