mdebug

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

commit 2158159215595905e6cb3d71e7aef8b349427d52
parent 5713eb68a6e9c3c987256943fcee6cd8c33b7c6c
Author: Brian Swetland <swetland@playground.global>
Date:   Wed, 24 Feb 2016 15:02:03 -0800

flash agents: better error handling

- load agent on set instead of on flash
- list available agents if none or invalid specified

Diffstat:
Mtools/builtins.c | 7+++++++
Mtools/debugger-commands.c | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Mtools/mkbuiltins.c | 7+++++++
3 files changed, 81 insertions(+), 16 deletions(-)

diff --git a/tools/builtins.c b/tools/builtins.c @@ -135,3 +135,10 @@ void *get_builtin_file(const char *name, size_t *sz) { } return NULL; } + +const char *get_builtin_filename(unsigned n) { + if (n >= (sizeof(files)/sizeof(files[0]))) { + return NULL; + } + return files[n].name; +} diff --git a/tools/debugger-commands.c b/tools/debugger-commands.c @@ -435,6 +435,7 @@ int do_help(int argc, param *argv) { } void *get_builtin_file(const char *fn, size_t *sz); +const char *get_builtin_filename(unsigned n); void *load_file(const char *fn, size_t *_sz) { int fd; @@ -592,16 +593,66 @@ void *load_agent(const char *arch, size_t *_sz) { return load_file(name, _sz); } -static char *agent_arch = NULL; +static flash_agent *AGENT = NULL; +static size_t AGENT_sz = 0; +static char *AGENT_arch = NULL; int do_setarch(int argc, param *argv) { + unsigned n; char *x; - if (argc != 1) return -1; - if((x = strdup(argv[0].s))) { - free(agent_arch); - agent_arch = x; + const char *name; + if (argc != 1) { + if (AGENT_arch) { + xprintf(XCORE, "current flash agent is '%s'\n", AGENT_arch); + } else { + xprintf(XCORE, "no flash agent selected\n"); + } +fail_load: + xprintf(XCORE, "error: set architecture with: arch <name> (omit the .bin)\n"); + for (n = 0; (name = get_builtin_filename(n)) != NULL; n++) { + if (strncmp(name, "agent-", 6)) { + continue; + } + xprintf(XCORE, " %s\n", name + 6); + } + goto fail; + } + if ((x = strdup(argv[0].s)) == NULL) { + goto fail; + } + free(AGENT_arch); + free(AGENT); + AGENT_arch = x; + + if ((AGENT = load_agent(AGENT_arch, &AGENT_sz)) == NULL) { + xprintf(XCORE, "error: cannot load flash agent for architecture '%s'\n", AGENT_arch); + goto fail_load; + } + + // sanity check + if ((AGENT_sz < sizeof(flash_agent)) || + (AGENT->magic != AGENT_MAGIC) || + (AGENT->version != AGENT_VERSION)) { + xprintf(XCORE, "error: invalid agent image\n"); + free(AGENT); + AGENT = NULL; + goto fail; } + + xprintf(XCORE, "flash agent '%s' loaded.\n", AGENT_arch); return 0; + +fail: + if (AGENT) { + free(AGENT); + AGENT = NULL; + } + if (AGENT_arch) { + free(AGENT_arch); + AGENT_arch = NULL; + } + AGENT_sz = 0; + return -1; } int invoke(u32 agent, u32 func, u32 r0, u32 r1, u32 r2, u32 r3) { @@ -643,22 +694,24 @@ int invoke(u32 agent, u32 func, u32 r0, u32 r1, u32 r2, u32 r3) { } int run_flash_agent(u32 flashaddr, void *data, size_t data_sz) { - flash_agent *agent = NULL; + u8 buffer[4096]; + flash_agent *agent; size_t agent_sz; - if ((agent = load_agent(agent_arch, &agent_sz)) == NULL) { - xprintf(XCORE, "error: cannot load flash agent for architecture '%s'\n", - agent_arch ? agent_arch : "unknown"); + if (AGENT == NULL) { + xprintf(XCORE, "error: no flash agent selected\n"); xprintf(XCORE, "error: set architecture with: arch <name>\n"); goto fail; } - // sanity check - if ((agent_sz < sizeof(flash_agent)) || - (agent->magic != AGENT_MAGIC) || - (agent->version != AGENT_VERSION)) { - xprintf(XCORE, "error: invalid agent image\n"); + if (AGENT_sz > sizeof(buffer)) { + xprintf(XCORE, "error: flash agent too large\n"); goto fail; } + + memcpy(buffer, AGENT, AGENT_sz); + agent_sz = AGENT_sz; + agent = (void*) buffer; + // replace magic with bkpt instructions agent->magic = 0xbe00be00; @@ -744,11 +797,9 @@ int run_flash_agent(u32 flashaddr, void *data, size_t data_sz) { } } - free(agent); if (data) free(data); return 0; fail: - if (agent) free(agent); if (data) free(data); return -1; } diff --git a/tools/mkbuiltins.c b/tools/mkbuiltins.c @@ -126,6 +126,13 @@ int main(int argc, char **argv) { " }\n" " return NULL;\n" "}\n" +"\n" +"const char *get_builtin_filename(unsigned n) {\n" +" if (n >= (sizeof(files)/sizeof(files[0]))) {\n" +" return NULL;\n" +" }\n" +" return files[n].name;\n" +"}\n" ); return 0;