aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorMaxime Ripard2015-10-15 14:34:10 +0200
committerTom Rini2015-11-12 13:17:28 -0500
commitbb83c0f35af6a992c21790b21259dbd819f56e35 (patch)
tree7bf934f9c13a4a95effe48f24eb921af07845f03 /common
parent10b69712151203beb774750bafc56c00699c8e58 (diff)
sparse: Move main header parsing to a function of its own
The current sparse image format parser is quite tangled, with a lot of code duplication. Start refactoring it by moving the header parsing function to a function of its own. Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> Reviewed-by: Tom Rini <trini@konsulko.com>
Diffstat (limited to 'common')
-rw-r--r--common/aboot.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/common/aboot.c b/common/aboot.c
index fba8e3e683e..cd1b6a6ac8e 100644
--- a/common/aboot.c
+++ b/common/aboot.c
@@ -41,6 +41,26 @@
#include <part.h>
#include <sparse_format.h>
+static sparse_header_t *sparse_parse_header(void **data)
+{
+ /* Read and skip over sparse image header */
+ sparse_header_t *sparse_header = (sparse_header_t *) *data;
+
+ *data += sparse_header->file_hdr_sz;
+
+ debug("=== Sparse Image Header ===\n");
+ debug("magic: 0x%x\n", sparse_header->magic);
+ debug("major_version: 0x%x\n", sparse_header->major_version);
+ debug("minor_version: 0x%x\n", sparse_header->minor_version);
+ debug("file_hdr_sz: %d\n", sparse_header->file_hdr_sz);
+ debug("chunk_hdr_sz: %d\n", sparse_header->chunk_hdr_sz);
+ debug("blk_sz: %d\n", sparse_header->blk_sz);
+ debug("total_blks: %d\n", sparse_header->total_blks);
+ debug("total_chunks: %d\n", sparse_header->total_chunks);
+
+ return sparse_header;
+}
+
void write_sparse_image(block_dev_desc_t *dev_desc,
disk_partition_t *info, const char *part_name,
void *data, unsigned sz)
@@ -58,29 +78,12 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
uint32_t total_blocks = 0;
int i;
- /* Read and skip over sparse image header */
- sparse_header = (sparse_header_t *) data;
-
- data += sparse_header->file_hdr_sz;
- if (sparse_header->file_hdr_sz > sizeof(sparse_header_t))
- {
- /*
- * Skip the remaining bytes in a header that is longer than
- * we expected.
- */
- data += (sparse_header->file_hdr_sz - sizeof(sparse_header_t));
+ sparse_header = sparse_parse_header(&data);
+ if (!sparse_header) {
+ fastboot_fail("sparse header issue\n");
+ return;
}
- debug("=== Sparse Image Header ===\n");
- debug("magic: 0x%x\n", sparse_header->magic);
- debug("major_version: 0x%x\n", sparse_header->major_version);
- debug("minor_version: 0x%x\n", sparse_header->minor_version);
- debug("file_hdr_sz: %d\n", sparse_header->file_hdr_sz);
- debug("chunk_hdr_sz: %d\n", sparse_header->chunk_hdr_sz);
- debug("blk_sz: %d\n", sparse_header->blk_sz);
- debug("total_blks: %d\n", sparse_header->total_blks);
- debug("total_chunks: %d\n", sparse_header->total_chunks);
-
/* verify sparse_header->blk_sz is an exact multiple of info->blksz */
if (sparse_header->blk_sz !=
(sparse_header->blk_sz & ~(info->blksz - 1))) {