]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-boot: allow setting the maximum log level
authorFelix Pehla <29adc1fd92@gmail.com>
Sun, 24 Aug 2025 20:21:36 +0000 (22:21 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 17 Sep 2025 23:54:52 +0000 (08:54 +0900)
src/boot/boot.c
src/boot/efi-log.c
src/boot/efi-log.h
src/boot/efi-string-table.h

index eabfd6b6b2ebb1085c7d5bc8cdc2ecb5bc6ce2c9..3dd91f4396c9b15f7afc7d9bbe74707a381d41e3 100644 (file)
@@ -361,6 +361,8 @@ static void print_status(Config *config, char16_t *loaded_image_path) {
         if (config->console_mode_efivar != CONSOLE_MODE_KEEP)
                 printf("   console-mode (EFI var): %" PRIi64 "\n", config->console_mode_efivar);
 
+        printf("                log-level: %s\n", log_level_to_string(log_get_max_level()));
+
         if (!ps_continue())
                 return;
 
index 5b831608f4ba9de8815f2065fc67bff23c33f6b9..5bb2c0e4901d9dbc7b62075d31f85d074133d7dd 100644 (file)
@@ -1,10 +1,12 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
 #include "efi-log.h"
+#include "efi-string-table.h"
 #include "proto/rng.h"
 #include "util.h"
 
 static unsigned log_count = 0;
+static LogLevel log_max_level = LOG_INFO;
 
 static const uint8_t log_level_color[_LOG_MAX] = {
         [LOG_EMERG]   = EFI_LIGHTRED,
@@ -17,6 +19,44 @@ static const uint8_t log_level_color[_LOG_MAX] = {
         [LOG_DEBUG]   = EFI_LIGHTGRAY,
 };
 
+static const char *const log_level_table[_LOG_MAX] = {
+        [LOG_EMERG]   = "emerg",
+        [LOG_ALERT]   = "alert",
+        [LOG_CRIT]    = "crit",
+        [LOG_ERR]     = "err",
+        [LOG_WARNING] = "warning",
+        [LOG_NOTICE]  = "notice",
+        [LOG_INFO]    = "info",
+        [LOG_DEBUG]   = "debug",
+};
+
+DEFINE_STRING_TABLE_LOOKUP(log_level, LogLevel);
+
+LogLevel log_get_max_level(void) {
+        return log_max_level;
+}
+
+int log_set_max_level(LogLevel level) {
+        assert(level >= 0 && level < _LOG_MAX);
+
+        int old = log_max_level;
+        log_max_level = level;
+        return old;
+}
+
+int log_set_max_level_from_string(const char *e) {
+        int r;
+
+        assert(e);
+
+        r = log_level_from_string(e);
+        if (r < 0)
+                return r;
+
+        log_set_max_level(r);
+        return 0;
+}
+
 void freeze(void) {
         for (;;)
                 BS->Stall(60 * 1000 * 1000);
@@ -46,6 +86,9 @@ EFI_STATUS log_internal(EFI_STATUS status, LogLevel log_level, const char *forma
         assert(format);
         assert(log_level >= 0 && log_level < _LOG_MAX);
 
+        if (log_level > log_max_level)
+                return status;
+
         int32_t attr = ST->ConOut->Mode->Attribute;
 
         if (ST->ConOut->Mode->CursorColumn > 0)
index 9a3c784d6fbf3fd4ea5f4afacab44b5e42ccbd8e..418b9f90be57b4208f1d3481659aba4804029811 100644 (file)
@@ -34,6 +34,13 @@ typedef enum LogLevel {
         _LOG_INVALID = -1,
 } LogLevel;
 
+LogLevel log_level_from_string(const char *s) _pure_;
+const char* log_level_to_string(LogLevel l) _const_;
+
+LogLevel log_get_max_level(void) _pure_;
+int log_set_max_level(LogLevel level);
+int log_set_max_level_from_string(const char *e);
+
 _noreturn_ void freeze(void);
 void log_wait(void);
 _gnu_printf_(3, 4) EFI_STATUS log_internal(EFI_STATUS status, LogLevel log_level, const char *format, ...);
index 1053e7526939f6ebf36ba2392e6fd04beaaa09cd..666d849e0a49149a5f9c1fcdc0f6d702839844e5 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 #pragma once
 
+#include "efi-string.h"
 #include "macro-fundamental.h"
 
 #define _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,scope)          \
@@ -9,5 +10,23 @@
                 return name##_table[i];                                 \
         }
 
+#define _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name, type, scope)    \
+        scope type name##_from_string(const char *s) {                \
+                if (!s)                                               \
+                        return (type) -1;                             \
+                for (size_t i = 0; i < ELEMENTSOF(name##_table); ++i) \
+                        if (streq8(name##_table[i], s))               \
+                                return (type) i;                      \
+                return (type) -1;                                     \
+        }
+
+#define _DEFINE_STRING_TABLE_LOOKUP(name, type, scope)             \
+        _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name, type, scope)   \
+        _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name, type, scope)
+
+#define DEFINE_STRING_TABLE_LOOKUP(name, type) _DEFINE_STRING_TABLE_LOOKUP(name, type,)
 #define DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,)
+#define DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name, type) _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name, type,)
+#define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name, type) _DEFINE_STRING_TABLE_LOOKUP(name, type, static)
 #define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(name,type) _DEFINE_STRING_TABLE_LOOKUP_TO_STRING(name,type,static)
+#define DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(name, type) _DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(name, type, static)