From: Felix Pehla <29adc1fd92@gmail.com> Date: Sat, 23 Aug 2025 15:27:20 +0000 (+0200) Subject: sd-boot: efi-log: use log levels internally X-Git-Tag: v259-rc1~528^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=419e4dc450055a27b8ab267c57fe0b6877afe4c8;p=thirdparty%2Fsystemd.git sd-boot: efi-log: use log levels internally Change log_internal() to receive a log level from which a text color is derived, rather than the text color directly, and adjust various log_* macros to use them internally. --- diff --git a/src/boot/drivers.c b/src/boot/drivers.c index a44957b4e44..d58b1e39da7 100644 --- a/src/boot/drivers.c +++ b/src/boot/drivers.c @@ -35,7 +35,7 @@ static EFI_STATUS load_one_driver( if (loaded_image->ImageCodeType != EfiBootServicesCode && loaded_image->ImageCodeType != EfiRuntimeServicesCode) - return log_error("Image %ls is not a driver, refusing.", fname); + return log_error_status(EFI_INVALID_PARAMETER, "Image %ls is not a driver, refusing.", fname); err = BS->StartImage(image, NULL, NULL); if (err != EFI_SUCCESS) { diff --git a/src/boot/efi-log.c b/src/boot/efi-log.c index 1810375c6aa..5b831608f4b 100644 --- a/src/boot/efi-log.c +++ b/src/boot/efi-log.c @@ -6,6 +6,17 @@ static unsigned log_count = 0; +static const uint8_t log_level_color[_LOG_MAX] = { + [LOG_EMERG] = EFI_LIGHTRED, + [LOG_ALERT] = EFI_LIGHTRED, + [LOG_CRIT] = EFI_LIGHTRED, + [LOG_ERR] = EFI_LIGHTRED, + [LOG_WARNING] = EFI_YELLOW, + [LOG_NOTICE] = EFI_WHITE, + [LOG_INFO] = EFI_WHITE, + [LOG_DEBUG] = EFI_LIGHTGRAY, +}; + void freeze(void) { for (;;) BS->Stall(60 * 1000 * 1000); @@ -31,14 +42,15 @@ void efi_assert(const char *expr, const char *file, unsigned line, const char *f freeze(); } -EFI_STATUS log_internal(EFI_STATUS status, uint8_t text_color, const char *format, ...) { +EFI_STATUS log_internal(EFI_STATUS status, LogLevel log_level, const char *format, ...) { assert(format); + assert(log_level >= 0 && log_level < _LOG_MAX); int32_t attr = ST->ConOut->Mode->Attribute; if (ST->ConOut->Mode->CursorColumn > 0) ST->ConOut->OutputString(ST->ConOut, (char16_t *) u"\r\n"); - ST->ConOut->SetAttribute(ST->ConOut, EFI_TEXT_ATTR(text_color, EFI_BLACK)); + ST->ConOut->SetAttribute(ST->ConOut, EFI_TEXT_ATTR(log_level_color[log_level], EFI_BLACK)); va_list ap; va_start(ap, format); diff --git a/src/boot/efi-log.h b/src/boot/efi-log.h index 06954b06f0a..9a3c784d6fb 100644 --- a/src/boot/efi-log.h +++ b/src/boot/efi-log.h @@ -21,17 +21,41 @@ __attribute__((no_stack_protector, noinline)) void __stack_chk_guard_init(void); # define __stack_chk_guard_init() #endif +typedef enum LogLevel { + LOG_EMERG, + LOG_ALERT, + LOG_CRIT, + LOG_ERR, + LOG_WARNING, + LOG_NOTICE, + LOG_INFO, + LOG_DEBUG, + _LOG_MAX, + _LOG_INVALID = -1, +} LogLevel; + _noreturn_ void freeze(void); void log_wait(void); -_gnu_printf_(3, 4) EFI_STATUS log_internal(EFI_STATUS status, uint8_t text_color, const char *format, ...); -#define log_full(status, text_color, format, ...) \ - log_internal(status, text_color, "%s:%i@%s: " format, __FILE__, __LINE__, __func__, ##__VA_ARGS__) -#define log_debug(...) log_full(EFI_SUCCESS, EFI_LIGHTGRAY, __VA_ARGS__) -#define log_info(...) log_full(EFI_SUCCESS, EFI_WHITE, __VA_ARGS__) -#define log_warning_status(status, ...) log_full(status, EFI_YELLOW, __VA_ARGS__) -#define log_error_status(status, ...) log_full(status, EFI_LIGHTRED, __VA_ARGS__) -#define log_error(...) log_full(EFI_INVALID_PARAMETER, EFI_LIGHTRED, __VA_ARGS__) -#define log_oom() log_full(EFI_OUT_OF_RESOURCES, EFI_LIGHTRED, "Out of memory.") +_gnu_printf_(3, 4) EFI_STATUS log_internal(EFI_STATUS status, LogLevel log_level, const char *format, ...); + +#define log_full(status, log_level, format, ...) \ + log_internal(status, log_level, "%s:%i@%s: " format, __FILE__, __LINE__, __func__, ##__VA_ARGS__) + +#define log_debug(...) log_full(EFI_SUCCESS, LOG_DEBUG, __VA_ARGS__) +#define log_info(...) log_full(EFI_SUCCESS, LOG_INFO, __VA_ARGS__) +#define log_notice(...) log_full(EFI_SUCCESS, LOG_NOTICE, __VA_ARGS__) +#define log_warning(...) log_full(EFI_SUCCESS, LOG_WARNING, __VA_ARGS__) +#define log_error(...) log_full(EFI_SUCCESS, LOG_ERR, __VA_ARGS__) +#define log_emergency(...) log_full(EFI_SUCCESS, LOG_EMERG, __VA_ARGS__) + +#define log_debug_status(status, ...) log_full(status, LOG_DEBUG, __VA_ARGS__) +#define log_info_status(status, ...) log_full(status, LOG_INFO, __VA_ARGS__) +#define log_notice_status(status, ...) log_full(status, LOG_NOTICE, __VA_ARGS__) +#define log_warning_status(status, ...) log_full(status, LOG_WARNING, __VA_ARGS__) +#define log_error_status(status, ...) log_full(status, LOG_ERR, __VA_ARGS__) +#define log_emergency_status(status, ...) log_full(status, LOG_EMERG, __VA_ARGS__) + +#define log_oom() log_full(EFI_OUT_OF_RESOURCES, LOG_ERR, "Out of memory.") /* Debugging helper — please keep this around, even if not used */ #define log_hexdump(prefix, data, size) \ diff --git a/src/boot/random-seed.c b/src/boot/random-seed.c index 59ed782060a..30e74af214f 100644 --- a/src/boot/random-seed.c +++ b/src/boot/random-seed.c @@ -211,10 +211,10 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) { size = info->FileSize; if (size < RANDOM_MAX_SIZE_MIN) - return log_error("Random seed file is too short."); + return log_error_status(EFI_INVALID_PARAMETER, "Random seed file is too short."); if (size > RANDOM_MAX_SIZE_MAX) - return log_error("Random seed file is too large."); + return log_error_status(EFI_INVALID_PARAMETER, "Random seed file is too large."); seed = xmalloc(size); rsize = size;