From 94843eca31c85ceaf4b8f9da127216ef45f278eb Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Mon, 21 Nov 2016 11:08:02 -0800 Subject: [PATCH] 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 Reviewed-on: https://chromium-review.googlesource.com/413106 Reviewed-by: Vadim Bendebury --- board/cr50/board.c | 43 +++++++++++++++++++++++++++++++++++++++++++ include/extension.h | 1 + 2 files changed, 44 insertions(+) diff --git a/board/cr50/board.c b/board/cr50/board.c index 7ce2633e76..37f2f4dc9e 100644 --- a/board/cr50/board.c +++ b/board/cr50/board.c @@ -3,12 +3,15 @@ * found in the LICENSE file. */ +#include + #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); diff --git a/include/extension.h b/include/extension.h index 225ca87239..66cc845af8 100644 --- a/include/extension.h +++ b/include/extension.h @@ -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, };