This is an automated email from Gerrit.

Freddie Chopin (freddie.cho...@gmail.com) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/872

-- gerrit

commit f13d2dbf5bc0f9dcdd6e0073652a4530585b4ded
Author: Freddie Chopin <freddie.cho...@gmail.com>
Date:   Tue Oct 2 08:59:47 2012 +0200

    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.cho...@gmail.com>

diff --git a/src/target/target.c b/src/target/target.c
index c71c536..b8e4c2f 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 a610cd0..9707bcc 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;
 };
 

-- 

------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to