stlink: add SWO tracing support
[openocd.git] / src / target / cortex_m.h
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2006 by Magnus Lundin *
6 * lundin@mlu.mine.nu *
7 * *
8 * Copyright (C) 2008 by Spencer Oliver *
9 * spen@spen-soft.co.uk *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
20 * *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
25 ***************************************************************************/
26
27 #ifndef CORTEX_M3_H
28 #define CORTEX_M3_H
29
30 #include "armv7m.h"
31
32 #define CORTEX_M3_COMMON_MAGIC 0x1A451A45
33
34 #define SYSTEM_CONTROL_BASE 0x400FE000
35
36 #define ITM_TER 0xE0000E00
37 #define ITM_TPR 0xE0000E40
38 #define ITM_TCR 0xE0000E80
39 #define ITM_LAR 0xE0000FB0
40
41 #define CPUID 0xE000ED00
42 /* Debug Control Block */
43 #define DCB_DHCSR 0xE000EDF0
44 #define DCB_DCRSR 0xE000EDF4
45 #define DCB_DCRDR 0xE000EDF8
46 #define DCB_DEMCR 0xE000EDFC
47
48 #define DCRSR_WnR (1 << 16)
49
50 #define DWT_CTRL 0xE0001000
51 #define DWT_CYCCNT 0xE0001004
52 #define DWT_COMP0 0xE0001020
53 #define DWT_MASK0 0xE0001024
54 #define DWT_FUNCTION0 0xE0001028
55
56 #define FP_CTRL 0xE0002000
57 #define FP_REMAP 0xE0002004
58 #define FP_COMP0 0xE0002008
59 #define FP_COMP1 0xE000200C
60 #define FP_COMP2 0xE0002010
61 #define FP_COMP3 0xE0002014
62 #define FP_COMP4 0xE0002018
63 #define FP_COMP5 0xE000201C
64 #define FP_COMP6 0xE0002020
65 #define FP_COMP7 0xE0002024
66
67 #define FPU_CPACR 0xE000ED88
68 #define FPU_FPCCR 0xE000EF34
69 #define FPU_FPCAR 0xE000EF38
70 #define FPU_FPDSCR 0xE000EF3C
71
72 #define TPI_SSPSR 0xE0040000
73 #define TPI_CSPSR 0xE0040004
74 #define TPI_ACPR 0xE0040010
75 #define TPI_SPPR 0xE00400F0
76 #define TPI_FFSR 0xE0040300
77 #define TPI_FFCR 0xE0040304
78 #define TPI_FSCR 0xE0040308
79
80 /* DCB_DHCSR bit and field definitions */
81 #define DBGKEY (0xA05F << 16)
82 #define C_DEBUGEN (1 << 0)
83 #define C_HALT (1 << 1)
84 #define C_STEP (1 << 2)
85 #define C_MASKINTS (1 << 3)
86 #define S_REGRDY (1 << 16)
87 #define S_HALT (1 << 17)
88 #define S_SLEEP (1 << 18)
89 #define S_LOCKUP (1 << 19)
90 #define S_RETIRE_ST (1 << 24)
91 #define S_RESET_ST (1 << 25)
92
93 /* DCB_DEMCR bit and field definitions */
94 #define TRCENA (1 << 24)
95 #define VC_HARDERR (1 << 10)
96 #define VC_INTERR (1 << 9)
97 #define VC_BUSERR (1 << 8)
98 #define VC_STATERR (1 << 7)
99 #define VC_CHKERR (1 << 6)
100 #define VC_NOCPERR (1 << 5)
101 #define VC_MMERR (1 << 4)
102 #define VC_CORERESET (1 << 0)
103
104 #define NVIC_ICTR 0xE000E004
105 #define NVIC_ISE0 0xE000E100
106 #define NVIC_ICSR 0xE000ED04
107 #define NVIC_AIRCR 0xE000ED0C
108 #define NVIC_SHCSR 0xE000ED24
109 #define NVIC_CFSR 0xE000ED28
110 #define NVIC_MMFSRb 0xE000ED28
111 #define NVIC_BFSRb 0xE000ED29
112 #define NVIC_USFSRh 0xE000ED2A
113 #define NVIC_HFSR 0xE000ED2C
114 #define NVIC_DFSR 0xE000ED30
115 #define NVIC_MMFAR 0xE000ED34
116 #define NVIC_BFAR 0xE000ED38
117
118 /* NVIC_AIRCR bits */
119 #define AIRCR_VECTKEY (0x5FA << 16)
120 #define AIRCR_SYSRESETREQ (1 << 2)
121 #define AIRCR_VECTCLRACTIVE (1 << 1)
122 #define AIRCR_VECTRESET (1 << 0)
123 /* NVIC_SHCSR bits */
124 #define SHCSR_BUSFAULTENA (1 << 17)
125 /* NVIC_DFSR bits */
126 #define DFSR_HALTED 1
127 #define DFSR_BKPT 2
128 #define DFSR_DWTTRAP 4
129 #define DFSR_VCATCH 8
130
131 #define FPCR_CODE 0
132 #define FPCR_LITERAL 1
133 #define FPCR_REPLACE_REMAP (0 << 30)
134 #define FPCR_REPLACE_BKPT_LOW (1 << 30)
135 #define FPCR_REPLACE_BKPT_HIGH (2 << 30)
136 #define FPCR_REPLACE_BKPT_BOTH (3 << 30)
137
138 struct cortex_m3_fp_comparator {
139 int used;
140 int type;
141 uint32_t fpcr_value;
142 uint32_t fpcr_address;
143 };
144
145 struct cortex_m3_dwt_comparator {
146 int used;
147 uint32_t comp;
148 uint32_t mask;
149 uint32_t function;
150 uint32_t dwt_comparator_address;
151 };
152
153 enum cortex_m3_soft_reset_config {
154 CORTEX_M3_RESET_SYSRESETREQ,
155 CORTEX_M3_RESET_VECTRESET,
156 };
157
158 enum cortex_m3_isrmasking_mode {
159 CORTEX_M3_ISRMASK_AUTO,
160 CORTEX_M3_ISRMASK_OFF,
161 CORTEX_M3_ISRMASK_ON,
162 };
163
164 struct cortex_m3_common {
165 int common_magic;
166 struct arm_jtag jtag_info;
167
168 /* Context information */
169 uint32_t dcb_dhcsr;
170 uint32_t nvic_dfsr; /* Debug Fault Status Register - shows reason for debug halt */
171 uint32_t nvic_icsr; /* Interrupt Control State Register - shows active and pending IRQ */
172
173 /* Flash Patch and Breakpoint (FPB) */
174 int fp_num_lit;
175 int fp_num_code;
176 int fp_code_available;
177 int fpb_enabled;
178 int auto_bp_type;
179 struct cortex_m3_fp_comparator *fp_comparator_list;
180
181 /* Data Watchpoint and Trace (DWT) */
182 int dwt_num_comp;
183 int dwt_comp_available;
184 struct cortex_m3_dwt_comparator *dwt_comparator_list;
185 struct reg_cache *dwt_cache;
186
187 enum cortex_m3_soft_reset_config soft_reset_config;
188
189 enum cortex_m3_isrmasking_mode isrmasking_mode;
190
191 struct armv7m_common armv7m;
192 };
193
194 static inline struct cortex_m3_common *
195 target_to_cm3(struct target *target)
196 {
197 return container_of(target->arch_info,
198 struct cortex_m3_common, armv7m);
199 }
200
201 int cortex_m3_examine(struct target *target);
202 int cortex_m3_set_breakpoint(struct target *target, struct breakpoint *breakpoint);
203 int cortex_m3_unset_breakpoint(struct target *target, struct breakpoint *breakpoint);
204 int cortex_m3_add_breakpoint(struct target *target, struct breakpoint *breakpoint);
205 int cortex_m3_remove_breakpoint(struct target *target, struct breakpoint *breakpoint);
206 int cortex_m3_set_watchpoint(struct target *target, struct watchpoint *watchpoint);
207 int cortex_m3_unset_watchpoint(struct target *target, struct watchpoint *watchpoint);
208 int cortex_m3_add_watchpoint(struct target *target, struct watchpoint *watchpoint);
209 int cortex_m3_remove_watchpoint(struct target *target, struct watchpoint *watchpoint);
210 void cortex_m3_enable_breakpoints(struct target *target);
211 void cortex_m3_enable_watchpoints(struct target *target);
212 void cortex_m3_dwt_setup(struct cortex_m3_common *cm3, struct target *target);
213
214 #endif /* CORTEX_M3_H */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)