diff options
-rw-r--r-- | src/commonlib/Makefile.inc | 4 | ||||
-rw-r--r-- | src/commonlib/bsd/elog.c | 25 | ||||
-rw-r--r-- | src/commonlib/bsd/include/commonlib/bsd/elog.h | 39 | ||||
-rw-r--r-- | src/drivers/elog/elog.c | 33 | ||||
-rw-r--r-- | src/drivers/elog/elog_internal.h | 35 |
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_ */ |