diff options
Diffstat (limited to 'common/misc.c')
-rw-r--r-- | common/misc.c | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/common/misc.c b/common/misc.c index e0e32f47c5..04ff4e6eb5 100644 --- a/common/misc.c +++ b/common/misc.c @@ -13,6 +13,7 @@ #include <led.h> #include <of.h> #include <restart.h> +#include <poweroff.h> #include <linux/stringify.h> int errno; @@ -105,16 +106,10 @@ const char *strerror(int errnum) } EXPORT_SYMBOL(strerror); -const char *errno_str(void) -{ - return strerror(errno); -} -EXPORT_SYMBOL(errno_str); - void perror(const char *s) { #ifdef CONFIG_ERRNO_MESSAGES - printf("%s: %s\n", s, errno_str()); + printf("%s: %m\n", s); #else printf("%s returned with %d\n", s, errno); #endif @@ -222,23 +217,43 @@ 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); - if (IS_ENABLED(CONFIG_PANIC_HANG)) { + if (IS_ENABLED(CONFIG_PANIC_HANG)) hang(); - } else { - udelay(100000); /* allow messages to go out */ + + udelay(100000); /* allow messages to go out */ + + if (IS_ENABLED(CONFIG_PANIC_POWEROFF)) + poweroff_machine(); + else 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); |