diff options
Diffstat (limited to 'common/misc.c')
-rw-r--r-- | common/misc.c | 113 |
1 files changed, 80 insertions, 33 deletions
diff --git a/common/misc.c b/common/misc.c index 9b390dc7ba..04ff4e6eb5 100644 --- a/common/misc.c +++ b/common/misc.c @@ -1,19 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0-only /* * (C) Copyright 2000-2003 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * */ #include <common.h> @@ -25,6 +13,8 @@ #include <led.h> #include <of.h> #include <restart.h> +#include <poweroff.h> +#include <linux/stringify.h> int errno; EXPORT_SYMBOL(errno); @@ -32,7 +22,7 @@ EXPORT_SYMBOL(errno); const char *strerror(int errnum) { - static char errno_string[10]; + static char errno_string[sizeof("error -2147483648")]; #ifdef CONFIG_ERRNO_MESSAGES char *str; @@ -116,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 @@ -157,9 +141,11 @@ const char *barebox_get_model(void) } EXPORT_SYMBOL(barebox_get_model); -BAREBOX_MAGICVAR_NAMED(global_model, global.model, "Product name of this hardware"); +BAREBOX_MAGICVAR(global.model, "Product name of this hardware"); static char *hostname; +static char *serial_number; +static char *of_machine_compatible; /* * The hostname is supposed to be the shortname of a board. It should @@ -187,26 +173,87 @@ void barebox_set_hostname_no_overwrite(const char *__hostname) } EXPORT_SYMBOL(barebox_set_hostname_no_overwrite); -BAREBOX_MAGICVAR_NAMED(global_hostname, global.hostname, +BAREBOX_MAGICVAR(global.hostname, "shortname of the board. Also used as hostname for DHCP requests"); -void __noreturn panic(const char *fmt, ...) +void barebox_set_serial_number(const char *__serial_number) { - va_list args; - va_start(args, fmt); - vprintf(fmt, args); + globalvar_add_simple_string("serial_number", &serial_number); + + free(serial_number); + serial_number = xstrdup(__serial_number); +} + +const char *barebox_get_serial_number(void) +{ + if (!serial_number || *serial_number == '\0') + return NULL; + return serial_number; +} + +BAREBOX_MAGICVAR(global.serial_number, "Board serial number"); + +void barebox_set_of_machine_compatible(const char *__compatible) +{ + free(of_machine_compatible); + of_machine_compatible = xstrdup(__compatible); +} + +const char *barebox_get_of_machine_compatible(void) +{ + if (!of_machine_compatible || *of_machine_compatible == '\0') + return NULL; + return of_machine_compatible; +} + +static int of_kernel_init(void) +{ + globalvar_add_simple_string("of.kernel.add_machine_compatible", + &of_machine_compatible); + + return 0; +} +device_initcall(of_kernel_init); + +BAREBOX_MAGICVAR(global.of.kernel.add_machine_compatible, "Additional machine/board compatible"); + +static void __noreturn do_panic(bool stacktrace, const char *fmt, va_list ap) +{ + 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); |