mdebug

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit d32671cb9b70d8b5f16334417be4305f624de561
parent 2af38d26b65b706ba19a2023681eda7430ad973f
Author: Brian Swetland <swetland@frotz.net>
Date:   Mon, 20 Jul 2015 16:21:57 -0700

debugger: add "run", tidy up "download"

Diffstat:
Mtools/debugger-commands.c | 117+++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 66 insertions(+), 51 deletions(-)

diff --git a/tools/debugger-commands.c b/tools/debugger-commands.c @@ -313,57 +313,6 @@ int do_db(int argc, param *argv) { return 0; } -int do_download(int argc, param *argv) { - u32 addr; - u8 data[512*1024]; -#if 0 - u8 vrfy[512*1024]; -#endif - int fd, r; - - long long t0, t1; - - if (argc != 2) { - xprintf("error: usage: download <file> <addr>\n"); - return -1; - } - - fd = open(argv[0].s, O_RDONLY); - r = read(fd, data, sizeof(data)); - if ((fd < 0) || (r < 0)) { - xprintf("error: cannot read '%s'\n", argv[0].s); - return -1; - } - r = (r + 3) & ~3; - addr = argv[1].n; - - xprintf("sending %d bytes...\n", r); - t0 = now(); - if (swdp_ahb_write32(addr, (void*) data, r / 4)) { - xprintf("error: failed to write data\n"); - return -1; - } - t1 = now(); - xprintf("%lld uS -> %lld B/s\n", (t1 - t0), - (((long long)r) * 1000000LL) / (t1 - t0)); - -#if 0 - t0 = now(); - if (swdp_ahb_read32(addr, (void*) vrfy, r / 4)) { - xprintf("error: verify read failed\n"); - return -1; - } - t1 = now(); - xprintf("%lld uS. %lld B/s.\n", (t1 - t0), - (((long long)r) * 1000000LL) / (t1 - t0)); - if (memcmp(data,vrfy,r)) { - xprintf("error: verify failed\n"); - return -1; - } -#endif - return 0; -} - // vector catch flags to apply u32 vcflags = DEMCR_VC_HARDERR | DEMCR_VC_BUSERR | DEMCR_VC_STATERR | DEMCR_VC_CHKERR; @@ -474,6 +423,71 @@ fail: return NULL; } +int do_download(int argc, param *argv) { + u32 addr; + void *data; + size_t sz; + long long t0, t1; + + if (argc != 2) { + xprintf("error: usage: download <file> <addr>\n"); + return -1; + } + + if ((data = load_file(argv[0].s, &sz)) == NULL) { + xprintf("error: cannot read '%s'\n", argv[0].s); + return -1; + } + sz = (sz + 3) & ~3; + addr = argv[1].n; + + xprintf("sending %d bytes...\n", sz); + t0 = now(); + if (swdp_ahb_write32(addr, (void*) data, sz / 4)) { + xprintf("error: failed to write data\n"); + free(data); + return -1; + } + t1 = now(); + xprintf("%lld uS -> %lld B/s\n", (t1 - t0), + (((long long)sz) * 1000000LL) / (t1 - t0)); + free(data); + return 0; +} + +int do_run(int argc, param *argv) { + u32 addr; + void *data; + size_t sz; + u32 sp, pc; + if (argc != 2) { + xprintf("error: usage: run <file> <addr>\n"); + return -1; + } + if ((data = load_file(argv[0].s, &sz)) == NULL) { + xprintf("error: cannot read '%s'\n", argv[0].s); + return -1; + } + swdp_core_halt(); + sz = (sz + 3) & ~3; + addr = argv[1].n; + if (swdp_ahb_write32(addr, (void*) data, sz / 4)) { + xprintf("error: failed to write data\n"); + free(data); + return -1; + } + memcpy(&sp, data, 4); + memcpy(&pc, ((char*) data) + 4, 4); + swdp_core_write(13, sp); + swdp_core_write(15, pc); + swdp_ahb_write(0xe000ed0c, 0x05fa0002); + swdp_core_write(16, 0x01000000); + swdp_core_resume(); + free(data); + return 0; +} + + void *load_agent(const char *arch, size_t *_sz) { void *data; size_t sz; @@ -792,6 +806,7 @@ struct debugger_command debugger_commands[] = { { "dr", "", do_dr, "dump register" }, { "wr", "", do_wr, "write register" }, { "download", "", do_download, "download file to device" }, + { "run", "", do_run, "download file and execute it" }, { "flash", "", do_flash, "write file to device flash" }, { "erase", "", do_erase, "erase flash" }, { "reset", "", do_reset, "reset target" },