Index: utility/vbutil_kernel.c |
diff --git a/utility/vbutil_kernel.c b/utility/vbutil_kernel.c |
index a9f7be4c99702a769185aafae6c4db7018008d51..81b9e445d93478bb5926337cf88da4fe94ec8132 100644 |
--- a/utility/vbutil_kernel.c |
+++ b/utility/vbutil_kernel.c |
@@ -7,6 +7,7 @@ |
#include <getopt.h> |
#include <inttypes.h> /* For PRIu64 */ |
+#include <stdarg.h> |
#include <stddef.h> |
#include <stdio.h> |
#include <stdlib.h> |
@@ -18,6 +19,10 @@ |
#include "vboot_common.h" |
+/* Global opt */ |
+static int opt_debug = 0; |
+ |
+ |
/* Command line options */ |
enum { |
OPT_MODE_PACK = 1000, |
@@ -43,6 +48,7 @@ static struct option long_opts[] = { |
{"bootloader", 1, 0, OPT_BOOTLOADER }, |
{"config", 1, 0, OPT_CONFIG }, |
{"pad", 1, 0, OPT_PAD }, |
+ {"debug", 0, &opt_debug, 1 }, |
{NULL, 0, 0, 0} |
}; |
@@ -70,6 +76,17 @@ static int PrintHelp(void) { |
return 1; |
} |
+static void Debug(const char *format, ...) { |
+ if (!opt_debug) |
+ return; |
+ |
+ va_list ap; |
+ va_start(ap, format); |
+ fprintf(stderr, "DEBUG: "); |
+ vfprintf(stderr, format, ap); |
+ va_end(ap); |
+} |
+ |
/* Return the smallest integral multiple of [alignment] that is equal |
* to or greater than [val]. Used to determine the number of |
@@ -165,9 +182,11 @@ static int Pack(const char* outfile, const char* keyblock_file, |
} |
/* Read the config file */ |
+ Debug("Reading %s\n", config_file); |
config_buf = ReadFile(config_file, &config_size); |
if (!config_buf) |
return 1; |
+ Debug(" config file size=0x%" PRIx64 "\n", config_size); |
if (CROS_CONFIG_SIZE <= config_size) { /* need room for trailing '\0' */ |
error("Config file %s is too large (>= %d bytes)\n", |
config_file, CROS_CONFIG_SIZE); |
@@ -179,14 +198,18 @@ static int Pack(const char* outfile, const char* keyblock_file, |
config_buf[i] = ' '; |
/* Read the bootloader */ |
+ Debug("Reading %s\n", bootloader_file); |
bootloader_buf = ReadFile(bootloader_file, &bootloader_size); |
if (!bootloader_buf) |
return 1; |
+ Debug(" bootloader file size=0x%" PRIx64 "\n", bootloader_size); |
/* Read the kernel */ |
+ Debug("Reading %s\n", vmlinuz); |
kernel_buf = ReadFile(vmlinuz, &kernel_size); |
if (!kernel_buf) |
return 1; |
+ Debug(" kernel file size=0x%" PRIx64 "\n", kernel_size); |
if (!kernel_size) { |
error("Empty kernel file\n"); |
return 1; |
@@ -201,6 +224,8 @@ static int Pack(const char* outfile, const char* keyblock_file, |
return 1; |
} |
kernel32_size = kernel_size - kernel32_start; |
+ Debug(" kernel32_start=0x%" PRIx64 "\n", kernel32_start); |
+ Debug(" kernel32_size=0x%" PRIx64 "\n", kernel32_size); |
/* Allocate and zero the blob we need. */ |
blob_size = roundup(kernel32_size, CROS_ALIGN) + |
@@ -208,6 +233,7 @@ static int Pack(const char* outfile, const char* keyblock_file, |
CROS_PARAMS_SIZE + |
roundup(bootloader_size, CROS_ALIGN); |
blob = (uint8_t *)Malloc(blob_size); |
+ Debug("blob_size=0x%" PRIx64 "\n", blob_size); |
if (!blob) { |
error("Couldn't allocate %ld bytes.\n", blob_size); |
return 1; |
@@ -215,13 +241,16 @@ static int Pack(const char* outfile, const char* keyblock_file, |
Memset(blob, 0, blob_size); |
/* Copy the 32-bit kernel. */ |
+ Debug("kernel goes at blob+=0x%" PRIx64 "\n", now); |
if (kernel32_size) |
Memcpy(blob + now, kernel_buf + kernel32_start, kernel32_size); |
now += roundup(now + kernel32_size, CROS_ALIGN); |
+ Debug("config goes at blob+0x%" PRIx64 "\n", now); |
/* Find the load address of the commandline. We'll need it later. */ |
cmdline_addr = CROS_32BIT_ENTRY_ADDR + now + |
find_cmdline_start((char *)config_buf, config_size); |
+ Debug(" cmdline_addr=0x%" PRIx64 "\n", cmdline_addr); |
/* Copy the config. */ |
if (config_size) |
@@ -230,6 +259,7 @@ static int Pack(const char* outfile, const char* keyblock_file, |
/* The zeropage data is next. Overlay the linux_kernel_header onto it, and |
* tweak a few fields. */ |
+ Debug("params goes at blob+=0x%" PRIx64 "\n", now); |
params = (struct linux_kernel_params *)(blob + now); |
Memcpy(&(params->setup_sects), &(lh->setup_sects), |
sizeof(*lh) - offsetof(struct linux_kernel_header, setup_sects)); |
@@ -242,11 +272,15 @@ static int Pack(const char* outfile, const char* keyblock_file, |
/* Finally, append the bootloader. Remember where it will load in |
* memory, too. */ |
+ Debug("bootloader goes at blob+=0x%" PRIx64 "\n", now); |
bootloader_mem_start = CROS_32BIT_ENTRY_ADDR + now; |
bootloader_mem_size = roundup(bootloader_size, CROS_ALIGN); |
+ Debug(" bootloader_mem_start=0x%" PRIx64 "\n", bootloader_mem_start); |
+ Debug(" bootloader_mem_size=0x%" PRIx64 "\n", bootloader_mem_size); |
if (bootloader_size) |
Memcpy(blob + now, bootloader_buf, bootloader_size); |
now += bootloader_mem_size; |
+ Debug("end of blob is 0x%" PRIx64 "\n", now); |
/* Free input buffers */ |
Free(kernel_buf); |
@@ -274,11 +308,15 @@ static int Pack(const char* outfile, const char* keyblock_file, |
} |
/* Write the output file */ |
+ Debug("writing %s...\n", outfile); |
f = fopen(outfile, "wb"); |
if (!f) { |
error("Can't open output file %s\n", outfile); |
return 1; |
} |
+ Debug("0x%" PRIx64 " bytes of key_block\n", key_block_size); |
+ Debug("0x%" PRIx64 " bytes of preamble\n", preamble->preamble_size); |
+ Debug("0x%" PRIx64 " bytes of blob\n", blob_size); |
i = ((1 != fwrite(key_block, key_block_size, 1, f)) || |
(1 != fwrite(preamble, preamble->preamble_size, 1, f)) || |
(1 != fwrite(blob, blob_size, 1, f))); |
@@ -361,11 +399,11 @@ static int Verify(const char* infile, const char* signpubkey) { |
printf(" Header version: %" PRIu32 ".%" PRIu32"\n", |
preamble->header_version_major, preamble->header_version_minor); |
printf(" Kernel version: %" PRIu64 "\n", preamble->kernel_version); |
- printf(" Body load address: %" PRIu64 "\n", preamble->body_load_address); |
- printf(" Body size: %" PRIu64 "\n", |
+ printf(" Body load address: 0x%" PRIx64 "\n", preamble->body_load_address); |
+ printf(" Body size: 0x%" PRIx64 "\n", |
preamble->body_signature.data_size); |
- printf(" Bootloader address: %" PRIu64 "\n", preamble->bootloader_address); |
- printf(" Bootloader size: %" PRIu64 "\n", preamble->bootloader_size); |
+ printf(" Bootloader address: 0x%" PRIx64 "\n", preamble->bootloader_address); |
+ printf(" Bootloader size: 0x%" PRIx64 "\n", preamble->bootloader_size); |
/* Verify body */ |
if (0 != VerifyData(blob + now, &preamble->body_signature, rsa)) { |