diff options
author | Sergey A. Borshch <sb-sf@users.sourceforge.net> | 2013-11-22 17:27:40 +0200 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2013-12-17 23:04:01 +0000 |
commit | 5175f8be3318d13931a319885cf6e5560329e324 (patch) | |
tree | 740cefb44dc81f789a29c078fc1639c9c7cf70b7 /src/server | |
parent | 255301fb507519b5cd022cfdb465d4963d186c5a (diff) | |
download | riscv-openocd-5175f8be3318d13931a319885cf6e5560329e324.zip riscv-openocd-5175f8be3318d13931a319885cf6e5560329e324.tar.gz riscv-openocd-5175f8be3318d13931a319885cf6e5560329e324.tar.bz2 |
fix flash bank auto_probe() fail with multiple targets
get_flash_bank_by_addr() iterates through all flash banks
trying to auto_probe() every bank, even if bank can belongs to
target other than requested, and this other target can be
in non-halted state, which leads to error message and
operation abort.
Same situation in gdb_new_connection() and gdb_memory_map():
get_flash_bank_by_num() tries to auto_probe() requested bank,
so first get bank by get_flash_bank_by_num_noprobe(), check
if it belongs to current connection's target and skip
get_flash_bank_by_num() (actually autoprobing) if not.
Change-Id: I48b3f93dddcd9283394f14ad2de3248397c75ab3
Signed-off-by: Sergey A. Borshch <sb-sf@users.sourceforge.net>
Reviewed-on: http://openocd.zylin.com/1813
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/gdb_server.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index c578780..28cb3ab 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -957,6 +957,9 @@ static int gdb_new_connection(struct connection *connection) int i; for (i = 0; i < flash_get_bank_count(); i++) { struct flash_bank *p; + p = get_flash_bank_by_num_noprobe(i); + if (p->target != gdb_service->target) + continue; retval = get_flash_bank_by_num(i, &p); if (retval != ERROR_OK) { LOG_ERROR("Connect failed. Consider setting up a gdb-attach event for the target " \ @@ -1732,14 +1735,16 @@ static int gdb_memory_map(struct connection *connection, banks = malloc(sizeof(struct flash_bank *)*flash_get_bank_count()); for (i = 0; i < flash_get_bank_count(); i++) { + p = get_flash_bank_by_num_noprobe(i); + if (p->target != target) + continue; retval = get_flash_bank_by_num(i, &p); if (retval != ERROR_OK) { free(banks); gdb_error(connection, retval); return retval; } - if (p->target == target) - banks[target_flash_banks++] = p; + banks[target_flash_banks++] = p; } qsort(banks, target_flash_banks, sizeof(struct flash_bank *), |