summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradey Honsinger <bradeyh@gmail.com>2010-03-15 08:43:41 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-03-16 10:11:40 +0100
commitf85ad1e52a499bc98ae9d559157e8adbe8a5ad1f (patch)
treeedbc78edfafb01e2ea30ebf8ace6ddd176fadfe4
parenta540033a71eb0b10bb8de85963781ec1b9c06cf1 (diff)
downloadopenocd_libswd-f85ad1e52a499bc98ae9d559157e8adbe8a5ad1f.tar.gz
openocd_libswd-f85ad1e52a499bc98ae9d559157e8adbe8a5ad1f.tar.bz2
openocd_libswd-f85ad1e52a499bc98ae9d559157e8adbe8a5ad1f.tar.xz
openocd_libswd-f85ad1e52a499bc98ae9d559157e8adbe8a5ad1f.zip
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 <oyvind.harboe@zylin.com>
-rw-r--r--src/flash/nor/tcl.c2
-rw-r--r--src/target/etm.c2
-rw-r--r--src/target/image.h2
-rw-r--r--src/target/xscale.c2
4 files changed, 4 insertions, 4 deletions
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
{