From: "Alexander Graf" <graf@amazon.com>
To: <devel@edk2.groups.io>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
Leif Lindholm <quic_llindhol@quicinc.com>,
Dandan Bi <dandan.bi@intel.com>,
Zhichao Gao <zhichao.gao@intel.com>,
Liming Gao <gaoliming@byosoft.com.cn>
Subject: [PATCH 01/12] MdePkg: Add DebugBootlog header
Date: Fri, 27 May 2022 04:43:06 +0200 [thread overview]
Message-ID: <20220527024317.13476-2-graf@amazon.com> (raw)
In-Reply-To: <20220527024317.13476-1-graf@amazon.com>
We will shortly introduce a new bootlog framework. This commit contains the
main library header that defines its data structure and public APIs.
Signed-off-by: Alexander Graf <graf@amazon.com>
---
MdePkg/Include/Library/DebugBootlog.h | 141 ++++++++++++++++++++++++++
1 file changed, 141 insertions(+)
create mode 100644 MdePkg/Include/Library/DebugBootlog.h
diff --git a/MdePkg/Include/Library/DebugBootlog.h b/MdePkg/Include/Library/DebugBootlog.h
new file mode 100644
index 0000000000..5e6b05411c
--- /dev/null
+++ b/MdePkg/Include/Library/DebugBootlog.h
@@ -0,0 +1,141 @@
+/** @file
+ Base Debug library for a RAM based boot log
+ It provides functions to store debug messages in RAM and make them available as
+ Bootlog Configuration Table.
+
+ Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2012, Red Hat, Inc.<BR>
+ Copyright (c) 2022, Amazon Development Center Germany GmbH.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+
+/*
+ * The bootlog framework is a way to collect all boot logging streams from the
+ * system into a single, condensed and time correlated data format. Its purpose
+ * is to allow extraction and correlation of boot logs from within the Operating
+ * System. Unlike I/O based logging, it's very cheap to use and can be used to
+ * easily identify duration of boot time code paths.
+ *
+ * Its intended use in edk2 is as a print backend for DebugLib, however you can
+ * use it stand alone as well. To append an edk2 log line, call
+ * DebugBootlogAppend() with the UTF-8 encoded string to append. The framework
+ * will initialize the boot log and add a configuration table if not existent
+ * automatically.
+ *
+ * The bootlog entry point is the bootlog configuration table. That table
+ * contains a dynamic number of pointers to bootlog logs. Each of these logs
+ * belong to one component of the boot flow, such as edk2 or grub and contain a
+ * dynamic number of log entries, each with a time stamp and optional additional
+ * data.
+ *
+ * All fields are Little Endian.
+ *
+ * ___________________________________________________
+ * | Bootlog Configuration Table |
+ * |---------------------------------------------------|
+ * | UINT32 Signature | "BTLG" |
+ * | UINT16 MaxLogs | Maximum number of logs this |
+ * | | configuration table can hold. |
+ * | | If you need more, create a |
+ * | | clone and reregister it. |
+ * | UINT16 NrLogs | Number of occupied Log slots |
+ * | BOOTLOG *Log[0] | ---+------------,
+ * | BOOTLOG *Log[..] | ---+------------|
+ * |___________________________________________________| |
+ * ___________________________________________________________ /
+ * | Bootlog | <´
+ * |-----------------------------------------------------------|
+ * | UINT32 Signature | "BTLH" |
+ * | CHAR8[4] Producer | "edk2" for edk2, boot binary |
+ * | | dependent. |
+ * | UINT16 ExtraHeaderType | 1 for edk2 |
+ * | UINT8 ExtraHeaderSize | Bytes for ExtraHeader below |
+ * | UINT8 MsgExtraHeaderSize | Bytes for Extra header in |
+ * | | each log line |
+ * | UINT32 LastByte | Length of the log, starting |
+ * | | at &Signature |
+ * | UINT64 TicksPerSecond | Frequency of the timer for |
+ * | | each log line. Time at system |
+ * | | reset is 0 for all logs. |
+ * | ExtraHeader ExtraHeader | Depends on Type above ---+---,
+ * | BootlogMessage Msgs[] | Log lines ---+---|--,
+ * |___________________________________________________________| | |
+ * _________________________________________________________ / |
+ * | ExtraHeader (edk2) | <-´ |
+ * |---------------------------------------------------------| |
+ * | UINT32 AllocatedSize | Size of the allocation for the | |
+ * | | current bootlog. Used internally | |
+ * | | to resize on demand. | |
+ * |_________________________________________________________| |
+ * _________________________________________________________ /
+ * | Bootlog Message (edk2) | <----´
+ * |---------------------------------------------------------|
+ * | UINT32 ErrorLevel | edk2 defined ErrorLevel |
+ * | UINT64 Ticks | Ticks since power on |
+ * | CHAR8 String[] | '\0' terminated UTF-8 message |
+ * |_________________________________________________________|
+ */
+
+
+#define SIG_BOOTLOG_CONFIG_TABLE 0x474c5442 /* BTLG */
+#define SIG_BOOTLOG_HEADER 0x484c5442 /* BTLH */
+
+#define BOOTLOG_PRODUCER "edk2"
+
+enum BOOTLOG_EXTRA_HEADER_TYPE {
+ BOOTLOG_EXTRA_HEADER_EDK2 = 1,
+};
+
+typedef struct {
+ UINT32 Signature;
+ UINT16 MaxLogs;
+ UINT16 NrLogs;
+ UINT64 LogAddress[];
+} BOOTLOG_CONFIG_TABLE;
+
+typedef struct {
+ UINT32 AllocatedSize; /* Maximum space available for the log */
+} BOOTLOG_EXTRA_HEADER;
+
+typedef struct {
+ UINT32 Signature; /* "BTLH" */
+ CHAR8 Producer[4]; /* "edk2" */
+ UINT16 ExtraHeaderType; /* enum BOOTLOG_EXTRA_HEADER_TYPE */
+ UINT8 ExtraHeaderSize; /* sizeof(ExtraHeader) */
+ UINT8 MsgExtraHeaderSize; /* sizeof(BOOTLOG_ENTRY_EDK2) -
+ sizeof(BOOTLOG_ENTRY) */
+ UINT32 LastByte; /* sizeof(BOOTLOG_HEADER) +
+ sizeof(Data) */
+ UINT64 TicksPerSecond; /* Tick frequency. */
+ BOOTLOG_EXTRA_HEADER ExtraHeader;
+ CHAR8 Data[]; /* Multiple successive
+ BOOTLOG_ENTRY_EDK2 entries,
+ ends at LastByte */
+} BOOTLOG_HEADER;
+
+typedef struct {
+ UINT64 Ticks; /* Ticks since system start. */
+ CHAR8 String[]; /* NULL terminated UTF-8 */
+} BOOTLOG_ENTRY;
+
+typedef struct {
+ UINT32 ErrorLevel;
+ BOOTLOG_ENTRY Log;
+} BOOTLOG_ENTRY_EDK2;
+
+RETURN_STATUS
+EFIAPI
+DebugBootlogAppend (
+ IN CONST CHAR8 *String,
+ IN UINTN Length,
+ IN UINTN ErrorLevel
+ );
+
+UINT32
+EFIAPI
+GetDebugBootlogErrorLevel (
+ VOID
+ );
--
2.28.0.394.ge197136389
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
next prev parent reply other threads:[~2022-05-27 2:43 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-27 2:43 [PATCH 00/12] Introduce Bootlog DEBUG() output Alexander Graf
2022-05-27 2:43 ` Alexander Graf [this message]
2022-05-27 2:43 ` [PATCH 02/12] MdePkg: Add Null BaseDebugBootlog Alexander Graf
2022-05-27 2:43 ` [PATCH 03/12] MdePkg: Add Fallback timer support for BaseDebugBootlog Alexander Graf
2022-05-27 2:43 ` [PATCH 04/12] MdePkg: Add X86 " Alexander Graf
2022-05-27 2:43 ` [PATCH 05/12] MdePkg: Add ARM " Alexander Graf
2022-05-27 2:43 ` [PATCH 06/12] MdePkg: Add Pei phase BaseDebugBootlog Alexander Graf
2022-05-27 2:43 ` [PATCH 07/12] MdePkg: Add Dxe " Alexander Graf
2022-05-27 2:43 ` [PATCH 08/12] MdePkg: Add BaseDebugLibBootlog Alexander Graf
2022-05-27 2:43 ` [PATCH 09/12] Scripts: Add bootlog decyphering script Alexander Graf
2022-05-27 2:43 ` [PATCH 10/12] BaseDebugLibSerialPort: Include BaseDebugBootlog in all dscs Alexander Graf
2022-05-27 2:43 ` [PATCH 11/12] BaseDebugLibSerialPort: Emit messages to boot log Alexander Graf
2022-05-27 2:43 ` [PATCH 12/12] OvmfPkg/PlatformDebugLibIoPort: Add Bootlog support Alexander Graf
2022-06-01 9:33 ` [edk2-devel] [PATCH 00/12] Introduce Bootlog DEBUG() output Gerd Hoffmann
2022-06-01 16:58 ` Benjamin Doron
2022-06-02 8:35 ` Gerd Hoffmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220527024317.13476-2-graf@amazon.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox