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.
This commit is contained in:
Felix Pehla
2025-08-23 17:27:20 +02:00
committed by Yu Watanabe
parent 9bec72c94f
commit 419e4dc450
4 changed files with 50 additions and 14 deletions

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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) \

View File

@@ -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;