diff options
-rw-r--r-- | extra/usb_updater/gsctool.c | 38 | ||||
-rw-r--r-- | extra/usb_updater/gsctool.h | 7 | ||||
-rw-r--r-- | extra/usb_updater/verify_ro.c | 6 | ||||
-rw-r--r-- | 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 <desc_file>\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 <stdbool.h> #include <stdint.h> #include <sys/types.h> @@ -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 <errno.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -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 <stdbool.h> + #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 |