From f85ad1e52a499bc98ae9d559157e8adbe8a5ad1f Mon Sep 17 00:00:00 2001
From: Bradey Honsinger <bradeyh@gmail.com>
Date: Mon, 15 Mar 2010 08:43:41 +0100
Subject: image loading: fix problem with offsets > 0x80000000
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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/target/etm.c    | 2 +-
 src/target/image.h  | 2 +-
 src/target/xscale.c | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

(limited to 'src/target')

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
 	{
-- 
cgit v1.2.3