aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFreddie Chopin <freddie.chopin@gmail.com>2012-10-02 08:59:47 +0200
committerSpencer Oliver <spen@spen-soft.co.uk>2012-10-02 08:44:14 +0000
commitf254667a13872ffd8a5a8a238c8963abc004e13d (patch)
tree9c83513d220a23a0b20ae76d0c56af108ef69e99
parent370d02b85725e1a366c9675ca9da053f41011a94 (diff)
Revert "target: remove unused working area 'user' field"
This reverts commit 63a23e6fc862b94f00e0833ab474bd02901a019f, which causes problems with various flash drivers (i.e. LPC1xxx/LPC2xxx) due to working area handling. Change-Id: I291ff2ac4f1eef7ecd553d0eb8895b790beb38c3 Signed-off-by: Freddie Chopin <freddie.chopin@gmail.com> Reviewed-on: http://openocd.zylin.com/872 Reviewed-by: Øyvind Harboe <oyvindharboe@gmail.com> Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
-rw-r--r--src/target/target.c14
-rw-r--r--src/target/target.h1
2 files changed, 15 insertions, 0 deletions
diff --git a/src/target/target.c b/src/target/target.c
index c71c5360..b8e4c2ff 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1405,6 +1405,7 @@ static void target_split_working_area(struct working_area *area, uint32_t size)
new_wa->size = area->size - size;
new_wa->address = area->address + size;
new_wa->backup = NULL;
+ new_wa->user = NULL;
new_wa->free = true;
area->next = new_wa;
@@ -1493,6 +1494,7 @@ int target_alloc_working_area_try(struct target *target, uint32_t size, struct w
new_wa->size = target->working_area_size & ~3UL; /* 4-byte align */
new_wa->address = target->working_area;
new_wa->backup = NULL;
+ new_wa->user = NULL;
new_wa->free = true;
}
@@ -1536,6 +1538,9 @@ int target_alloc_working_area_try(struct target *target, uint32_t size, struct w
c->free = false;
*area = c;
+ /* user pointer */
+ c->user = area;
+
print_wa_layout(target);
return ERROR_OK;
@@ -1586,6 +1591,13 @@ static int target_free_working_area_restore(struct target *target, struct workin
LOG_DEBUG("freed %"PRIu32" bytes of working area at address 0x%08"PRIx32,
area->size, area->address);
+ /* mark user pointer invalid */
+ /* TODO: Is this really safe? It points to some previous caller's memory.
+ * How could we know that the area pointer is still in that place and not
+ * some other vital data? What's the purpose of this, anyway? */
+ *area->user = NULL;
+ area->user = NULL;
+
target_merge_working_areas(target);
print_wa_layout(target);
@@ -1613,6 +1625,8 @@ static void target_free_all_working_areas_restore(struct target *target, int res
if (restore)
target_restore_working_area(target, c);
c->free = true;
+ *c->user = NULL; /* Same as above */
+ c->user = NULL;
}
c = c->next;
}
diff --git a/src/target/target.h b/src/target/target.h
index a610cd03..9707bcc9 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -95,6 +95,7 @@ struct working_area {
uint32_t size;
bool free;
uint8_t *backup;
+ struct working_area **user;
struct working_area *next;
};