From: Bradey Honsinger Date: Mon, 15 Mar 2010 07:43:41 +0000 (+0100) Subject: image loading: fix problem with offsets > 0x80000000 X-Git-Tag: v0.5.0-rc1~844 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f85ad1e52a499bc98ae9d559157e8adbe8a5ad1f;p=openocd image loading: fix problem with offsets > 0x80000000 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 --- diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index a40230b9..38cb6558 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -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 { diff --git a/src/target/etm.c b/src/target/etm.c index 10ab72aa..67dac06f 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -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 { diff --git a/src/target/image.h b/src/target/image.h index e963b3c1..b096031b 100644 --- a/src/target/image.h +++ b/src/target/image.h @@ -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 */ }; diff --git a/src/target/xscale.c b/src/target/xscale.c index 50c95950..dd4a7ee6 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -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 {