[U-Boot] [PATCH 02/13] sparse: Move main header parsing to a function of its own

Maxime Ripard
2015-08-31T14:46:02Z

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>
---
common/aboot.c | 55 +++++++++++++++++++++++++++++--------------------------
1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/common/aboot.c b/common/aboot.c
index fba8e3e683e7..7f12677d13a1 100644
--- a/common/aboot.c
+++ b/common/aboot.c
@@ -41,35 +41,12 @@
#include <part.h>
#include <sparse_format.h>

-void write_sparse_image(block_dev_desc_t *dev_desc,
- disk_partition_t *info, const char *part_name,
- void *data, unsigned sz)
+static sparse_header_t *sparse_parse_header(void **data)
{
- lbaint_t blk;
- lbaint_t blkcnt;
- lbaint_t blks;
- uint32_t bytes_written = 0;
- unsigned int chunk;
- unsigned int chunk_data_sz;
- uint32_t *fill_buf = NULL;
- uint32_t fill_val;
- sparse_header_t *sparse_header;
- chunk_header_t *chunk_header;
- uint32_t total_blocks = 0;
- int i;
-
/* Read and skip over sparse image header */
- sparse_header = (sparse_header_t *) data;
+ sparse_header_t *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));
- }
+ *data += sparse_header->file_hdr_sz;

debug("=== Sparse Image Header ===\n");
debug("magic: 0x%x\n", sparse_header->magic);
@@ -81,6 +58,32 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
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)
+{
+ lbaint_t blk;
+ lbaint_t blkcnt;
+ lbaint_t blks;
+ uint32_t bytes_written = 0;
+ unsigned int chunk;
+ unsigned int chunk_data_sz;
+ uint32_t *fill_buf = NULL;
+ uint32_t fill_val;
+ sparse_header_t *sparse_header;
+ chunk_header_t *chunk_header;
+ uint32_t total_blocks = 0;
+ int i;
+
+ sparse_header = sparse_parse_header(&data);
+ if (!sparse_header) {
+ fastboot_fail("sparse header issue\n");
+ return;
+ }
+
/* verify sparse_header->blk_sz is an exact multiple of info->blksz */
if (sparse_header->blk_sz !=
(sparse_header->blk_sz & ~(info->blksz - 1))) {
--
2.5.0