21 #define ELOG_MIN_AVAILABLE_ENTRIES 2
22 #define ELOG_SHRINK_PERCENTAGE 25
24 #if CONFIG(ELOG_DEBUG)
25 #define elog_debug(STR...) printk(BIOS_DEBUG, STR)
27 #define elog_debug(STR...)
30 #define NV_NEEDS_ERASE (~(size_t)0)
58 #define ELOG_SIZE (4 * KiB)
84 elog_debug(
"ELOG: new event at offset 0x%zx\n",
202 for (i = 0; i < size; i++) {
240 const size_t size =
sizeof(len);
247 if (len < (
sizeof(*event) +
sizeof(
checksum)))
282 elog_debug(
"%s(address=%p offset=0x%08zx size=%zu)\n", __func__,
324 const size_t size =
sizeof(
type);
327 offset + type_offset, size) < 0) {
436 offset = start_offset + size;
452 size_t remaining_size;
457 const size_t size =
sizeof(
uint8_t);
462 if (
offset > requested_size)
483 remaining_size = last_write -
offset;
484 elog_debug(
"ELOG: shrinking offset: 0x%zx remaining_size: 0x%zx\n",
500 size_t captured_last_write;
515 if (requested_size >= total_event_space)
516 shrunk_size = total_event_space;
519 captured_last_write);
544 if (!
CONFIG(BOOT_DEVICE_MEMORY_MAPPED))
719 "in previous boot: 0x%02x/0x%04x\n", code, extra);
764 if (!mirror_buffer) {
804 elog_debug(
"%s(type=%X)\n", __func__, event_type);
811 event_size =
sizeof(*event) + data_size + 1;
814 "big (%d)\n", event_type, event_size);
827 event->type = event_type;
828 event->length = event_size;
836 memcpy(&event[1], data, data_size);
846 event_type, event_size);
847 if (event->
day != 0) {
896 .event_complement = complement
struct arm64_kernel_header header
static int acpi_is_wakeup_s3(void)
void * memcpy(void *dest, const void *src, size_t n)
void * memmove(void *dest, const void *src, size_t n)
void * memset(void *dstpp, int c, size_t len)
void * smbios_carve_table(unsigned long start, u8 type, u8 length, u16 handle)
int smbios_full_table_len(struct smbios_header *header, u8 *str_table_start)
int rtc_get(struct rtc_time *time)
u32 boot_count_read(void)
#define offsetof(TYPE, MEMBER)
@ CB_SUCCESS
Call completed successfully.
void * cbmem_add(u32 id, u64 size)
enum cb_err elog_verify_header(const struct elog_header *header)
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)
void elog_update_checksum(struct event_header *event, uint8_t checksum)
uint8_t elog_checksum_event(const struct event_header *event)
#define ELOG_TYPE_LOG_CLEAR
#define ELOG_TYPE_LAST_POST_CODE
#define ELOG_MAX_EVENT_SIZE
#define ELOG_RW_REGION_NAME
#define ELOG_HEADER_TYPE_OEM
#define ELOG_TYPE_WAKE_SOURCE
#define ELOG_TYPE_EXTENDED_EVENT
#define ELOG_TYPE_POST_EXTRA
#define printk(level,...)
static void elog_write_header_in_mirror(void)
int elog_add_event_word(u8 event_type, u16 data)
static void elog_tandem_increment_last_write(size_t size)
#define ELOG_SHRINK_PERCENTAGE
static void elog_add_boot_count(void)
BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_ENTRY, elog_bs_init, NULL)
static size_t elog_events_total_space(void)
static int elog_prepare_empty(void)
static void elog_debug_dump_buffer(const char *msg)
static struct region_device * mirror_dev_get(void)
static u8 * elog_flash_offset_to_address(void)
static void log_last_boot_post(void)
static void elog_move_events_to_front(size_t offset, size_t size)
static int elog_find_flash(void)
int elog_add_event_raw(u8 event_type, void *data, u8 data_size)
static struct event_header * elog_get_event_buffer(size_t offset, size_t size)
static bool elog_do_add_boot_count(void)
static void elog_bs_init(void *unused)
static int elog_scan_flash(void)
static int elog_sync_to_nv(void)
int elog_add_event_dword(u8 event_type, u32 data)
int elog_add_event_byte(u8 event_type, u8 data)
static uint8_t elog_mirror_buf[ELOG_SIZE]
static size_t elog_is_event_valid(size_t offset)
static int elog_shrink_by_size(size_t requested_size)
static void elog_nv_erase(void)
int elog_smbios_write_type15(unsigned long *current, int handle)
static bool elog_nv_needs_update(void)
static void elog_put_event_buffer(struct event_header *event)
static void elog_nv_increment_last_write(size_t size)
static size_t elog_events_start(void)
static void elog_nv_write(size_t offset, size_t size)
static void elog_nv_reset_last_write(void)
static struct event_header * elog_get_next_event_buffer(size_t size)
#define ELOG_MIN_AVAILABLE_ENTRIES
static size_t elog_nv_region_to_update(size_t *offset)
static bool elog_nv_needs_erase(void)
int elog_add_event_wake(u8 source, u32 instance)
static bool elog_should_shrink(void)
#define elog_debug(STR...)
static int elog_shrink(void)
static void elog_tandem_reset_last_write(void)
static size_t elog_mirror_reset_last_write(void)
static int elog_update_event_buffer_state(void)
static int elog_is_buffer_clear(size_t offset)
static void elog_mirror_increment_last_write(size_t size)
static size_t elog_do_shrink(size_t requested_size, size_t last_write)
static int elog_is_header_valid(void)
static void elog_nv_needs_possible_erase(void)
int elog_add_extended_event(u8 type, u32 complement)
int elog_add_event(u8 event_type)
int cmos_post_previous_boot(u8 *code, u32 *extra)
static struct region_device rdev
int fmap_locate_area_as_rdev_rw(const char *name, struct region_device *area)
@ SMBIOS_EVENTLOG_ACCESS_METHOD_MMIO32
@ SMBIOS_EVENTLOG_STATUS_VALID
static uint8_t checksum(uint8_t *data, int offset)
void timestamp_add_now(enum timestamp_id id)
void hexdump(const void *memory, size_t length)
#define BIOS_INFO
BIOS_INFO - Expected events.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
u8 buffer[C2P_BUFFER_MAXSIZE]
ssize_t rdev_eraseat(const struct region_device *rd, size_t offset, size_t size)
int rdev_munmap(const struct region_device *rd, void *mapping)
static size_t region_device_sz(const struct region_device *rdev)
ssize_t rdev_writeat(const struct region_device *rd, const void *b, size_t offset, size_t size)
static void * rdev_mmap_full(const struct region_device *rd)
void * rdev_mmap(const struct region_device *rd, size_t offset, size_t size)
int rdev_chain_mem_rw(struct region_device *child, void *base, size_t size)
int rdev_chain(struct region_device *child, const struct region_device *parent, size_t offset, size_t size)
ssize_t rdev_readat(const struct region_device *rd, void *b, size_t offset, size_t size)
static size_t region_device_offset(const struct region_device *rdev)
#define ENV_PAYLOAD_LOADER
struct region_device nv_dev
enum elog_init_state elog_initialized
struct region_device mirror_dev
u8 log_type_descriptor_length
struct smbios_header header