75 lines
1.8 KiB
C
75 lines
1.8 KiB
C
/* 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);
|