]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-boot: allow setting the log level through SMBIOS 11
authorFelix Pehla <29adc1fd92@gmail.com>
Sun, 24 Aug 2025 20:22:59 +0000 (22:22 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 17 Sep 2025 23:54:52 +0000 (08:54 +0900)
Allow configuring the log level used by sd-boot by setting
`io.systemd.boot.loglevel=<level>` as SMBIOS type 11 string.
`info` is used if unset.

man/smbios-type-11.xml
man/systemd-boot.xml
src/boot/boot.c
src/boot/efi-log.c
src/boot/efi-log.h

index b576677d2766aed273e612622ec6c1068be464ca..70f66fe0f61eee9e07da44b47b50dcff41718443 100644 (file)
 
         <listitem><para>This allows inserting additional entries into the <command>systemd-boot</command>
         menu. For details see
-        <citerefentry><refentrytitle>systemd-boot</refentrytitle><manvolnum>7</manvolnum></citerefentry></para>
+        <citerefentry><refentrytitle>systemd-boot</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
 
         <xi:include href="version-info.xml" xpointer="v258"/></listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>io.systemd.boot.loglevel=</varname><replaceable>LEVEL</replaceable></term>
+
+        <listitem><para>This allows configuration of the log level, and is read by <command>systemd-boot</command>.
+        For details see
+        <citerefentry><refentrytitle>systemd-boot</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
+
+        <xi:include href="version-info.xml" xpointer="v259"/></listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
index b01299143c587f7d3b76ee94c81f006bcb53b751..94eaae2d6bb151ecd400f0e19d31833897677420 100644 (file)
@@ -640,6 +640,16 @@ uki-url http://example.com/somedir/fooos.efi</programlisting>
 
         <xi:include href="version-info.xml" xpointer="v258"/></listitem>
       </varlistentry>
+
+      <varlistentry>
+        <term><varname>io.systemd.boot.loglevel</varname></term>
+        <listitem><para>If set, the value of this string is used as log level. Valid values (from most to
+        least critical) are <literal>emerg</literal>, <literal>alert</literal>, <literal>crit</literal>,
+        <literal>err</literal>, <literal>warning</literal>, <literal>notice</literal>, <literal>info</literal>,
+        and <literal>debug</literal>.</para>
+
+        <xi:include href="version-info.xml" xpointer="v259"/></listitem>
+      </varlistentry>
     </variablelist>
   </refsect1>
 
index 3dd91f4396c9b15f7afc7d9bbe74707a381d41e3..3ac59866aa1cd7ade4e4e7e0d9de2091ced0441d 100644 (file)
@@ -2991,6 +2991,9 @@ static EFI_STATUS run(EFI_HANDLE image) {
         uint64_t init_usec;
         bool menu = false;
 
+        /* set loglevel early to simplify debugging before loader.conf is loaded */
+        log_set_max_level_from_smbios();
+
         init_usec = time_usec();
 
         err = BS->HandleProtocol(image, MAKE_GUID_PTR(EFI_LOADED_IMAGE_PROTOCOL), (void **) &loaded_image);
index 5bb2c0e4901d9dbc7b62075d31f85d074133d7dd..3cecc7be06ae675eced74f6c06adc8f0722e9a5e 100644 (file)
@@ -3,7 +3,9 @@
 #include "efi-log.h"
 #include "efi-string-table.h"
 #include "proto/rng.h"
+#include "smbios.h"
 #include "util.h"
+#include "vmm.h"
 
 static unsigned log_count = 0;
 static LogLevel log_max_level = LOG_INFO;
@@ -57,6 +59,21 @@ int log_set_max_level_from_string(const char *e) {
         return 0;
 }
 
+void log_set_max_level_from_smbios(void) {
+        int r;
+
+        if (is_confidential_vm())
+                return; /* Don't consume SMBIOS in Confidential Computing contexts */
+
+        const char *level_str = smbios_find_oem_string("io.systemd.boot.loglevel=", /* after= */ NULL);
+        if (!level_str)
+                return;
+
+        r = log_set_max_level_from_string(level_str);
+        if (r < 0)
+                log_warning("Failed to parse log level '%s', ignoring.", level_str);
+}
+
 void freeze(void) {
         for (;;)
                 BS->Stall(60 * 1000 * 1000);
index 418b9f90be57b4208f1d3481659aba4804029811..459838782b6414e5ec49ae3e29326de5d1ae6376 100644 (file)
@@ -40,6 +40,7 @@ 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);
+void log_set_max_level_from_smbios(void);
 
 _noreturn_ void freeze(void);
 void log_wait(void);