]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-boot: efi-log: use log levels internally
authorFelix Pehla <29adc1fd92@gmail.com>
Sat, 23 Aug 2025 15:27:20 +0000 (17:27 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 17 Sep 2025 23:54:52 +0000 (08:54 +0900)
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.

src/boot/drivers.c
src/boot/efi-log.c
src/boot/efi-log.h
src/boot/random-seed.c

index a44957b4e44d2c8954fb4875d130e7d47f78e718..d58b1e39da74c2e41b4d02c8dd11b30acc38b705 100644 (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) {
index 1810375c6aa35d05b3842e8bd4095caad56f68e5..5b831608f4ba9de8815f2065fc67bff23c33f6b9 100644 (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);
index 06954b06f0a61a1b54233552c7ca7658a362ef2c..9a3c784d6fbf3fd4ea5f4afacab44b5e42ccbd8e 100644 (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)                                 \
index 59ed782060a30b05d5512b3ddedae88a367024a7..30e74af214f490883c4db275e02d8edd91630d4e 100644 (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;