Ricardo Quesada has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/57395 )
Change subject: elogtool: add next_available_event_offset function ......................................................................
elogtool: add next_available_event_offset function
This function is "extracted" from cmd_clear(). This new function will be called from cmd_add(), and new command that will be added in a future CL (see CL chain).
Additional minor fixes: - calls usage() if no valid commands are passed. - Slightly improves usage() output. Needed for cmd_clear()
BUG=b:172210863 TEST=elogtool clear
Change-Id: I0d8ecc893675758d7f90845282a588d367b55567 Signed-off-by: Ricardo Quesada ricardoq@google.com --- M util/cbfstool/elogtool.c 1 file changed, 33 insertions(+), 21 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/95/57395/1
diff --git a/util/cbfstool/elogtool.c b/util/cbfstool/elogtool.c index 4ab8494..a3cd9de 100644 --- a/util/cbfstool/elogtool.c +++ b/util/cbfstool/elogtool.c @@ -49,8 +49,8 @@ "USAGE:\n" "\t%s COMMAND [-f <filename>]\n\n" "where, COMMAND is:\n" - " list = lists all the event logs in human readable format\n" - " clear = clears all the event logs\n" + " list lists all the event logs in human readable format\n" + " clear clears all the event logs\n" "\n" "ARGS\n" "-f, --file <filename> File that holds event log partition.\n" @@ -115,6 +115,23 @@ return ELOGTOOL_EXIT_SUCCESS; }
+static int next_available_event_offset(const struct buffer *buf) +{ + const struct event_header *event; + int offset = sizeof(struct elog_header); + + event = buffer_get(buf) + offset; + while ((const void *)(event) < buffer_end(buf)) { + if (event->type == ELOG_TYPE_EOL || event->length == 0) + break; + + offset += event->length; + assert((size_t)offset <= buffer_size(buf) && "Out of bounds"); + event = elog_get_next_event(event); + } + return offset; +} + static int cmd_list(const struct buffer *buf) { const struct event_header *event; @@ -141,34 +158,27 @@ */ static int cmd_clear(const struct buffer *b) { - const struct event_header *event; - uint32_t used_data_size = 0; + uint32_t offset; struct buffer buf; - void *data_offset; + void *start;
- /* Clone the buffer to avoid changing the offset of the original buffer */ - buffer_clone(&buf, b); - /* eventlog_init_event() expects buffer to point to the event */ - buffer_seek(&buf, sizeof(struct elog_header)); - + start = buffer_get(b); /* * Calculate the size of the "used" buffer, needed for ELOG_TYPE_LOG_CLEAR. * Then overwrite the entire buffer with ELOG_TYPE_EOL. * Finally insert a LOG_CLEAR event into the buffer. */ - event = data_offset = buffer_get(&buf); - while ((const void *)(event) < buffer_end(&buf)) { - if (event->type == ELOG_TYPE_EOL || event->length == 0) - break; + offset = next_available_event_offset(b); + memset(start + sizeof(struct elog_header), ELOG_TYPE_EOL, + buffer_size(b) - sizeof(struct elog_header));
- used_data_size += event->length; - event = elog_get_next_event(event); - } + /* Clone the buffer to avoid changing the offset of the original buffer */ + buffer_clone(&buf, b); + buffer_seek(&buf, sizeof(struct elog_header));
- memset(data_offset, ELOG_TYPE_EOL, buffer_size(&buf)); + offset -= sizeof(struct elog_header);
- if (!eventlog_init_event(&buf, ELOG_TYPE_LOG_CLEAR, - &used_data_size, sizeof(used_data_size))) + if (!eventlog_init_event(&buf, ELOG_TYPE_LOG_CLEAR, &offset, sizeof(offset))) return ELOGTOOL_EXIT_NOT_ENOUGH_BUFFER_SPACE;
return ELOGTOOL_EXIT_SUCCESS; @@ -231,8 +241,10 @@ } }
- if (i == ARRAY_SIZE(cmds)) + if (i == ARRAY_SIZE(cmds)) { + usage(argv[0]); ret = ELOGTOOL_EXIT_BAD_ARGS; + }
if (!ret && cmds[i].write_back) ret = elog_write(&buf, filename);