[PATCH 11/27] LoongArch: Annotate reboot and kexec paths as returnable
From: Josh Poimboeuf
Date: Fri Aug 28 2026 - 00:55:49 EST
Running objtool on LoongArch vmlinux.o shows the following warnings:
vmlinux.o: warning: objtool: __do_sys_reboot+0x188: kernel_restart() is missing __noreturn in .c/.h
vmlinux.o: warning: objtool: hw_failure_emergency_action_func+0x74: kernel_restart() is missing __noreturn in .c/.h
vmlinux.o: warning: objtool: hibernate+0x3cc: kernel_halt() is missing __noreturn in .c/.h
vmlinux.o: warning: objtool: kernel_kexec+0xbc: machine_kexec() is missing __noreturn in .c/.h
vmlinux.o: warning: objtool: restart_poweroff_do_poweroff+0x1c: machine_restart() is missing __noreturn in .c/.h
The problem is that the generic declarations of the above functions are
not declared noreturn.
But marking them __noreturn wouldn't be straightforward given the
inconsistent behaviors they have across the arches:
- In many cases they don't return, but the compiler doesn't have
visibility to that for various reasons including inline asm and
indirect calls to noreturn functions (which objtool is currently not
equipped to deal with).
- In some cases they even *do* return, e.g. x86 machine_exec(), arm64
machine_power_off(), and hexagon machine_restart().
In lieu of undertaking such a large cleanup, fix the above warnings with
a few annotations so objtool doesn't consider them noreturn, consistent
with their call sites.
Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
---
arch/loongarch/kernel/machine_kexec.c | 2 ++
arch/loongarch/kernel/reset.c | 4 ++++
2 files changed, 6 insertions(+)
diff --git a/arch/loongarch/kernel/machine_kexec.c b/arch/loongarch/kernel/machine_kexec.c
index 1883cae93bc31..e40b6767df24e 100644
--- a/arch/loongarch/kernel/machine_kexec.c
+++ b/arch/loongarch/kernel/machine_kexec.c
@@ -16,6 +16,7 @@
#include <linux/reboot.h>
#include <linux/sched.h>
#include <linux/sched/task_stack.h>
+#include <linux/annotate.h>
#include <asm/bootinfo.h>
#include <asm/cacheflush.h>
@@ -296,3 +297,4 @@ void machine_kexec(struct kimage *image)
kexec_reboot();
}
+ANNOTATE_IGNORE_NORETURN(machine_kexec);
diff --git a/arch/loongarch/kernel/reset.c b/arch/loongarch/kernel/reset.c
index de8fa5a8a825c..89ee0edcf58d2 100644
--- a/arch/loongarch/kernel/reset.c
+++ b/arch/loongarch/kernel/reset.c
@@ -11,6 +11,7 @@
#include <linux/reboot.h>
#include <linux/delay.h>
#include <linux/console.h>
+#include <linux/annotate.h>
#include <acpi/reboot.h>
#include <asm/idle.h>
@@ -36,6 +37,7 @@ void machine_halt(void)
__asm__ __volatile__("idle 0" : : : "memory");
}
}
+ANNOTATE_IGNORE_NORETURN(machine_halt);
void machine_power_off(void)
{
@@ -56,6 +58,7 @@ void machine_power_off(void)
__asm__ __volatile__("idle 0" : : : "memory");
}
}
+ANNOTATE_IGNORE_NORETURN(machine_power_off);
void machine_restart(char *command)
{
@@ -77,3 +80,4 @@ void machine_restart(char *command)
__asm__ __volatile__("idle 0" : : : "memory");
}
}
+ANNOTATE_IGNORE_NORETURN(machine_restart);
--
2.55.0