Cr50: Add sysinfo vendor command

This returns the system information that is needed to determine the
correct signing keys for firmware updates.

BUG=chrome-os-partner:59747
BUG=chrome-os-partner:59705
BRANCH=none
TEST=make buildall; test on Reef

Run the "sysinfo" command on the Cr50 console:

  > sysinfo
  Reset flags: 0x00000800 (hard)
  Chip:        g cr50 B2
  RO keyid:    0x3716ee6b(dev)
  RW keyid:    0xb93d6539(dev)
  DEV_ID:      0x017950ab 0x04656742
  >

Send the raw command bytes from the Reef AP, observe the result:

  # /tmp/trunks_send --raw 80 01 00 00 00 0C 20 00 00 00 00 12
  80010000001C0000000000123716EE6BB93D6539017950AB04656742
  #

The result contains the same information from the console command:

  8001           TPM_ST_NO_SESSIONS
  0000001C       responseSize (28 bytes)
  00000000       RC_SUCCESS
  0012           vendor-specific subcommand
  3716EE6B       RO keyid
  B93D6539       RW keyid
  017950AB       DEV_ID0
  04656742       DEV_ID1

Change-Id: I82de3ebfb3e9be3b707583bc825d2efbcf851c5c
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/413106
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
This commit is contained in:
Bill Richardson
2016-11-21 11:08:02 -08:00
committed by chrome-bot
parent 2228b76f74
commit 94843eca31
2 changed files with 44 additions and 0 deletions

View File

@@ -3,12 +3,15 @@
* found in the LICENSE file.
*/
#include <endian.h>
#include "clock.h"
#include "common.h"
#include "console.h"
#include "dcrypto/dcrypto.h"
#include "device_state.h"
#include "ec_version.h"
#include "extension.h"
#include "flash_config.h"
#include "gpio.h"
#include "hooks.h"
@@ -754,3 +757,43 @@ static int command_sysinfo(int argc, char **argv)
DECLARE_SAFE_CONSOLE_COMMAND(sysinfo, command_sysinfo,
NULL,
"Print system info");
/*
* SysInfo command:
* There are no input args.
* Output is this struct, all fields in network order.
*/
struct sysinfo_s {
uint32_t ro_keyid;
uint32_t rw_keyid;
uint32_t dev_id0;
uint32_t dev_id1;
} __packed;
static enum vendor_cmd_rc vc_sysinfo(enum vendor_cmd_cc code,
void *buf,
size_t input_size,
size_t *response_size)
{
enum system_image_copy_t active;
uintptr_t vaddr;
const struct SignedHeader *h;
struct sysinfo_s *sysinfo = buf;
active = system_get_ro_image_copy();
vaddr = get_program_memory_addr(active);
h = (const struct SignedHeader *)vaddr;
sysinfo->ro_keyid = htobe32(h->keyid);
active = system_get_image_copy();
vaddr = get_program_memory_addr(active);
h = (const struct SignedHeader *)vaddr;
sysinfo->rw_keyid = htobe32(h->keyid);
sysinfo->dev_id0 = htobe32(GREG32(FUSE, DEV_ID0));
sysinfo->dev_id1 = htobe32(GREG32(FUSE, DEV_ID1));
*response_size = sizeof(*sysinfo);
return VENDOR_RC_SUCCESS;
}
DECLARE_VENDOR_COMMAND(VENDOR_CC_SYSINFO, vc_sysinfo);

View File

@@ -28,6 +28,7 @@ enum vendor_cmd_cc {
/* Our TPMv2 vendor-specific command codes. 16 bits available. */
VENDOR_CC_GET_LOCK = 16,
VENDOR_CC_SET_LOCK = 17,
VENDOR_CC_SYSINFO = 18,
LAST_VENDOR_COMMAND = 65535,
};