+ if ((retval = gdb_error(connection, retval)) != ERROR_OK)
+ return retval;
+ }
+
+ return ERROR_OK;
+ }
+ }
+ else if (strstr(packet, "qSupported"))
+ {
+ /* we currently support packet size and qXfer:memory-map:read (if enabled)
+ * disable qXfer:features:read for the moment */
+ int retval = ERROR_OK;
+ char *buffer = NULL;
+ int pos = 0;
+ int size = 0;
+
+ xml_printf(&retval, &buffer, &pos, &size,
+ "PacketSize=%x;qXfer:memory-map:read%c;qXfer:features:read-;QStartNoAckMode+",
+ (GDB_BUFFER_SIZE - 1), ((gdb_use_memory_map == 1)&&(flash_get_bank_count()>0)) ? '+' : '-');
+
+ if (retval != ERROR_OK)
+ {
+ gdb_send_error(connection, 01);
+ return ERROR_OK;
+ }
+
+ gdb_put_packet(connection, buffer, strlen(buffer));
+ free(buffer);
+
+ return ERROR_OK;
+ }
+ else if (strstr(packet, "qXfer:memory-map:read::")&&(flash_get_bank_count()>0))
+ {
+ /* We get away with only specifying flash here. Regions that are not
+ * specified are treated as if we provided no memory map(if not we
+ * could detect the holes and mark them as RAM).
+ * Normally we only execute this code once, but no big deal if we
+ * have to regenerate it a couple of times. */
+
+ flash_bank_t *p;
+ char *xml = NULL;
+ int size = 0;
+ int pos = 0;
+ int retval = ERROR_OK;
+
+ int offset;
+ int length;
+ char *separator;
+ int blocksize;
+
+ /* skip command character */
+ packet += 23;
+
+ offset = strtoul(packet, &separator, 16);
+ length = strtoul(separator + 1, &separator, 16);
+
+ xml_printf(&retval, &xml, &pos, &size, "<memory-map>\n");
+
+ /*
+ sort banks in ascending order, we need to make non-flash memory be ram(or rather
+ read/write) by default for GDB.
+ GDB does not have a concept of non-cacheable read/write memory.
+ */
+ flash_bank_t **banks=malloc(sizeof(flash_bank_t *)*flash_get_bank_count());
+ int i;
+
+ for (i=0; i<flash_get_bank_count(); i++)
+ {
+ p = get_flash_bank_by_num(i);
+ if (p == NULL)
+ {
+ free(banks);
+ retval = ERROR_FAIL;
+ gdb_send_error(connection, retval);
+ return retval;
+ }
+ banks[i]=p;
+ }
+
+ qsort(banks, flash_get_bank_count(), sizeof(flash_bank_t *), compare_bank);
+
+ u32 ram_start=0;
+ for (i=0; i<flash_get_bank_count(); i++)
+ {
+ p = banks[i];
+
+ if (ram_start<p->base)
+ {
+ xml_printf(&retval, &xml, &pos, &size, "<memory type=\"ram\" start=\"0x%x\" length=\"0x%x\"/>\n",
+ ram_start, p->base-ram_start);