diff options
author | Tomas Vanek <vanekt@fbl.cz> | 2018-02-27 09:44:07 +0100 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2018-05-08 15:21:49 -0700 |
commit | 5a591c98579a098cda1b57bbcb9c0f3b693f820d (patch) | |
tree | 1eb3d19c25938b85b1214fca2b270ef603bee783 /src/server | |
parent | 3c7fd99832e1926cf657fde3a569661c95a950e6 (diff) | |
download | riscv-openocd-5a591c98579a098cda1b57bbcb9c0f3b693f820d.zip riscv-openocd-5a591c98579a098cda1b57bbcb9c0f3b693f820d.tar.gz riscv-openocd-5a591c98579a098cda1b57bbcb9c0f3b693f820d.tar.bz2 |
gdb_server: gdb_memory_map() rework
Use sector sizes instead of bank size.
Detect a gap between sectors and emit xml blocks accordingly.
Detect sector overflow over the bank size.
Change-Id: If0e0e44b0c3b93067b4d717c9c7b07c08582e57b
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/4436
Tested-by: jenkins
Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/gdb_server.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index ca9da15..81dc32d 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -1806,7 +1806,7 @@ static int gdb_memory_map(struct connection *connection, int offset; int length; char *separator; - uint32_t ram_start = 0; + target_addr_t ram_start = 0; int i; int target_flash_banks = 0; @@ -1821,9 +1821,6 @@ static int gdb_memory_map(struct connection *connection, /* Sort banks in ascending order. We need to report non-flash * memory as ram (or rather read/write) by default for GDB, since * it has no concept of non-cacheable read/write memory (i/o etc). - * - * FIXME Most non-flash addresses are *NOT* RAM! Don't lie. - * Current versions of GDB assume unlisted addresses are RAM... */ banks = malloc(sizeof(struct flash_bank *)*flash_get_bank_count()); @@ -1846,14 +1843,13 @@ static int gdb_memory_map(struct connection *connection, for (i = 0; i < target_flash_banks; i++) { int j; unsigned sector_size = 0; - uint32_t start; + unsigned group_len = 0; p = banks[i]; - start = p->base; if (ram_start < p->base) xml_printf(&retval, &xml, &pos, &size, - "<memory type=\"ram\" start=\"0x%x\" " + "<memory type=\"ram\" start=\"" TARGET_ADDR_FMT "\" " "length=\"0x%x\"/>\n", ram_start, p->base - ram_start); @@ -1864,27 +1860,35 @@ static int gdb_memory_map(struct connection *connection, * regions with 8KB, 32KB, and 64KB sectors; etc. */ for (j = 0; j < p->num_sectors; j++) { - unsigned group_len; /* Maybe start a new group of sectors. */ if (sector_size == 0) { + if (p->sectors[j].offset + p->sectors[j].size > p->size) { + LOG_WARNING("The flash sector at offset 0x%08" PRIx32 + " overflows the end of %s bank.", + p->sectors[j].offset, p->name); + LOG_WARNING("The rest of bank will not show in gdb memory map."); + break; + } + target_addr_t start; start = p->base + p->sectors[j].offset; xml_printf(&retval, &xml, &pos, &size, "<memory type=\"flash\" " - "start=\"0x%x\" ", + "start=\"" TARGET_ADDR_FMT "\" ", start); sector_size = p->sectors[j].size; + group_len = sector_size; + } else { + group_len += sector_size; /* equal to p->sectors[j].size */ } /* Does this finish a group of sectors? * If not, continue an already-started group. */ - if (j == p->num_sectors - 1) - group_len = (p->base + p->size) - start; - else if (p->sectors[j + 1].size != sector_size) - group_len = p->base + p->sectors[j + 1].offset - - start; - else + if (j < p->num_sectors - 1 + && p->sectors[j + 1].size == sector_size + && p->sectors[j + 1].offset == p->sectors[j].offset + sector_size + && p->sectors[j + 1].offset + p->sectors[j + 1].size <= p->size) continue; xml_printf(&retval, &xml, &pos, &size, @@ -1902,7 +1906,7 @@ static int gdb_memory_map(struct connection *connection, if (ram_start != 0) xml_printf(&retval, &xml, &pos, &size, - "<memory type=\"ram\" start=\"0x%x\" " + "<memory type=\"ram\" start=\"" TARGET_ADDR_FMT "\" " "length=\"0x%x\"/>\n", ram_start, 0-ram_start); /* ELSE a flash chip could be at the very end of the 32 bit address @@ -1910,11 +1914,11 @@ static int gdb_memory_map(struct connection *connection, */ free(banks); - banks = NULL; xml_printf(&retval, &xml, &pos, &size, "</memory-map>\n"); if (retval != ERROR_OK) { + free(xml); gdb_error(connection, retval); return retval; } |