target: require working area for physical/virtual addresses to be specified
authorØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 2 Nov 2009 10:10:09 +0000 (11:10 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 3 Nov 2009 10:56:05 +0000 (11:56 +0100)
Fixed bug: if virtual address for working memory was not specified
and MMU was enabled, then address 0 would be used.

Require working address to be specified for both MMU enabled
and disabled case.

For some completely inexplicable reason this fixes the regression
in svn 2646 for flash write in arm926ejs target. The logs showed
that MMU was disabled in the case below:

https://lists.berlios.de/pipermail/openocd-development/2009-November/011882.html

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/target/target.c
src/target/target.h

index 99b3d183d33557a1bb5dc172c3f475efd2b52ede..9289d37b825a75df2c35ae4d3c45f88c6033e5c1 100644 (file)
@@ -1045,13 +1045,29 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
                {
                        return retval;
                }
+
                if (enabled)
                {
-                       target->working_area = target->working_area_virt;
-               }
-               else
+                       if (target->working_area_phys_spec)
+                       {
+                               LOG_DEBUG("MMU disabled, using physical address for working memory 0x%08x", (unsigned)target->working_area_phys);
+                               target->working_area = target->working_area_phys;
+                       } else
+                       {
+                               LOG_ERROR("No working memory available. Specify -work-area-phys to target.");
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
+               } else
                {
-                       target->working_area = target->working_area_phys;
+                       if (target->working_area_virt_spec)
+                       {
+                               LOG_DEBUG("MMU enabled, using virtual address for working memory 0x%08x", (unsigned)target->working_area_virt);
+                               target->working_area = target->working_area_virt;
+                       } else
+                       {
+                               LOG_ERROR("No working memory available. Specify -work-area-virt to target.");
+                               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+                       }
                }
        }
 
@@ -1080,8 +1096,6 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
                uint32_t first_free = target->working_area;
                uint32_t free_size = target->working_area_size;
 
-               LOG_DEBUG("allocating new working area");
-
                c = target->working_areas;
                while (c)
                {
@@ -1098,6 +1112,8 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
                        return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
                }
 
+               LOG_DEBUG("allocated new working area at address 0x%08x", (unsigned)first_free);
+
                new_wa = malloc(sizeof(working_area_t));
                new_wa->next = NULL;
                new_wa->size = size;
@@ -3763,6 +3779,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
                                        return e;
                                }
                                target->working_area_virt = w;
+                               target->working_area_virt_spec = true;
                        } else {
                                if (goi->argc != 0) {
                                        goto no_params;
@@ -3780,6 +3797,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target)
                                        return e;
                                }
                                target->working_area_phys = w;
+                               target->working_area_phys_spec = true;
                        } else {
                                if (goi->argc != 0) {
                                        goto no_params;
index ef578378df7942e943a344cc22e5933ed7945fac..c971f18bd64f7a6cb744d88b679c54313de5e866 100644 (file)
@@ -128,9 +128,11 @@ typedef struct target_s
        int reset_halt;                                         /* attempt resetting the CPU into the halted mode? */
        uint32_t working_area;                                  /* working area (initialized RAM). Evaluated
                                                                                 * upon first allocation from virtual/physical address. */
-       uint32_t working_area_virt;                             /* virtual address */
-       uint32_t working_area_phys;                             /* physical address */
-       uint32_t working_area_size;                             /* size in bytes */
+       bool working_area_virt_spec;            /* virtual address specified? */
+       uint32_t working_area_virt;                     /* virtual address */
+       bool working_area_phys_spec;            /* virtual address specified? */
+       uint32_t working_area_phys;                     /* physical address */
+       uint32_t working_area_size;                     /* size in bytes */
        uint32_t backup_working_area;                   /* whether the content of the working area has to be preserved */
        struct working_area_s *working_areas;/* list of allocated working areas */
        enum target_debug_reason debug_reason;/* reason why the target entered debug state */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)