summaryrefslogtreecommitdiff
path: root/futility/dump_kernel_config_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'futility/dump_kernel_config_lib.c')
-rw-r--r--futility/dump_kernel_config_lib.c195
1 files changed, 99 insertions, 96 deletions
diff --git a/futility/dump_kernel_config_lib.c b/futility/dump_kernel_config_lib.c
index 63c2899f..d3e88a96 100644
--- a/futility/dump_kernel_config_lib.c
+++ b/futility/dump_kernel_config_lib.c
@@ -14,106 +14,109 @@
#include "vboot_api.h"
#include "vboot_host.h"
-static uint8_t* GetKernelConfig(uint8_t* blob, size_t blob_size,
- uint64_t kernel_body_load_address) {
-
- VbKeyBlockHeader* key_block;
- VbKernelPreambleHeader* preamble;
- uint32_t now = 0;
- uint32_t offset = 0;
-
- /* Skip the key block */
- key_block = (VbKeyBlockHeader*)blob;
- now += key_block->key_block_size;
- if (now + blob > blob + blob_size) {
- VbExError("key_block_size advances past the end of the blob\n");
- return NULL;
- }
-
- /* Open up the preamble */
- preamble = (VbKernelPreambleHeader*)(blob + now);
- now += preamble->preamble_size;
- if (now + blob > blob + blob_size) {
- VbExError("preamble_size advances past the end of the blob\n");
- return NULL;
- }
-
- /* Read body_load_address from preamble if no kernel_body_load_address */
- if (kernel_body_load_address == USE_PREAMBLE_LOAD_ADDR)
- kernel_body_load_address = preamble->body_load_address;
-
- /* The x86 kernels have a pointer to the kernel commandline in the zeropage
- * table, but that's irrelevant for ARM. Both types keep the config blob in
- * the same place, so just go find it. */
- offset = preamble->bootloader_address -
- (kernel_body_load_address + CROS_PARAMS_SIZE +
- CROS_CONFIG_SIZE) + now;
- if (offset > blob_size) {
- VbExError("params are outside of the memory blob: %x\n", offset);
- return NULL;
- }
- return blob + offset;
-}
+static uint8_t *GetKernelConfig(uint8_t * blob, size_t blob_size,
+ uint64_t kernel_body_load_address)
+{
-static void* MMapFile(const char* filename, size_t *size) {
- FILE* f;
- uint8_t* buf;
- long file_size = 0;
-
- f = fopen(filename, "rb");
- if (!f) {
- VBDEBUG(("Unable to open file %s\n", filename));
- return NULL;
- }
-
- fseek(f, 0, SEEK_END);
- file_size = ftell(f);
- rewind(f);
-
- if (file_size <= 0) {
- fclose(f);
- return NULL;
- }
- *size = (size_t) file_size;
-
- /* Uses a host primitive as this is not meant for firmware use. */
- buf = mmap(NULL, *size, PROT_READ, MAP_PRIVATE, fileno(f), 0);
- if (buf == MAP_FAILED) {
- VbExError("Failed to mmap the file %s\n", filename);
- fclose(f);
- return NULL;
- }
-
- fclose(f);
- return buf;
+ VbKeyBlockHeader *key_block;
+ VbKernelPreambleHeader *preamble;
+ uint32_t now = 0;
+ uint32_t offset = 0;
+
+ /* Skip the key block */
+ key_block = (VbKeyBlockHeader *) blob;
+ now += key_block->key_block_size;
+ if (now + blob > blob + blob_size) {
+ VbExError("key_block_size advances past the end of the blob\n");
+ return NULL;
+ }
+
+ /* Open up the preamble */
+ preamble = (VbKernelPreambleHeader *) (blob + now);
+ now += preamble->preamble_size;
+ if (now + blob > blob + blob_size) {
+ VbExError("preamble_size advances past the end of the blob\n");
+ return NULL;
+ }
+
+ /* Read body_load_address from preamble if no
+ * kernel_body_load_address */
+ if (kernel_body_load_address == USE_PREAMBLE_LOAD_ADDR)
+ kernel_body_load_address = preamble->body_load_address;
+
+ /* The x86 kernels have a pointer to the kernel commandline in the
+ * zeropage table, but that's irrelevant for ARM. Both types keep the
+ * config blob in the same place, so just go find it. */
+ offset = preamble->bootloader_address -
+ (kernel_body_load_address + CROS_PARAMS_SIZE +
+ CROS_CONFIG_SIZE) + now;
+ if (offset > blob_size) {
+ VbExError("params are outside of the memory blob: %x\n",
+ offset);
+ return NULL;
+ }
+ return blob + offset;
}
+static void *MMapFile(const char *filename, size_t * size)
+{
+ FILE *f;
+ uint8_t *buf;
+ long file_size = 0;
+
+ f = fopen(filename, "rb");
+ if (!f) {
+ VBDEBUG(("Unable to open file %s\n", filename));
+ return NULL;
+ }
+
+ fseek(f, 0, SEEK_END);
+ file_size = ftell(f);
+ rewind(f);
+
+ if (file_size <= 0) {
+ fclose(f);
+ return NULL;
+ }
+ *size = (size_t) file_size;
+
+ /* Uses a host primitive as this is not meant for firmware use. */
+ buf = mmap(NULL, *size, PROT_READ, MAP_PRIVATE, fileno(f), 0);
+ if (buf == MAP_FAILED) {
+ VbExError("Failed to mmap the file %s\n", filename);
+ fclose(f);
+ return NULL;
+ }
+
+ fclose(f);
+ return buf;
+}
char *FindKernelConfig(const char *infile, uint64_t kernel_body_load_address)
{
- uint8_t* blob;
- size_t blob_size;
- uint8_t *config = NULL;
- char *newstr = NULL;
-
- blob = MMapFile(infile, &blob_size);
- if (!blob) {
- VbExError("Error reading input file\n");
- return 0;
- }
-
- config = GetKernelConfig(blob, blob_size, kernel_body_load_address);
- if (!config) {
- VbExError("Error parsing input file\n");
- munmap(blob, blob_size);
- return 0;
- }
-
- newstr = strndup((char *)config, CROS_CONFIG_SIZE);
- if (!newstr)
- VbExError("Can't allocate new string\n");
-
- munmap(blob, blob_size);
-
- return newstr;
+ uint8_t *blob;
+ size_t blob_size;
+ uint8_t *config = NULL;
+ char *newstr = NULL;
+
+ blob = MMapFile(infile, &blob_size);
+ if (!blob) {
+ VbExError("Error reading input file\n");
+ return 0;
+ }
+
+ config = GetKernelConfig(blob, blob_size, kernel_body_load_address);
+ if (!config) {
+ VbExError("Error parsing input file\n");
+ munmap(blob, blob_size);
+ return 0;
+ }
+
+ newstr = strndup((char *)config, CROS_CONFIG_SIZE);
+ if (!newstr)
+ VbExError("Can't allocate new string\n");
+
+ munmap(blob, blob_size);
+
+ return newstr;
}