--- doc/openocd.texi | 9 ++++++--- src/target/target.c | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 11 deletions(-)
diff --git a/doc/openocd.texi b/doc/openocd.texi index 70d789a..1b75f94 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -5731,9 +5731,12 @@ Otherwise, or if the optional @var{phys} flag is specified, @cindex image dumping @anchor{dump_image} -...@deffn Command {dump_image} filename address size -Dump @var{size} bytes of target memory starting at @var{address} to the -binary file named @var{filename}. +...@deffn Command {dump_image} [phys] filename address size +Dump @var{size} bytes of target memory starting at @var{address} to +the binary file named @var{filename}. When the current target has an +MMU which is present and active, @var{addr} is interpreted as a +virtual address. Otherwise, or if the optional @var{phys} flag is +specified, @var{addr} is interpreted as a physical address. @end deffn @deffn Command {fast_load} diff --git a/src/target/target.c b/src/target/target.c index 93efa76..5cc1e6a 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -1393,12 +1393,22 @@ int target_write_buffer(struct target *target, uint32_t address, uint32_t size, * mode respectively, otherwise data is handled as quickly as * possible */ -int target_read_buffer(struct target *target, uint32_t address, uint32_t size, uint8_t *buffer) +static int target_read_buffer2(struct target *target, uint32_t address, uint32_t size, uint8_t *buffer, bool physical) { int retval; LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", (int)size, (unsigned)address); + int (*read_fn)(struct target *target, + uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer); + if (physical) + { + read_fn=target_read_phys_memory; + } else + { + read_fn=target_read_memory; + } + if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -1420,7 +1430,7 @@ int target_read_buffer(struct target *target, uint32_t address, uint32_t size, u if (((address % 2) == 0) && (size == 2)) { - return target_read_memory(target, address, 2, 1, buffer); + return read_fn(target, address, 2, 1, buffer); } /* handle unaligned head bytes */ @@ -1431,7 +1441,7 @@ int target_read_buffer(struct target *target, uint32_t address, uint32_t size, u if (unaligned > size) unaligned = size; - if ((retval = target_read_memory(target, address, 1, unaligned, buffer)) != ERROR_OK) + if ((retval = read_fn(target, address, 1, unaligned, buffer)) != ERROR_OK) return retval; buffer += unaligned; @@ -1444,7 +1454,7 @@ int target_read_buffer(struct target *target, uint32_t address, uint32_t size, u { int aligned = size - (size % 4); - if ((retval = target_read_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK) + if ((retval = read_fn(target, address, 4, aligned / 4, buffer)) != ERROR_OK) return retval; buffer += aligned; @@ -1456,7 +1466,7 @@ int target_read_buffer(struct target *target, uint32_t address, uint32_t size, u if(size >=2) { int aligned = size - (size%2); - retval = target_read_memory(target, address, 2, aligned / 2, buffer); + retval = read_fn(target, address, 2, aligned / 2, buffer); if (retval != ERROR_OK) return retval; @@ -1467,13 +1477,18 @@ int target_read_buffer(struct target *target, uint32_t address, uint32_t size, u /* handle tail writes of less than 4 bytes */ if (size > 0) { - if ((retval = target_read_memory(target, address, 1, size, buffer)) != ERROR_OK) + if ((retval = read_fn(target, address, 1, size, buffer)) != ERROR_OK) return retval; } return ERROR_OK; } +int target_read_buffer(struct target *target, uint32_t address, uint32_t size, uint8_t *buffer) +{ + target_read_buffer2(target, address, size, buffer, false); +} + int target_checksum_memory(struct target *target, uint32_t address, uint32_t size, uint32_t* crc) { uint8_t *buffer; @@ -2605,6 +2620,12 @@ COMMAND_HANDLER(handle_dump_image_command) struct duration bench; struct target *target = get_current_target(CMD_CTX); + bool physical=strcmp(CMD_ARGV[0], "phys")==0; + if (physical) + { + CMD_ARGC--; + CMD_ARGV++; + } if (CMD_ARGC != 3) return ERROR_COMMAND_SYNTAX_ERROR; @@ -2622,7 +2643,7 @@ COMMAND_HANDLER(handle_dump_image_command) { size_t size_written; uint32_t this_run_size = (size > 560) ? 560 : size; - retval = target_read_buffer(target, address, this_run_size, buffer); + retval = target_read_buffer2(target, address, this_run_size, buffer, physical); if (retval != ERROR_OK) { break; @@ -5305,7 +5326,7 @@ static const struct command_registration target_exec_command_handlers[] = { .name = "dump_image", .handler = handle_dump_image_command, .mode = COMMAND_EXEC, - .usage = "filename address size", + .usage = "['phys'] filename address size", }, { .name = "verify_image", -- 1.7.2.3 _______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development