static int default_mmu(struct target_s *target, int *enabled)
{
- *enabled = 0;
+ LOG_ERROR("Not implemented.");
+ return ERROR_FAIL;
+}
+
+static int default_has_mmu(struct target_s *target, bool *has_mmu)
+{
+ *has_mmu = true;
return ERROR_OK;
}
return target->type->mcr(target, cpnum, op1, op2, CRn, CRm, value);
}
+static int default_read_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+{
+ int retval;
+ bool mmu;
+ retval = target->type->has_mmu(target, &mmu);
+ if (retval != ERROR_OK)
+ return retval;
+ if (mmu)
+ {
+ LOG_ERROR("Not implemented");
+ return ERROR_FAIL;
+ }
+ return target_read_memory(target, address, size, count, buffer);
+}
+
+static int default_write_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
+{
+ int retval;
+ bool mmu;
+ retval = target->type->has_mmu(target, &mmu);
+ if (retval != ERROR_OK)
+ return retval;
+ if (mmu)
+ {
+ LOG_ERROR("Not implemented");
+ return ERROR_FAIL;
+ }
+ return target_write_memory(target, address, size, count, buffer);
+}
+
int target_init(struct command_context_s *cmd_ctx)
{
if (target->type->read_phys_memory == NULL)
{
- target->type->read_phys_memory = target->type->read_memory;
+ target->type->read_phys_memory = default_read_phys_memory;
}
if (target->type->write_phys_memory == NULL)
{
- target->type->write_phys_memory = target->type->write_memory;
+ target->type->write_phys_memory = default_write_phys_memory;
}
if (target->type->mcr == NULL)
{
target->type->mmu = default_mmu;
}
+ if (target->type->has_mmu == NULL)
+ {
+ target->type->has_mmu = default_has_mmu;
+ }
target = target->next;
}
{
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;
+ }
}
}
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)
{
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;
break;
default:
- command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
+ command_print(cmd_ctx, "usage: wp [address length "
+ "[(r|w|a) [value [mask]]]]");
return ERROR_COMMAND_SYNTAX_ERROR;
}
return e;
}
target->working_area_virt = w;
+ target->working_area_virt_spec = true;
} else {
if (goi->argc != 0) {
goto no_params;
return e;
}
target->working_area_phys = w;
+ target->working_area_phys_spec = true;
} else {
if (goi->argc != 0) {
goto no_params;
value = 0;
- LOG_DEBUG("%d %d %d %d %d %d", cpnum, op1, op2, CRn, CRm, value);
-
if (argc == 7)
{
e = Jim_GetLong(interp, argv[6], &l);