From 2bceb42bb7622ec7e0fd9bc8a8014dbd9d1e5d99 Mon Sep 17 00:00:00 2001 From: Daniel Beer Date: Wed, 6 Jan 2010 11:49:30 +1300 Subject: [PATCH] Commands now make use of symbol table. --- main.c | 93 +++++++++++++++++++++++++++++++++++++++++----------------- stab.c | 2 +- stab.h | 2 +- 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/main.c b/main.c index 7277704..c10c018 100644 --- a/main.c +++ b/main.c @@ -127,21 +127,25 @@ static int cmd_md(char **arg) { char *off_text = get_arg(arg); char *len_text = get_arg(arg); - unsigned int offset = 0; - unsigned int length = 0; + int offset = 0; + int length = 0x40; if (!off_text) { fprintf(stderr, "md: offset must be specified\n"); return -1; } - sscanf(off_text, "%x", &offset); - if (len_text) - sscanf(len_text, "%x", &length); - else - length = 0x80; - if (offset >= 0x10000 || length > 0x10000 || - (offset + length) > 0x10000) { + if (stab_parse(off_text, &offset) < 0) { + fprintf(stderr, "md: can't parse offset: %s\n", off_text); + return -1; + } + + if (len_text && stab_parse(len_text, &length) < 0) { + fprintf(stderr, "md: can't parse length: %s\n", len_text); + return -1; + } + + if (offset < 0 || length <= 0 || (offset + length) > 0x10000) { fprintf(stderr, "md: memory out of range\n"); return -1; } @@ -163,11 +167,23 @@ static int cmd_md(char **arg) static void disassemble(u_int16_t offset, u_int8_t *data, int length) { + int first_line = 1; + while (length) { struct msp430_instruction insn; int retval; int count; int i; + u_int16_t oboff = offset; + const char *obname; + + if (stab_find(&oboff, &obname) >= 0) { + if (!oboff) + printf("%s:\n", obname); + else if (first_line) + printf("%s+0x%x:\n", obname, oboff); + } + first_line = 0; retval = dis_decode(data, offset, length, &insn); count = retval > 0 ? retval : 2; @@ -202,8 +218,8 @@ static int cmd_dis(char **arg) { char *off_text = get_arg(arg); char *len_text = get_arg(arg); - unsigned int offset = 0; - unsigned int length = 0; + int offset = 0; + int length = 0x40; u_int8_t buf[128]; if (!off_text) { @@ -211,12 +227,17 @@ static int cmd_dis(char **arg) return -1; } - sscanf(off_text, "%x", &offset); - if (len_text) - sscanf(len_text, "%x", &length); - else - length = 0x40; - if (offset >= 0x10000 || length > sizeof(buf) || + if (stab_parse(off_text, &offset) < 0) { + fprintf(stderr, "dis: can't parse offset: %s\n", off_text); + return -1; + } + + if (len_text && stab_parse(len_text, &length) < 0) { + fprintf(stderr, "dis: can't parse length: %s\n", len_text); + return -1; + } + + if (offset < 0 || length <= 0 || length > sizeof(buf) || (offset + length) > 0x10000) { fprintf(stderr, "dis: memory out of range\n"); return -1; @@ -256,9 +277,14 @@ static int cmd_run(char **arg) char *bp_text = get_arg(arg); if (bp_text) { - unsigned int addr = 0; + int addr = 0; + + if (stab_parse(bp_text, &addr) < 0) { + fprintf(stderr, "run: can't parse breakpoint: %s\n", + bp_text); + return -1; + } - sscanf(bp_text, "%x", &addr); fet_break(0, addr); } else { fet_break(0, 0); @@ -289,7 +315,7 @@ static int cmd_set(char **arg) char *reg_text = get_arg(arg); char *val_text = get_arg(arg); int reg; - unsigned int value = 0; + int value = 0; u_int16_t regs[FET_NUM_REGS]; if (!(reg_text && val_text)) { @@ -300,7 +326,11 @@ static int cmd_set(char **arg) while (*reg_text && !isdigit(*reg_text)) reg_text++; reg = atoi(reg_text); - sscanf(val_text, "%x", &value); + + if (stab_parse(val_text, &value) < 0) { + fprintf(stderr, "set: can't parse value: %s\n", val_text); + return -1; + } if (reg < 0 || reg >= FET_NUM_REGS) { fprintf(stderr, "set: register out of range: %d\n", reg); @@ -418,12 +448,16 @@ static int cmd_prog(char **arg) } prog_init(); - if (elf32_check(in)) + + if (elf32_check(in)) { result = elf32_extract(in, prog_feed); - else if (ihex_check(in)) + stab_clear(); + elf32_syms(in); + } else if (ihex_check(in)) { result = ihex_extract(in, prog_feed); - else + } else { fprintf(stderr, "%s: unknown file type\n", *arg); + } if (!result) result = prog_flush(); @@ -440,7 +474,8 @@ static int cmd_nosyms(char **arg) static int cmd_eval(char **arg) { - u_int16_t addr; + int addr; + u_int16_t offset; const char *name; if (stab_parse(*arg, &addr) < 0) { @@ -449,8 +484,12 @@ static int cmd_eval(char **arg) } printf("%04x", addr); - if (!stab_find(&addr, &name)) - printf(" = %s+%x", name, addr); + offset = addr; + if (!stab_find(&offset, &name)) { + printf(" = %s", name); + if (offset) + printf("+0x%x", offset); + } printf("\n"); return 0; diff --git a/stab.c b/stab.c index 717c4dd..665d719 100644 --- a/stab.c +++ b/stab.c @@ -215,7 +215,7 @@ static void token_add(void) token_sum += token_mult * strtol(token_buf, NULL, 16); } -int stab_parse(const char *text, u_int16_t *addr) +int stab_parse(const char *text, int *addr) { token_len = 0; token_mult = 1; diff --git a/stab.h b/stab.h index cc04e33..8b7a8ef 100644 --- a/stab.h +++ b/stab.h @@ -49,7 +49,7 @@ int stab_add_symbol(int name, u_int16_t addr); * * Returns 0 if parsed successfully, -1 if an error occurs. */ -int stab_parse(const char *text, u_int16_t *addr); +int stab_parse(const char *text, int *addr); /* Take an address and find the nearest symbol. */ int stab_find(u_int16_t *addr, const char **name);