mdebug

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Mtools/gdb-bridge.c | 35+++++++++++++++++++++++++++++------
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) {