/* Copyright 2019 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "console.h" #include "extension.h" #include "endian.h" #include "flash_log.h" #include "util.h" static enum vendor_cmd_rc vc_pop_log_entry(enum vendor_cmd_cc code, void *buf, size_t input_size, size_t *response_size) { uint32_t prev_timestamp; int byte_size; *response_size = 0; /* In case there is an error. */ if (input_size != sizeof(prev_timestamp)) return VENDOR_RC_BOGUS_ARGS; memcpy(&prev_timestamp, buf, sizeof(prev_timestamp)); byte_size = flash_log_dequeue_event( prev_timestamp, buf, FLASH_LOG_ENTRY_SIZE(MAX_FLASH_LOG_PAYLOAD_SIZE)); if (byte_size >= 0) { *response_size = byte_size; return VENDOR_RC_SUCCESS; } /* Negative value should fit into a byte. */ *response_size = 1; ((uint8_t *)buf)[0] = -byte_size; return VENDOR_RC_INTERNAL_ERROR; } DECLARE_VENDOR_COMMAND(VENDOR_CC_POP_LOG_ENTRY, vc_pop_log_entry); static enum vendor_cmd_rc vc_flog_tstamp(enum vendor_cmd_cc code, void *buf, size_t input_size, size_t *response_size) { uint32_t tstamp; enum ec_error_list rv; if (!input_size) { /* This is a request to report current flash log time. */ tstamp = htobe32(flash_log_get_tstamp()); memcpy(buf, &tstamp, sizeof(tstamp)); *response_size = sizeof(tstamp); return VENDOR_RC_SUCCESS; } if (input_size != sizeof(tstamp)) return VENDOR_RC_BOGUS_ARGS; memcpy(&tstamp, buf, sizeof(tstamp)); tstamp = be32toh(tstamp); rv = flash_log_set_tstamp(tstamp); if (rv == EC_SUCCESS) { *response_size = 0; return VENDOR_RC_SUCCESS; } *response_size = 1; *((uint8_t *)buf) = (uint8_t)rv; return VENDOR_RC_BOGUS_ARGS; } DECLARE_VENDOR_COMMAND(VENDOR_CC_FLOG_TIMESTAMP, vc_flog_tstamp);