X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=55fc2c8237ead31961d1a83aa5583bbcb2e5aeb9;hp=336a7f71dc1a876a7379da2d8fcb11de1fb96616;hb=98788d7a75b4321c96845a8fbf814f254a6cf153;hpb=0a1356c9ccff42e2c41af3a3c0ae8b1330aa970b diff --git a/src/target/target.c b/src/target/target.c index 336a7f71dc..55fc2c8237 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -496,7 +496,13 @@ static int default_virt2phys(struct target_s *target, uint32_t virtual, uint32_t 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; } @@ -741,6 +747,36 @@ int target_mcr(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, u 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) { @@ -769,12 +805,12 @@ 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) @@ -804,6 +840,10 @@ int target_init(struct command_context_s *cmd_ctx) { target->type->mmu = default_mmu; } + if (target->type->has_mmu == NULL) + { + target->type->has_mmu = default_has_mmu; + } target = target->next; } @@ -1045,13 +1085,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 +1136,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 +1152,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; @@ -2932,7 +2988,8 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char break; default: - command_print(cmd_ctx, "usage: wp
[r/w/a] [value] [mask]"); + command_print(cmd_ctx, "usage: wp [address length " + "[(r|w|a) [value [mask]]]]"); return ERROR_COMMAND_SYNTAX_ERROR; } @@ -3763,6 +3820,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 +3838,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; @@ -4824,8 +4883,6 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv) 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);