/* SPDX-License-Identifier: BSD-3-Clause */ #include <commonlib/bsd/bcd.h> #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; } /* * return the next elog event. * return NULL if event is invalid. */ const struct event_header *elog_get_next_event(const struct event_header *event) { if (!event) return NULL; /* Point to next event */ return (const struct event_header *)((const void *)(event) + event->length); } /* return the data associated to the event_header. */ const void *event_get_data(const struct event_header *event) { /* * Pointing to the next event returns the data, since data is the first * field right after the header. */ return (const void *)(&event[1]); } /* Populate timestamp in event header with given time. */ void elog_fill_timestamp(struct event_header *event, uint8_t sec, uint8_t min, uint8_t hour, uint8_t mday, uint8_t mon, uint16_t year) { event->second = bin2bcd(sec); event->minute = bin2bcd(min); event->hour = bin2bcd(hour); event->day = bin2bcd(mday); event->month = bin2bcd(mon); event->year = bin2bcd(year % 100); /* Basic check of expected ranges. */ if (event->month > 0x12 || event->day > 0x31 || event->hour > 0x23 || event->minute > 0x59 || event->second > 0x59) { event->year = 0; event->month = 0; event->day = 0; event->hour = 0; event->minute = 0; event->second = 0; } } void elog_update_checksum(struct event_header *event, uint8_t checksum) { uint8_t *event_data = (uint8_t *)event; event_data[event->length - 1] = checksum; } uint8_t elog_checksum_event(const struct event_header *event) { uint8_t index, checksum = 0; const uint8_t *data = (const uint8_t *)event; for (index = 0; index < event->length; index++) checksum += data[index]; return checksum; }