summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Yung-Chieh Lo <yjlou@chromium.org>2012-06-26 14:48:39 +0800
committerGerrit <chrome-bot@google.com>2012-06-27 00:55:04 -0700
commit455b119dc0f3cd5538c4a53f0e2ab38534bcdf14 (patch)
tree8731db8a42f4896d9c3e26d5ffccd5f2c7776953
parent58def7454d2c4d085e383a0b73d00670390ddd83 (diff)
downloadvboot-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>
-rw-r--r--cgpt/cgpt_params.h1
-rw-r--r--cgpt/cgpt_show.c83
-rw-r--r--cgpt/cmd_show.c7
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;