summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/commonlib/Makefile.inc4
-rw-r--r--src/commonlib/bsd/elog.c25
-rw-r--r--src/commonlib/bsd/include/commonlib/bsd/elog.h39
-rw-r--r--src/drivers/elog/elog.c33
-rw-r--r--src/drivers/elog/elog_internal.h35
5 files changed, 78 insertions, 58 deletions
diff --git a/src/commonlib/Makefile.inc b/src/commonlib/Makefile.inc
index c5fa8ed85e..53975bcad8 100644
--- a/src/commonlib/Makefile.inc
+++ b/src/commonlib/Makefile.inc
@@ -53,3 +53,7 @@ ramstage-y += bsd/lz4_wrapper.c
postcar-y += bsd/lz4_wrapper.c
ramstage-y += sort.c
+
+romstage-y += bsd/elog.c
+ramstage-y += bsd/elog.c
+smm-y += bsd/elog.c
diff --git a/src/commonlib/bsd/elog.c b/src/commonlib/bsd/elog.c
new file mode 100644
index 0000000000..62149daa42
--- /dev/null
+++ b/src/commonlib/bsd/elog.c
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#include <commonlib/bsd/elog.h>
+#include <stddef.h>
+
+/*
+ * verify and validate if header is a valid coreboot Event Log header.
+ * return CB_ERR if invalid, otherwise CB_SUCCESS.
+ */
+enum cb_err elog_verify_header(const struct elog_header *header)
+{
+ if (header == NULL)
+ return CB_ERR;
+
+ if (header->magic != ELOG_SIGNATURE)
+ return CB_ERR;
+
+ if (header->version != ELOG_VERSION)
+ return CB_ERR;
+
+ if (header->header_size != sizeof(*header))
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
diff --git a/src/commonlib/bsd/include/commonlib/bsd/elog.h b/src/commonlib/bsd/include/commonlib/bsd/elog.h
new file mode 100644
index 0000000000..6c58557fbe
--- /dev/null
+++ b/src/commonlib/bsd/include/commonlib/bsd/elog.h
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+
+#ifndef _COMMONLIB_BSD_ELOG_H_
+#define _COMMONLIB_BSD_ELOG_H_
+
+#include <inttypes.h>
+
+#include <commonlib/bsd/cb_err.h>
+
+/* ELOG header */
+struct elog_header {
+ uint32_t magic;
+ uint8_t version;
+ uint8_t header_size;
+ uint8_t reserved[2];
+} __packed;
+
+/* ELOG related constants */
+#define ELOG_SIGNATURE 0x474f4c45 /* 'ELOG' */
+#define ELOG_VERSION 1
+
+/* SMBIOS event log header */
+struct event_header {
+ uint8_t type;
+ uint8_t length;
+ uint8_t year;
+ uint8_t month;
+ uint8_t day;
+ uint8_t hour;
+ uint8_t minute;
+ uint8_t second;
+} __packed;
+
+/* SMBIOS Type 15 related constants */
+#define ELOG_HEADER_TYPE_OEM 0x88
+
+enum cb_err elog_verify_header(const struct elog_header *header);
+
+#endif /* _COMMONLIB_BSD_ELOG_H_ */
diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c
index 97555bc3f2..cfeb7ce6d7 100644
--- a/src/drivers/elog/elog.c
+++ b/src/drivers/elog/elog.c
@@ -1,12 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <acpi/acpi.h>
-#include <bootstate.h>
-#include <cbmem.h>
-#include <console/console.h>
#include <bcd.h>
#include <boot_device.h>
+#include <bootstate.h>
+#include <cbmem.h>
+#include <commonlib/bsd/elog.h>
#include <commonlib/region.h>
+#include <console/console.h>
+#include <elog.h>
#include <fmap.h>
#include <lib.h>
#include <post.h>
@@ -14,8 +16,9 @@
#include <smbios.h>
#include <stdint.h>
#include <string.h>
-#include <elog.h>
-#include "elog_internal.h"
+
+#define ELOG_MIN_AVAILABLE_ENTRIES 2 /* Shrink when this many can't fit */
+#define ELOG_SHRINK_PERCENTAGE 25 /* Percent of total area to remove */
#if CONFIG(ELOG_DEBUG)
#define elog_debug(STR...) printk(BIOS_DEBUG, STR)
@@ -239,24 +242,8 @@ static int elog_is_header_valid(void)
header = rdev_mmap(mirror_dev_get(), 0, sizeof(*header));
- if (header == NULL) {
- printk(BIOS_ERR, "ELOG: could not map header.\n");
- return 0;
- }
-
- if (header->magic != ELOG_SIGNATURE) {
- printk(BIOS_ERR, "ELOG: header magic 0x%X != 0x%X\n",
- header->magic, ELOG_SIGNATURE);
- return 0;
- }
- if (header->version != ELOG_VERSION) {
- printk(BIOS_ERR, "ELOG: header version %u != %u\n",
- header->version, ELOG_VERSION);
- return 0;
- }
- if (header->header_size != sizeof(*header)) {
- printk(BIOS_ERR, "ELOG: header size mismatch %u != %zu\n",
- header->header_size, sizeof(*header));
+ if (elog_verify_header(header) != CB_SUCCESS) {
+ printk(BIOS_ERR, "ELOG: failed to verify header.\n");
return 0;
}
return 1;
diff --git a/src/drivers/elog/elog_internal.h b/src/drivers/elog/elog_internal.h
deleted file mode 100644
index 6be482b1f7..0000000000
--- a/src/drivers/elog/elog_internal.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-
-#ifndef ELOG_INTERNAL_H_
-#define ELOG_INTERNAL_H_
-
-/* ELOG header */
-struct elog_header {
- u32 magic;
- u8 version;
- u8 header_size;
- u8 reserved[2];
-} __packed;
-
-/* ELOG related constants */
-#define ELOG_SIGNATURE 0x474f4c45 /* 'ELOG' */
-#define ELOG_VERSION 1
-#define ELOG_MIN_AVAILABLE_ENTRIES 2 /* Shrink when this many can't fit */
-#define ELOG_SHRINK_PERCENTAGE 25 /* Percent of total area to remove */
-
-/* SMBIOS event log header */
-struct event_header {
- u8 type;
- u8 length;
- u8 year;
- u8 month;
- u8 day;
- u8 hour;
- u8 minute;
- u8 second;
-} __packed;
-
-/* SMBIOS Type 15 related constants */
-#define ELOG_HEADER_TYPE_OEM 0x88
-
-#endif /* ELOG_INTERNAL_H_ */