commit 7a543b60f89a8a22b89485a57cbb58c45f6070fc
parent a39f3c4121238004adebf3e114914960af4d994c
Author: Brian Swetland <swetland@frotz.net>
Date:   Wed, 24 Jun 2015 01:14:24 -0700
gdb-bridge: check romtable for presence of DWT and FBP units
Diffstat:
1 file changed, 29 insertions(+), 6 deletions(-)
diff --git a/tools/gdb-bridge.c b/tools/gdb-bridge.c
@@ -363,6 +363,13 @@ void write_memory(u32 addr, unsigned char *data, int len) {
 	}
 }
 
+// bit 1 in each romtable entry indicates peripheral is present
+#define ROMTAB_DWT	0xE00FF004
+#define ROMTAB_FPB	0xE00FF008
+#define ROMTAB_ITM	0xE00FF00C
+#define ROMTAB_TPIU	0xE00FF010
+#define ROMTAB_ETM	0xE00FF014
+
 #define DWT_CTRL	0xE0001000
 
 #define FP_CTRL		0xE0002000
@@ -382,11 +389,19 @@ static u32 bp_state[MAXBP] = { 0, };
 int handle_flashpatch(int add, u32 addr, u32 kind) {
 	u32 x;
 	int n;
-	if (swdp_ahb_read(FP_CTRL, &x)) {
-		zprintf("GDB: cannot read flashpatch ctrl\n");
+	if (swdp_ahb_read(ROMTAB_FPB, &x)) {
+		zprintf("GDB: cannot read romtable\n");
 		return -1;
 	}
-	n = ((x & 0xF0) >> 4) | ((x & 0x7000) >> 4);
+	if (x & 1) {
+		if (swdp_ahb_read(FP_CTRL, &x)) {
+			zprintf("GDB: cannot read flashpatch ctrl\n");
+			return -1;
+		}
+		n = ((x & 0xF0) >> 4) | ((x & 0x7000) >> 4);
+	} else {
+		n = 0;
+	}
 	if (n != maxfp) {
 		zprintf("GDB: %d flashpatch breakpoint registers\n", n);
 		if (n > 16) n = 16;
@@ -440,11 +455,19 @@ int handle_breakpoint(int add, u32 addr, u32 kind) {
 	if ((addr < 0x20000000) && (!handle_flashpatch(add,addr,kind))) {
 		return 0;
 	}
-	if (swdp_ahb_read(DWT_CTRL, &x)) {
-		zprintf("GDB: cannot read dwt ctrl\n");
+	if (swdp_ahb_read(ROMTAB_DWT, &x)) {
+		zprintf("GDB: cannot read romtable\n");
 		return -1;
 	}
-	n = x >> 28;
+	if (x & 1) {
+		if (swdp_ahb_read(DWT_CTRL, &x)) {
+			zprintf("GDB: cannot read dwt ctrl\n");
+			return -1;
+		}
+		n = x >> 28;
+	} else {
+		n = 0;
+	}
 	if (n != maxbp) {
 		zprintf("GDB: %d dwt breakpoint registers\n", n);
 		if (maxbp != 0) {