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:
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" },