diff options
author | Louis Yung-Chieh Lo <yjlou@chromium.org> | 2012-06-26 14:48:39 +0800 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-06-27 00:55:04 -0700 |
commit | 455b119dc0f3cd5538c4a53f0e2ab38534bcdf14 (patch) | |
tree | 8731db8a42f4896d9c3e26d5ffccd5f2c7776953 /cgpt | |
parent | 58def7454d2c4d085e383a0b73d00670390ddd83 (diff) | |
download | vboot-455b119dc0f3cd5538c4a53f0e2ab38534bcdf14.tar.gz |
cgpt: add -d option for cgpt show
The debug mode is used to dump GPT headers and entries no matter the
they are valid or not.
BUG=chromium-os:32142
TEST=tested in chroot with the bad secondary entries.
% cgpt show /dev/sda -d
...
976773135 32 INVALID Sec GPT table
282624 968101888 1 Label: "STATE"
Type: Linux data
...
1 1 INVALID Sec GPT header
Sig: [EFI PART]
Rev: 0x00010000
...
Change-Id: Ie54068353b87c9f15915ffb51b8de688e0367975
Signed-off-by: Louis Yung-Chieh Lo <yjlou@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/26091
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Tested-by: Yung-Chieh Lo <yjlou%chromium.org@gtempaccount.com>
Commit-Ready: Yung-Chieh Lo <yjlou%chromium.org@gtempaccount.com>
Diffstat (limited to 'cgpt')
-rw-r--r-- | cgpt/cgpt_params.h | 1 | ||||
-rw-r--r-- | cgpt/cgpt_show.c | 83 | ||||
-rw-r--r-- | cgpt/cmd_show.c | 7 |
3 files changed, 58 insertions, 33 deletions
diff --git a/cgpt/cgpt_params.h b/cgpt/cgpt_params.h index 3daf34a8..22af9626 100644 --- a/cgpt/cgpt_params.h +++ b/cgpt/cgpt_params.h @@ -45,6 +45,7 @@ typedef struct CgptShowParams { int quick; uint32_t partition; int single_item; + int debug; // This is filled in by the relevant methods in cgpt_show.c int num_partitions; diff --git a/cgpt/cgpt_show.c b/cgpt/cgpt_show.c index 47599f42..681b0c7e 100644 --- a/cgpt/cgpt_show.c +++ b/cgpt/cgpt_show.c @@ -10,6 +10,7 @@ #include "cgptlib_internal.h" #include "cgpt_params.h" +#include "crc32.h" /* Generate output like: * @@ -49,7 +50,8 @@ static void RawDump(const uint8_t *memory, const int size, #define PARTITION_FMT "%10d%10d%8d %s\n" #define PARTITION_MORE "%10s%10s%8s %s%s\n", "", "", "" -static void HeaderDetails(GptHeader *header, const char *indent, int raw) { +static void HeaderDetails(GptHeader *header, GptEntry *entries, + const char *indent, int raw) { int i; printf("%sSig: ", indent); @@ -67,7 +69,8 @@ static void HeaderDetails(GptHeader *header, const char *indent, int raw) { printf("%sRev: 0x%08x\n", indent, header->revision); printf("%sSize: %d\n", indent, header->size); - printf("%sHeader CRC: 0x%08x\n", indent, header->header_crc32); + printf("%sHeader CRC: 0x%08x %s\n", indent, header->header_crc32, + (HeaderCrc(header) != header->header_crc32) ? "(INVALID)" : ""); printf("%sMy LBA: %lld\n", indent, (long long)header->my_lba); printf("%sAlternate LBA: %lld\n", indent, (long long)header->alternate_lba); printf("%sFirst LBA: %lld\n", indent, (long long)header->first_usable_lba); @@ -82,7 +85,12 @@ static void HeaderDetails(GptHeader *header, const char *indent, int raw) { printf("%sEntries LBA: %lld\n", indent, (long long)header->entries_lba); printf("%sNumber of entries: %d\n", indent, header->number_of_entries); printf("%sSize of entry: %d\n", indent, header->size_of_entry); - printf("%sEntries CRC: 0x%08x\n", indent, header->entries_crc32); + printf("%sEntries CRC: 0x%08x %s\n", indent, header->entries_crc32, + header->entries_crc32 != + Crc32((const uint8_t *)entries,header->size_of_entry * + header->number_of_entries) + ? "INVALID" : "" + ); } void EntryDetails(GptEntry *entry, uint32_t index, int raw) { @@ -279,6 +287,8 @@ int cgpt_show(CgptShowParams *params) { i+1, type); } } else { // show all partitions + GptEntry *entries; + if (CGPT_OK != ReadPMBR(&drive)) { Error("Unable to read PMBR\n"); return CGPT_FAILED; @@ -292,40 +302,47 @@ int cgpt_show(CgptShowParams *params) { if (drive.gpt.valid_headers & MASK_PRIMARY) { printf(GPT_FMT, (int)GPT_PMBR_SECTOR, (int)GPT_HEADER_SECTOR, "", "Pri GPT header"); - if (params->verbose) { - GptHeader *header; - char indent[64]; - - require(snprintf(indent, sizeof(indent), GPT_MORE) < sizeof(indent)); - header = (GptHeader*)drive.gpt.primary_header; - HeaderDetails(header, indent, params->numeric); - } } else { printf(GPT_FMT, (int)GPT_PMBR_SECTOR, (int)GPT_HEADER_SECTOR, "INVALID", "Pri GPT header"); } + if (params->debug || + ((drive.gpt.valid_headers & MASK_PRIMARY) && params->verbose)) { + GptHeader *header; + char indent[64]; + + require(snprintf(indent, sizeof(indent), GPT_MORE) < sizeof(indent)); + header = (GptHeader*)drive.gpt.primary_header; + entries = (GptEntry*)drive.gpt.primary_entries; + HeaderDetails(header, entries, indent, params->numeric); + } + printf(GPT_FMT, (int)(GPT_PMBR_SECTOR + GPT_HEADER_SECTOR), (int)GPT_ENTRIES_SECTORS, drive.gpt.valid_entries & MASK_PRIMARY ? "" : "INVALID", "Pri GPT table"); - if (drive.gpt.valid_entries & MASK_PRIMARY) + if (params->debug || + (drive.gpt.valid_entries & MASK_PRIMARY)) EntriesDetails(&drive.gpt, PRIMARY, params->numeric); + /****************************** Secondary *************************/ printf(GPT_FMT, (int)(drive.gpt.drive_sectors - GPT_HEADER_SECTOR - GPT_ENTRIES_SECTORS), (int)GPT_ENTRIES_SECTORS, drive.gpt.valid_entries & MASK_SECONDARY ? "" : "INVALID", "Sec GPT table"); /* We show secondary table details if any of following is true. - * 1. only secondary is valid. - * 2. secondary is not identical to promary. + * 1. in debug mode. + * 2. only secondary is valid. + * 3. secondary is not identical to promary. */ - if ((drive.gpt.valid_entries & MASK_SECONDARY) && - (!(drive.gpt.valid_entries & MASK_PRIMARY) || - memcmp(drive.gpt.primary_entries, drive.gpt.secondary_entries, - TOTAL_ENTRIES_SIZE))) { + if (params->debug || + ((drive.gpt.valid_entries & MASK_SECONDARY) && + (!(drive.gpt.valid_entries & MASK_PRIMARY) || + memcmp(drive.gpt.primary_entries, drive.gpt.secondary_entries, + TOTAL_ENTRIES_SIZE)))) { EntriesDetails(&drive.gpt, SECONDARY, params->numeric); } @@ -336,21 +353,23 @@ int cgpt_show(CgptShowParams *params) { printf(GPT_FMT, (int)GPT_PMBR_SECTOR, (int)GPT_HEADER_SECTOR, "INVALID", "Sec GPT header"); /* We show secondary header if any of following is true: - * 1. only secondary is valid. - * 2. secondary is not synonymous to primary. + * 1. in debug mode. + * 2. only secondary is valid. + * 3. secondary is not synonymous to primary. */ - if ((drive.gpt.valid_headers & MASK_SECONDARY) && - (!(drive.gpt.valid_headers & MASK_PRIMARY) || - !IsSynonymous((GptHeader*)drive.gpt.primary_header, - (GptHeader*)drive.gpt.secondary_header))) { - if (params->verbose) { - GptHeader *header; - char indent[64]; - - require(snprintf(indent, sizeof(indent), GPT_MORE) < sizeof(indent)); - header = (GptHeader*)drive.gpt.secondary_header; - HeaderDetails(header, indent, params->numeric); - } + if (params->debug || + ((drive.gpt.valid_headers & MASK_SECONDARY) && + (!(drive.gpt.valid_headers & MASK_PRIMARY) || + !IsSynonymous((GptHeader*)drive.gpt.primary_header, + (GptHeader*)drive.gpt.secondary_header)) && + params->verbose)) { + GptHeader *header; + char indent[64]; + + require(snprintf(indent, sizeof(indent), GPT_MORE) < sizeof(indent)); + header = (GptHeader*)drive.gpt.secondary_header; + entries = (GptEntry*)drive.gpt.secondary_entries; + HeaderDetails(header, entries, indent, params->numeric); } } diff --git a/cgpt/cmd_show.c b/cgpt/cmd_show.c index 6443931f..fa0e5f8b 100644 --- a/cgpt/cmd_show.c +++ b/cgpt/cmd_show.c @@ -28,6 +28,7 @@ static void Usage(void) " -T Tries flag\n" " -P Priority flag\n" " -A raw 64-bit attribute value\n" + " -d Debug output (including invalid headers)\n" "\n", progname); } @@ -40,7 +41,7 @@ int cmd_show(int argc, char *argv[]) { char *e = 0; opterr = 0; // quiet, you - while ((c=getopt(argc, argv, ":hnvqi:bstulSTPA")) != -1) + while ((c=getopt(argc, argv, ":hnvqi:bstulSTPAd")) != -1) { switch (c) { @@ -73,6 +74,10 @@ int cmd_show(int argc, char *argv[]) { params.single_item = c; break; + case 'd': + params.debug = 1; + break; + case 'h': Usage(); return CGPT_OK; |