2
0
mirror of git://git.code.sf.net/p/openocd/code synced 2025-08-16 18:57:55 +10:00

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.

[ Backport from mainline a9abfa7d06 ]

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
David Brownell 2009-11-06 15:10:26 -08:00
parent 7de1c892cd
commit c6ac97cf3b

View File

@ -1040,32 +1040,33 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar
{ {
int retval; int retval;
int enabled; int enabled;
retval = target->type->mmu(target, &enabled); retval = target->type->mmu(target, &enabled);
if (retval != ERROR_OK) if (retval != ERROR_OK)
{ {
return retval; return retval;
} }
if (enabled) if (!enabled) {
{ if (target->working_area_phys_spec) {
if (target->working_area_phys_spec) LOG_DEBUG("MMU disabled, using physical "
{ "address for working memory 0x%08x",
LOG_DEBUG("MMU disabled, using physical address for working memory 0x%08x", (unsigned)target->working_area_phys); (unsigned)target->working_area_phys);
target->working_area = target->working_area_phys; target->working_area = target->working_area_phys;
} else } else {
{ LOG_ERROR("No working memory available. "
LOG_ERROR("No working memory available. Specify -work-area-phys to target."); "Specify -work-area-phys to target.");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
} }
} else } else {
{ if (target->working_area_virt_spec) {
if (target->working_area_virt_spec) LOG_DEBUG("MMU enabled, using virtual "
{ "address for working memory 0x%08x",
LOG_DEBUG("MMU enabled, using virtual address for working memory 0x%08x", (unsigned)target->working_area_virt); (unsigned)target->working_area_virt);
target->working_area = target->working_area_virt; target->working_area = target->working_area_virt;
} else } else {
{ LOG_ERROR("No working memory available. "
LOG_ERROR("No working memory available. Specify -work-area-virt to target."); "Specify -work-area-virt to target.");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
} }
} }