m3dev

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

commit 03aad6688981becb1fcdf492f96df0ee9a70b52b
parent 377df4c3326727764f7401b94db4da8fd97deab1
Author: Brian Swetland <swetland@frotz.net>
Date:   Wed,  5 Aug 2015 14:23:47 -0700

debugger: add wconsole command

Use DebugMonitor exception to send console input to target.

Any debugger commandline starting with / becomes a remote console command.

Diffstat:
Mtools/debugger-commands.c | 30++++++++++++++++++++++++++++++
Mtools/debugger-core.c | 7+++++++
2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/tools/debugger-commands.c b/tools/debugger-commands.c @@ -815,6 +815,35 @@ int do_threads(int argc, param *argv) { return 0; } +int remote_msg(u32 cmd) { + unsigned timeout = 250; + u32 n = 0; + if (swdp_ahb_write(DCRDR, cmd)) return -1; + if (swdp_ahb_read(DEMCR, &n)) return -1; + if (swdp_ahb_write(DEMCR, n | DEMCR_MON_PEND)) return -1; + while (timeout > 0) { + if (swdp_ahb_read(DCRDR, &n)) return -1; + if (!(n & 0x80000000)) return 0; + timeout--; + } + return -1; +} + +int do_wconsole(int argc, param *argv) { + if (argc != 1) return -1; + const char *line = argv[0].s; + while (*line) { + if (remote_msg(0x80000000 | *line)) goto oops; + line++; + } + if (remote_msg(0x80000000 | '\n')) goto oops; + return 0; +oops: + xprintf(XCORE, "console write failed\n"); + return -1; +} + + struct debugger_command debugger_commands[] = { { "exit", "", do_exit, "" }, { "attach", "", do_attach, "attach/reattach to sw-dp" }, @@ -847,6 +876,7 @@ struct debugger_command debugger_commands[] = { { "arch", "", do_setarch, "set architecture for flash agent" }, { "threads", "", do_threads, "thread dump" }, { "text", "", do_text, "dump text" }, + { "wconsole", "", do_wconsole, "write to remote console" }, { "help", "", do_help, "help" }, { 0, 0, 0, 0 }, }; diff --git a/tools/debugger-core.c b/tools/debugger-core.c @@ -449,6 +449,13 @@ int debugger_command(char *line) { unsigned c, n = 0; int r; + while (*line && (*line == ' ')) line++; + + if (*line == '/') { + arg[0].s = line + 1; + return _debugger_exec("wconsole", 1, arg); + } + while ((c = *line)) { if (c <= ' ') { line++;