diff --git a/src/target/target.c b/src/target/target.c index 084aea8b6..0dbce9aec 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -3913,6 +3913,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, uint32_t count; uint32_t v; const char *varname; + const char *phys; + bool is_phys; int n, e, retval; uint32_t i; @@ -3921,8 +3923,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, * argv[3] = memory address * argv[4] = count of times to read */ - if (argc != 4) { - Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems"); + if (argc < 4 || argc > 5) { + Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems [phys]"); return JIM_ERR; } varname = Jim_GetString(argv[0], &len); @@ -3941,6 +3943,14 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, len = l; if (e != JIM_OK) return e; + is_phys = false; + if (argc > 4) { + phys = Jim_GetString(argv[4], &n); + if (!strncmp(phys, "phys", n)) + is_phys = true; + else + return JIM_ERR; + } switch (width) { case 8: width = 1; @@ -4006,7 +4016,10 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, if (count > (buffersize / width)) count = (buffersize / width); - retval = target_read_memory(target, addr, width, count, buffer); + if (is_phys) + retval = target_read_phys_memory(target, addr, width, count, buffer); + else + retval = target_read_memory(target, addr, width, count, buffer); if (retval != ERROR_OK) { /* BOO !*/ LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", @@ -4102,6 +4115,8 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, uint32_t count; uint32_t v; const char *varname; + const char *phys; + bool is_phys; int n, e, retval; uint32_t i; @@ -4110,8 +4125,8 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, * argv[3] = memory address * argv[4] = count to write */ - if (argc != 4) { - Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems"); + if (argc < 4 || argc > 5) { + Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems [phys]"); return JIM_ERR; } varname = Jim_GetString(argv[0], &len); @@ -4130,6 +4145,14 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, len = l; if (e != JIM_OK) return e; + is_phys = false; + if (argc > 4) { + phys = Jim_GetString(argv[4], &n); + if (!strncmp(phys, "phys", n)) + is_phys = true; + else + return JIM_ERR; + } switch (width) { case 8: width = 1; @@ -4216,7 +4239,10 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, } len -= count; - retval = target_write_memory(target, addr, width, count, buffer); + if (is_phys) + retval = target_write_phys_memory(target, addr, width, count, buffer); + else + retval = target_write_memory(target, addr, width, count, buffer); if (retval != ERROR_OK) { /* BOO !*/ LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", diff --git a/tcl/memory.tcl b/tcl/memory.tcl index 2719d3fec..83c96d6c9 100644 --- a/tcl/memory.tcl +++ b/tcl/memory.tcl @@ -131,3 +131,57 @@ proc memwrite8 {ADDR DATA} { error "memwrite8: $msg" } } + +proc memread32_phys {ADDR} { + set foo(0) 0 + if ![ catch { mem2array foo 32 $ADDR 1 phys } msg ] { + return $foo(0) + } else { + error "memread32: $msg" + } +} + +proc memread16_phys {ADDR} { + set foo(0) 0 + if ![ catch { mem2array foo 16 $ADDR 1 phys } msg ] { + return $foo(0) + } else { + error "memread16: $msg" + } +} + +proc memread8_phys {ADDR} { + set foo(0) 0 + if ![ catch { mem2array foo 8 $ADDR 1 phys } msg ] { + return $foo(0) + } else { + error "memread8: $msg" + } +} + +proc memwrite32_phys {ADDR DATA} { + set foo(0) $DATA + if ![ catch { array2mem foo 32 $ADDR 1 phys } msg ] { + return $foo(0) + } else { + error "memwrite32: $msg" + } +} + +proc memwrite16_phys {ADDR DATA} { + set foo(0) $DATA + if ![ catch { array2mem foo 16 $ADDR 1 phys } msg ] { + return $foo(0) + } else { + error "memwrite16: $msg" + } +} + +proc memwrite8_phys {ADDR DATA} { + set foo(0) $DATA + if ![ catch { array2mem foo 8 $ADDR 1 phys } msg ] { + return $foo(0) + } else { + error "memwrite8: $msg" + } +}