From: Spencer Oliver Date: Thu, 4 Oct 2012 21:40:59 +0000 (+0000) Subject: Revert "target: remove unused working area 'user' field" X-Git-Tag: v0.7.0-rc1~206 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=cbfc443c7b8582631d389bd1932334487f9a1576 Revert "target: remove unused working area 'user' field" This reverts commit 63a23e6fc862b94f00e0833ab474bd02901a019f Change-Id: I62778fb3b1dabc6470d582bea9ca64d593999233 Signed-off-by: Spencer Oliver Change-Id: Iaf5a2cf5bdc4a62ba68ad9403e1c1229112970de Reviewed-on: http://openocd.zylin.com/899 Tested-by: jenkins Reviewed-by: Andreas Fritiofson Reviewed-by: Freddie Chopin --- diff --git a/src/target/target.c b/src/target/target.c index c71c536030..b8e4c2ff9e 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 a610cd0343..9707bcc93a 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; };