diff options
author | David Brownell <dbrownell@users.sourceforge.net> | 2009-11-06 14:57:21 -0800 |
---|---|---|
committer | David Brownell <dbrownell@users.sourceforge.net> | 2009-11-06 14:57:21 -0800 |
commit | a9abfa7d06dbcfded97b7fb41f50d3581c24fbae (patch) | |
tree | afceee0eaaed488c5760a6a4c56ab6b7c018ba93 | |
parent | 6a0af06bd9f66780d2c3e9f69c40f2b89ad90605 (diff) | |
download | openocd_libswd-a9abfa7d06dbcfded97b7fb41f50d3581c24fbae.tar.gz openocd_libswd-a9abfa7d06dbcfded97b7fb41f50d3581c24fbae.tar.bz2 openocd_libswd-a9abfa7d06dbcfded97b7fb41f50d3581c24fbae.tar.xz openocd_libswd-a9abfa7d06dbcfded97b7fb41f50d3581c24fbae.zip |
target: don't swap MMU/no-MMU work areas
Resolve serious bug inserted by the "target: require working
area for physical/virtual addresses to be specified" patch.
It forced use of (invalid) virtual addresses when the MMU
was disabled, and vice versa.
Observed to break at least Cortex-M3, ARM926, ARM7TDMI whenever
work areas are used, such as during bulk writes to flash, DDR2,
SRAM, and so on.
Also, fix overlong lines and whitespace goofs.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
-rw-r--r-- | src/target/target.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/src/target/target.c b/src/target/target.c index b5c473b2..5eec09c8 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -1115,32 +1115,33 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar { int retval; int enabled; + retval = target->type->mmu(target, &enabled); if (retval != ERROR_OK) { return retval; } - if (enabled) - { - if (target->working_area_phys_spec) - { - LOG_DEBUG("MMU disabled, using physical address for working memory 0x%08x", (unsigned)target->working_area_phys); + if (!enabled) { + 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."); + } else { + LOG_ERROR("No working memory available. " + "Specify -work-area-phys to target."); return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; } - } else - { - if (target->working_area_virt_spec) - { - LOG_DEBUG("MMU enabled, using virtual address for working memory 0x%08x", (unsigned)target->working_area_virt); + } else { + 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."); + } else { + LOG_ERROR("No working memory available. " + "Specify -work-area-virt to target."); return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; } } |