image loading: fix problem with offsets > 0x80000000
authorBradey Honsinger <bradeyh@gmail.com>
Mon, 15 Mar 2010 07:43:41 +0000 (08:43 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 16 Mar 2010 09:11:40 +0000 (10:11 +0100)
Fixes bug that prevented users from specifying a base address of
0x80000000 or higher in image commands (flash write_image, etm image,
xscale trace_image).

image.base_address is an offset from the start address contained in
the image file (if there is one), or from 0 (for binary files). As a
signed 32-bit int, it couldn't be greater than 0x7fffffff, which is a
problem when trying to write a binary file to flash above that
address. Changing it to a 64-bit long long keeps it as a signed
offset, but allows it to cover the entire 32-bit address space.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/flash/nor/tcl.c
src/target/etm.c
src/target/image.h
src/target/xscale.c

index a40230b997271cc1bfc8eca340bcd91e833cec11..38cb65588c3df186c3b9c7d05bd3c8a7ea358d49 100644 (file)
@@ -434,7 +434,7 @@ COMMAND_HANDLER(handle_flash_write_image_command)
        if (CMD_ARGC >= 2)
        {
                image.base_address_set = 1;
-               COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], image.base_address);
+               COMMAND_PARSE_NUMBER(llong, CMD_ARGV[1], image.base_address);
        }
        else
        {
index 10ab72aa2e41c281f4221fcffa53a7d73eeb3608..67dac06fadabb51ed5c16ee102fc113c3700908d 100644 (file)
@@ -1761,7 +1761,7 @@ COMMAND_HANDLER(handle_etm_image_command)
        if (CMD_ARGC >= 2)
        {
                etm_ctx->image->base_address_set = 1;
-               COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], etm_ctx->image->base_address);
+               COMMAND_PARSE_NUMBER(llong, CMD_ARGV[1], etm_ctx->image->base_address);
        }
        else
        {
index e963b3c10a32c817f09fdc25112a5aa719e9e5e4..b096031b02017ba10e0a9b7928ccb2374f129437 100644 (file)
@@ -62,7 +62,7 @@ struct image
        int num_sections;               /* number of sections contained in the image */
        struct imageection *sections;   /* array of sections */
        int base_address_set;   /* whether the image has a base address set (for relocation purposes) */
-       int base_address;               /* base address, if one is set */
+       long long base_address;         /* base address, if one is set */
        int start_address_set;  /* whether the image has a start address (entry point) associated */
        uint32_t start_address;         /* start address, if one is set */
 };
index 50c9595006e9336f08bb30ddd9c57cb91c86ce0a..dd4a7ee622da8c18dd3206c0542f263262d5e496 100644 (file)
@@ -3419,7 +3419,7 @@ COMMAND_HANDLER(xscale_handle_trace_image_command)
        if (CMD_ARGC >= 2)
        {
                xscale->trace.image->base_address_set = 1;
-               COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], xscale->trace.image->base_address);
+               COMMAND_PARSE_NUMBER(llong, CMD_ARGV[1], xscale->trace.image->base_address);
        }
        else
        {