[PATCH] ARM: Do not print exception stacktrace in panic
Sascha Hauer
s.hauer at pengutronix.de
Thu Mar 9 06:26:31 PST 2023
panic() prints a stacktrace by default. When being called in a an
exception this will print the stacktrace of the exception stack
which is not useful, so drop it. We are printing the desired
stacktrace anyway before calling panic().
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
arch/arm/cpu/interrupts.c | 2 +-
arch/arm/cpu/interrupts_64.c | 2 +-
common/misc.c | 29 +++++++++++++++++++++++------
include/printk.h | 1 +
4 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/arch/arm/cpu/interrupts.c b/arch/arm/cpu/interrupts.c
index a1728eb353..5bc790a796 100644
--- a/arch/arm/cpu/interrupts.c
+++ b/arch/arm/cpu/interrupts.c
@@ -68,7 +68,7 @@ static void __noreturn do_exception(struct pt_regs *pt_regs)
{
show_regs(pt_regs);
- panic("");
+ panic_no_stacktrace("");
}
/**
diff --git a/arch/arm/cpu/interrupts_64.c b/arch/arm/cpu/interrupts_64.c
index f54fdcd3dd..d844915fee 100644
--- a/arch/arm/cpu/interrupts_64.c
+++ b/arch/arm/cpu/interrupts_64.c
@@ -88,7 +88,7 @@ static void __noreturn do_exception(struct pt_regs *pt_regs)
unwind_backtrace(pt_regs);
- panic("panic: unhandled exception");
+ panic_no_stacktrace("panic: unhandled exception");
}
/**
diff --git a/common/misc.c b/common/misc.c
index 400c1fb48f..e266f0951e 100644
--- a/common/misc.c
+++ b/common/misc.c
@@ -216,15 +216,13 @@ device_initcall(of_kernel_init);
BAREBOX_MAGICVAR(global.of.kernel.add_machine_compatible, "Additional machine/board compatible");
-void __noreturn panic(const char *fmt, ...)
+static void __noreturn do_panic(bool stacktrace, const char *fmt, va_list ap)
{
- va_list args;
- va_start(args, fmt);
- vprintf(fmt, args);
+ vprintf(fmt, ap);
putchar('\n');
- va_end(args);
- dump_stack();
+ if (stacktrace)
+ dump_stack();
led_trigger(LED_TRIGGER_PANIC, TRIGGER_ENABLE);
@@ -235,4 +233,23 @@ void __noreturn panic(const char *fmt, ...)
restart_machine();
}
}
+
+void __noreturn panic(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ do_panic(true, fmt, args);
+ va_end(args);
+}
EXPORT_SYMBOL(panic);
+
+void __noreturn panic_no_stacktrace(const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ do_panic(false, fmt, args);
+ va_end(args);
+}
+EXPORT_SYMBOL(panic_no_stacktrace);
diff --git a/include/printk.h b/include/printk.h
index 6f8635fae2..bf9645249d 100644
--- a/include/printk.h
+++ b/include/printk.h
@@ -28,6 +28,7 @@ static inline int printf(const char *fmt, ...)
#endif
void __attribute__((noreturn)) panic(const char *fmt, ...);
+void __attribute__((noreturn)) panic_no_stacktrace(const char *fmt, ...);
#define printk printf
--
2.30.2
More information about the barebox
mailing list