Revert "target: remove unused working area 'user' field"
authorSpencer Oliver <spen@spen-soft.co.uk>
Thu, 4 Oct 2012 21:40:59 +0000 (21:40 +0000)
committerFreddie Chopin <freddie.chopin@gmail.com>
Sun, 7 Oct 2012 13:26:58 +0000 (13:26 +0000)
This reverts commit 63a23e6fc862b94f00e0833ab474bd02901a019f

Change-Id: I62778fb3b1dabc6470d582bea9ca64d593999233
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Change-Id: Iaf5a2cf5bdc4a62ba68ad9403e1c1229112970de
Reviewed-on: http://openocd.zylin.com/899
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-by: Freddie Chopin <freddie.chopin@gmail.com>
src/target/target.c
src/target/target.h

index c71c536030f867ea980835e4abeeabebbb0316b6..b8e4c2ff9ed937dc0720b2f98634a3c6923aa074 100644 (file)
@@ -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;
        }
index a610cd034380d9e8bd9e4a07d99d4e0f18ceb5d1..9707bcc93ad152a0c5c6469363c1374c56649c66 100644 (file)
@@ -95,6 +95,7 @@ struct working_area {
        uint32_t size;
        bool free;
        uint8_t *backup;
+       struct working_area **user;
        struct working_area *next;
 };