summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2009-11-06 14:57:21 -0800
committerDavid Brownell <dbrownell@users.sourceforge.net>2009-11-06 14:57:21 -0800
commita9abfa7d06dbcfded97b7fb41f50d3581c24fbae (patch)
treeafceee0eaaed488c5760a6a4c56ab6b7c018ba93
parent6a0af06bd9f66780d2c3e9f69c40f2b89ad90605 (diff)
downloadopenocd+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.c33
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;
}
}