From 21f778e89ae989229a99f8ec3f4e35868a30a35a Mon Sep 17 00:00:00 2001 From: Wei-Cheng Xiao Date: Wed, 17 Oct 2018 13:16:34 +0800 Subject: gsctool: add machine output support (-M) to chip board ID (-i, -O) Now gsctool can print out GSC board ID in a machine-friendly way. This allows other programs (e.g., debugd) to parse the output. This is the final CL that adds machine output support to gsctool during verify_ro migration. BRANCH=none BUG=None TEST=manually run gsctool -M -i and gsctool -O verify_ro.db -M on a soraka device connected with a naultilus and check the board ID part in the outputs. Sample output (the board ID part is identical in the outputs of both commands): BID_TYPE=5a534b4d BID_TYPE_INV=a5acb4b2 BID_FLAGS=00007f80 CQ-DEPEND=CL:1309052 Signed-off-by: Wei-Cheng Xiao Reviewed-on: https://chromium-review.googlesource.com/1286312 Commit-Ready: ChromeOS CL Exonerator Bot Tested-by: Wei-Cheng Xiao Reviewed-by: Andrey Pronin Change-Id: Ia275806672c08841c5b5fcc7758d8e0c777b3fc9 Reviewed-on: https://chromium-review.googlesource.com/c/1309453 Tested-by: Bob Moragues Reviewed-by: Bob Moragues Commit-Queue: Bob Moragues --- extra/usb_updater/gsctool.c | 38 +++++++++++++++++++++++++++----------- extra/usb_updater/gsctool.h | 7 +++++-- extra/usb_updater/verify_ro.c | 6 ++++-- extra/usb_updater/verify_ro.h | 11 ++++++++++- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/extra/usb_updater/gsctool.c b/extra/usb_updater/gsctool.c index e21ae305d6..0f8c9a46c6 100644 --- a/extra/usb_updater/gsctool.c +++ b/extra/usb_updater/gsctool.c @@ -544,7 +544,7 @@ static void usage(int errs) "character string.\n" " -k,--ccd_lock Lock CCD\n" " -M,--machine Output in a machine-friendly way. " - "Effective with -f and -b only.\n" + "Effective with -b, -f, -i, and -O.\n" " -m,--tpm_mode [enable|disable]\n" " Change or query tpm_mode\n" " -O,--openbox_rma \n" @@ -1784,7 +1784,8 @@ static void process_wp(struct transfer_descriptor *td) void process_bid(struct transfer_descriptor *td, enum board_id_action bid_action, - struct board_id *bid) + struct board_id *bid, + bool show_machine_output) { size_t response_size; @@ -1795,16 +1796,31 @@ void process_bid(struct transfer_descriptor *td, bid, sizeof(*bid), bid, &response_size); - if (response_size == sizeof(*bid)) { + if (response_size != sizeof(*bid)) { + fprintf(stderr, + "Error reading board ID: response size %zd, " + "first byte %#02x\n", + response_size, + response_size ? *(uint8_t *)&bid : -1); + exit(update_error); + } + + if (show_machine_output) { + print_machine_output( + "BID_TYPE", "%08x", be32toh(bid->type)); + print_machine_output( + "BID_TYPE_INV", "%08x", be32toh(bid->type_inv)); + print_machine_output( + "BID_FLAGS", "%08x", be32toh(bid->flags)); + + } else { printf("Board ID space: %08x:%08x:%08x\n", - be32toh(bid->type), be32toh(bid->type_inv), + be32toh(bid->type), + be32toh(bid->type_inv), be32toh(bid->flags)); - return; } - fprintf(stderr, "Error reading board ID: response size %zd," - " first byte %#02x\n", response_size, - response_size ? *(uint8_t *)&bid : -1); - exit(update_error); + + return; } if (bid_action == bid_set) { @@ -2260,7 +2276,7 @@ int main(int argc, char *argv[]) } if (openbox_desc_file) - return verify_ro(&td, openbox_desc_file); + return verify_ro(&td, openbox_desc_file, show_machine_output); if (ccd_unlock || ccd_open || ccd_lock || ccd_info) process_ccd_state(&td, ccd_unlock, ccd_open, @@ -2270,7 +2286,7 @@ int main(int argc, char *argv[]) process_password(&td); if (bid_action != bid_none) - process_bid(&td, bid_action, &bid); + process_bid(&td, bid_action, &bid, show_machine_output); if (rma) process_rma(&td, rma_auth_code); diff --git a/extra/usb_updater/gsctool.h b/extra/usb_updater/gsctool.h index 1ac23b53bc..920c7f4e05 100644 --- a/extra/usb_updater/gsctool.h +++ b/extra/usb_updater/gsctool.h @@ -7,6 +7,7 @@ #ifndef __EXTRA_USB_UPDATER_GSCTOOL_H #define __EXTRA_USB_UPDATER_GSCTOOL_H +#include #include #include @@ -79,11 +80,13 @@ enum board_id_action { /* * This function allows to retrieve or set (if not initialized) board ID of - * the H1 chip. + * the H1 chip. If bid_action is bid_get and show_machine_output is set, + * prints out board ID in a machine-friendly format. */ void process_bid(struct transfer_descriptor *td, enum board_id_action bid_action, - struct board_id *bid); + struct board_id *bid, + bool show_machine_output); /* * This function can be used to retrieve the current PP status from Cr50 and diff --git a/extra/usb_updater/verify_ro.c b/extra/usb_updater/verify_ro.c index f81fab8e67..4a4aea792a 100644 --- a/extra/usb_updater/verify_ro.c +++ b/extra/usb_updater/verify_ro.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -291,7 +292,8 @@ static int process_descriptor_sections(struct transfer_descriptor *td) } int verify_ro(struct transfer_descriptor *td, - const char *desc_file_name) + const char *desc_file_name, + bool show_machine_output) { /* First find out board ID of the target. */ struct board_id bid; @@ -303,7 +305,7 @@ int verify_ro(struct transfer_descriptor *td, * Find out what Board ID is the device we are talking to. This * function calls exit() on any error. */ - process_bid(td, bid_get, &bid); + process_bid(td, bid_get, &bid, show_machine_output); if (bid.type != ~bid.type_inv) { fprintf(stderr, "Inconsistent board ID: %08x != ~%08x\n", diff --git a/extra/usb_updater/verify_ro.h b/extra/usb_updater/verify_ro.h index c37ba3a337..de2443b8b4 100644 --- a/extra/usb_updater/verify_ro.h +++ b/extra/usb_updater/verify_ro.h @@ -7,9 +7,18 @@ #ifndef __EXTRA_USB_UPDATER_VERIFY_RO_H #define __EXTRA_USB_UPDATER_VERIFY_RO_H +#include + #include "gsctool.h" +/* + * Runs RO verification on the target specified in td using the description file + * desc_file_name. If show_machine_output is set, target's board ID will be + * outputted in a machine-friendly format. Returns 0 on success or a negative + * value if there is an error. + */ int verify_ro(struct transfer_descriptor *td, - const char *desc_file_name); + const char *desc_file_name, + bool show_machine_output); #endif // __EXTRA_USB_UPDATER_VERIFY_RO_H -- cgit v1.2.1