commit 3cf4bda1f2d6435e59fab3d7c03dcdf91edb9a50
parent 8aa34f58b7bb640435ba6d15189d9d3a301d2d03
Author: Brian Swetland <swetland@frotz.net>
Date: Sun, 28 Jun 2015 06:51:06 -0700
arm-v7m: add DWT regs, fix some typos
Diffstat:
2 files changed, 69 insertions(+), 22 deletions(-)
diff --git a/tools/arm-v7m.h b/tools/arm-v7m.h
@@ -2,10 +2,10 @@
#define _ARM_V7M_H_
// ---- debug registers -----------------
-#define DHCSR 0xE00EDF0 // Debug Halting Ctrl/Stat
-#define DCRSR 0xE00EDF4 // Debug Core Reg Select
-#define DCRDR 0xE00EDF8 // Debug Core Reg Data
-#define DEMCR 0xE00EDFC // Debug Exception & Monitor Ctrl
+#define DHCSR 0xE000EDF0 // Debug Halting Ctrl/Stat
+#define DCRSR 0xE000EDF4 // Debug Core Reg Select
+#define DCRDR 0xE000EDF8 // Debug Core Reg Data
+#define DEMCR 0xE000EDFC // Debug Exception & Monitor Ctrl
#define DHCSR_DBGKEY 0xA05F0000
#define DHCSR_S_RESET_ST (1 << 25) // CPU Reset Since Last Read (CoR)
@@ -86,5 +86,61 @@
#define HFSR_ALL 0xC0000002 // all fault bits
+// ---- Data Watchpoint and Trace --------
+#define DWT_CTRL 0xE0001000 // Control Register
+#define DWT_CYCCNT 0xE0001004 // Cycle Count Register
+#define DWT_CPICNT 0xE0001008 // CPI Count Register
+#define DWT_EXCCNT 0xE000100C // Exception Overhead Count Register
+#define DWT_SLEEPCNT 0xE0001010 // Sleep Count Register
+#define DWT_LSUCNT 0xE0001014 // LSU Count Register
+#define DWT_FOLDCNT 0xE0001018 // Folded Instruction Count Register
+#define DWT_PCSR 0xE000101C // Program Counter Sample Register
+#define DWT_COMP(n) (0xE0001020 + (n) * 0x10)
+#define DWT_MASK(n) (0xE0001024 + (n) * 0x10)
+#define DWT_FUNC(n) (0xE0001028 + (n) * 0x10)
+
+// ---- DWT_CTRL bits ---------
+#define DWT_CYCCNTENA (1 << 0) // Enable Cycle Counter
+#define DWT_POSTPRESET(n) (((n) & 15) << 1)
+#define DWT_POSTINIT(n) (((n) & 15) << 5)
+#define DWT_CYCTAP (1 << 9) // 0: POSTCNT tap at CYCCNT[6], 1: at [10]
+#define DWT_SYNCTAP_DISABLE (0 << 10)
+#define DWT_SYNCTAP_BIT24 (1 << 10)
+#define DWT_SYNCTAP_BIT26 (2 << 10)
+#define DWT_SYNCTAP_BIT28 (3 << 10)
+#define DWT_PCSAMPLENA (1 << 12) // Enable POSTCNT as timer for PC Sample Pkts
+#define DWT_EXCTRCENA (1 << 16) // Enable Exception Trace
+#define DWT_CPIEVTENA (1 << 17) // Enable CPI Counter Overflow Events
+#define DWT_EXCEVTENA (1 << 18) // Enable Exception Overhead Counter Ovf Evt
+#define DWT_SLEEPEVTENA (1 << 19) // Enable Sleep Counter Ovf Evt
+#define DWT_LSUEVTENA (1 << 20) // Enable LSU Counter Ovf Evt
+#define DWT_FOLDEVTENA (1 << 21) // Enable Folded Instruction Counter Ovf Evt
+#define DWT_CYCEVTENA (1 << 22) // Enable POSTCNT Undererflow Packets
+#define DWT_NOPRFCNT (1 << 24) // 1: No Profiling Counters
+#define DWT_NOCYCCNT (1 << 25) // 1: No Cycle Counter
+#define DWT_NOEXTTRIG (1 << 26) // 1: No External Match Signals
+#define DWT_NOTRCPKT (1 << 27) // 1: No Trace Sampling and Exception Tracing
+#define DWT_NUMCOMP(v) ((v) >> 28)
+
+// ---- DWT_FUNC(n) bits ------
+
+#define DWT_FN_DISABLED 0x0
+
+#define DWT_FN_WATCH_PC 0x4
+#define DWT_FN_WATCH_RD 0x5
+#define DWT_FN_WATCH_WR 0x6
+#define DWT_FN_WATCH_RW 0x7
+
+#define DWT_EMITRANGE (1 << 5) // 1: Enable Data Trace Address Packet Gen
+#define DWT_CYCMATCH (1 << 7) // 1: Cycle Count Comparison (only for COMP0)
+#define DWT_DATAVMATCH (1 << 8) // 0: Address Comparison 1: Value Comparison
+#define DWT_LNK1ENA (1 << 9) // RO: 1: Linked Comparator Supported
+#define DWT_DATAVSIZE_BYTE (0 << 10)
+#define DWT_DATAVSIZE_HALF (1 << 10)
+#define DWT_DATAVSIZE_WORD (2 << 10)
+#define DWT_DATAVADDR0(n) (((n) & 15) << 12)
+#define DWT_DATAVADDR1(n) (((n) & 15) << 16)
+#define DWT_MATCHED (1 << 24) // Matched since last read. Cleared on read.
+
#endif
diff --git a/tools/rswdp.c b/tools/rswdp.c
@@ -25,6 +25,7 @@
#include <fw/types.h>
#include <protocol/rswdp.h>
#include "rswdp.h"
+#include "arm-v7m.h"
static volatile int ATTN;
@@ -461,16 +462,6 @@ int swdp_core_resume(void) {
return swdp_ahb_write(CDBG_CSR, CDBG_CSR_KEY | CDBG_C_DEBUGEN);
}
-#define DWT_COMP(n) (0xE0001020 + (n) * 0x10)
-#define DWT_MASK(n) (0xE0001024 + (n) * 0x10)
-#define DWT_FUNC(n) (0xE0001028 + (n) * 0x10)
-
-#define FUNC_DISABLED 0x0
-#define FUNC_WATCH_PC 0x4
-#define FUNC_WATCH_RD 0x5
-#define FUNC_WATCH_WR 0x6
-#define FUNC_WATCH_RW 0x7
-
int swdp_watchpoint(unsigned n, u32 addr, u32 func) {
struct txn t;
@@ -479,9 +470,9 @@ int swdp_watchpoint(unsigned n, u32 addr, u32 func) {
q_init(&t);
/* enable DWT, enable all exception traps */
- q_ahb_write(&t, CDBG_EMCR, 0x010007F1);
- q_ahb_write(&t, DWT_FUNC(n), FUNC_DISABLED);
- if (func != FUNC_DISABLED) {
+ q_ahb_write(&t, DEMCR, DEMCR_TRCENA | DEMCR_VC_CORERESET);
+ q_ahb_write(&t, DWT_FUNC(n), DWT_FN_DISABLED);
+ if (func != DWT_FN_DISABLED) {
q_ahb_write(&t, DWT_COMP(n), addr);
q_ahb_write(&t, DWT_MASK(n), 0);
q_ahb_write(&t, DWT_FUNC(n), func);
@@ -490,23 +481,23 @@ int swdp_watchpoint(unsigned n, u32 addr, u32 func) {
}
int swdp_watchpoint_pc(unsigned n, u32 addr) {
- return swdp_watchpoint(n, addr, FUNC_WATCH_PC);
+ return swdp_watchpoint(n, addr, DWT_FN_WATCH_PC);
}
int swdp_watchpoint_rd(unsigned n, u32 addr) {
- return swdp_watchpoint(n, addr, FUNC_WATCH_RD);
+ return swdp_watchpoint(n, addr, DWT_FN_WATCH_RD);
}
int swdp_watchpoint_wr(unsigned n, u32 addr) {
- return swdp_watchpoint(n, addr, FUNC_WATCH_WR);
+ return swdp_watchpoint(n, addr, DWT_FN_WATCH_WR);
}
int swdp_watchpoint_rw(unsigned n, u32 addr) {
- return swdp_watchpoint(n, addr, FUNC_WATCH_RW);
+ return swdp_watchpoint(n, addr, DWT_FN_WATCH_RW);
}
int swdp_watchpoint_disable(unsigned n) {
- return swdp_watchpoint(n, 0, FUNC_DISABLED);
+ return swdp_watchpoint(n, 0, DWT_FN_DISABLED);
}
int swdp_bootloader(void) {