cb18075a2fbfd8da4999d59ac288c2bfa5d2973a
[openocd.git] / src / target / openrisc / or1k.c
1 /***************************************************************************
2 * Copyright (C) 2011 by Julius Baxter *
3 * julius@opencores.org *
4 * *
5 * Copyright (C) 2013 by Marek Czerski *
6 * ma.czerski@gmail.com *
7 * *
8 * Copyright (C) 2013 by Franck Jullien *
9 * elec4fun@gmail.com *
10 * *
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 * This program is distributed in the hope that it will be useful, *
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
20 * GNU General Public License for more details. *
21 ***************************************************************************/
22
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <jtag/jtag.h>
28 #include <target/register.h>
29 #include <target/target.h>
30 #include <target/breakpoints.h>
31 #include <target/target_type.h>
32 #include <helper/fileio.h>
33 #include "or1k_tap.h"
34 #include "or1k.h"
35 #include "or1k_du.h"
36
37 LIST_HEAD(tap_list);
38 LIST_HEAD(du_list);
39
40 static int or1k_remove_breakpoint(struct target *target,
41 struct breakpoint *breakpoint);
42
43 static int or1k_read_core_reg(struct target *target, int num);
44 static int or1k_write_core_reg(struct target *target, int num);
45
46 static struct or1k_core_reg *or1k_core_reg_list_arch_info;
47
48 static const struct or1k_core_reg_init or1k_init_reg_list[] = {
49 {"r0" , GROUP0 + 1024, "org.gnu.gdb.or1k.group0", NULL},
50 {"r1" , GROUP0 + 1025, "org.gnu.gdb.or1k.group0", NULL},
51 {"r2" , GROUP0 + 1026, "org.gnu.gdb.or1k.group0", NULL},
52 {"r3" , GROUP0 + 1027, "org.gnu.gdb.or1k.group0", NULL},
53 {"r4" , GROUP0 + 1028, "org.gnu.gdb.or1k.group0", NULL},
54 {"r5" , GROUP0 + 1029, "org.gnu.gdb.or1k.group0", NULL},
55 {"r6" , GROUP0 + 1030, "org.gnu.gdb.or1k.group0", NULL},
56 {"r7" , GROUP0 + 1031, "org.gnu.gdb.or1k.group0", NULL},
57 {"r8" , GROUP0 + 1032, "org.gnu.gdb.or1k.group0", NULL},
58 {"r9" , GROUP0 + 1033, "org.gnu.gdb.or1k.group0", NULL},
59 {"r10" , GROUP0 + 1034, "org.gnu.gdb.or1k.group0", NULL},
60 {"r11" , GROUP0 + 1035, "org.gnu.gdb.or1k.group0", NULL},
61 {"r12" , GROUP0 + 1036, "org.gnu.gdb.or1k.group0", NULL},
62 {"r13" , GROUP0 + 1037, "org.gnu.gdb.or1k.group0", NULL},
63 {"r14" , GROUP0 + 1038, "org.gnu.gdb.or1k.group0", NULL},
64 {"r15" , GROUP0 + 1039, "org.gnu.gdb.or1k.group0", NULL},
65 {"r16" , GROUP0 + 1040, "org.gnu.gdb.or1k.group0", NULL},
66 {"r17" , GROUP0 + 1041, "org.gnu.gdb.or1k.group0", NULL},
67 {"r18" , GROUP0 + 1042, "org.gnu.gdb.or1k.group0", NULL},
68 {"r19" , GROUP0 + 1043, "org.gnu.gdb.or1k.group0", NULL},
69 {"r20" , GROUP0 + 1044, "org.gnu.gdb.or1k.group0", NULL},
70 {"r21" , GROUP0 + 1045, "org.gnu.gdb.or1k.group0", NULL},
71 {"r22" , GROUP0 + 1046, "org.gnu.gdb.or1k.group0", NULL},
72 {"r23" , GROUP0 + 1047, "org.gnu.gdb.or1k.group0", NULL},
73 {"r24" , GROUP0 + 1048, "org.gnu.gdb.or1k.group0", NULL},
74 {"r25" , GROUP0 + 1049, "org.gnu.gdb.or1k.group0", NULL},
75 {"r26" , GROUP0 + 1050, "org.gnu.gdb.or1k.group0", NULL},
76 {"r27" , GROUP0 + 1051, "org.gnu.gdb.or1k.group0", NULL},
77 {"r28" , GROUP0 + 1052, "org.gnu.gdb.or1k.group0", NULL},
78 {"r29" , GROUP0 + 1053, "org.gnu.gdb.or1k.group0", NULL},
79 {"r30" , GROUP0 + 1054, "org.gnu.gdb.or1k.group0", NULL},
80 {"r31" , GROUP0 + 1055, "org.gnu.gdb.or1k.group0", NULL},
81 {"ppc" , GROUP0 + 18, "org.gnu.gdb.or1k.group0", NULL},
82 {"npc" , GROUP0 + 16, "org.gnu.gdb.or1k.group0", NULL},
83 {"sr" , GROUP0 + 17, "org.gnu.gdb.or1k.group0", NULL},
84 {"vr" , GROUP0 + 0, "org.gnu.gdb.or1k.group0", "system"},
85 {"upr" , GROUP0 + 1, "org.gnu.gdb.or1k.group0", "system"},
86 {"cpucfgr" , GROUP0 + 2, "org.gnu.gdb.or1k.group0", "system"},
87 {"dmmucfgr" , GROUP0 + 3, "org.gnu.gdb.or1k.group0", "system"},
88 {"immucfgr" , GROUP0 + 4, "org.gnu.gdb.or1k.group0", "system"},
89 {"dccfgr" , GROUP0 + 5, "org.gnu.gdb.or1k.group0", "system"},
90 {"iccfgr" , GROUP0 + 6, "org.gnu.gdb.or1k.group0", "system"},
91 {"dcfgr" , GROUP0 + 7, "org.gnu.gdb.or1k.group0", "system"},
92 {"pccfgr" , GROUP0 + 8, "org.gnu.gdb.or1k.group0", "system"},
93 {"fpcsr" , GROUP0 + 20, "org.gnu.gdb.or1k.group0", "system"},
94 {"epcr0" , GROUP0 + 32, "org.gnu.gdb.or1k.group0", "system"},
95 {"epcr1" , GROUP0 + 33, "org.gnu.gdb.or1k.group0", "system"},
96 {"epcr2" , GROUP0 + 34, "org.gnu.gdb.or1k.group0", "system"},
97 {"epcr3" , GROUP0 + 35, "org.gnu.gdb.or1k.group0", "system"},
98 {"epcr4" , GROUP0 + 36, "org.gnu.gdb.or1k.group0", "system"},
99 {"epcr5" , GROUP0 + 37, "org.gnu.gdb.or1k.group0", "system"},
100 {"epcr6" , GROUP0 + 38, "org.gnu.gdb.or1k.group0", "system"},
101 {"epcr7" , GROUP0 + 39, "org.gnu.gdb.or1k.group0", "system"},
102 {"epcr8" , GROUP0 + 40, "org.gnu.gdb.or1k.group0", "system"},
103 {"epcr9" , GROUP0 + 41, "org.gnu.gdb.or1k.group0", "system"},
104 {"epcr10" , GROUP0 + 42, "org.gnu.gdb.or1k.group0", "system"},
105 {"epcr11" , GROUP0 + 43, "org.gnu.gdb.or1k.group0", "system"},
106 {"epcr12" , GROUP0 + 44, "org.gnu.gdb.or1k.group0", "system"},
107 {"epcr13" , GROUP0 + 45, "org.gnu.gdb.or1k.group0", "system"},
108 {"epcr14" , GROUP0 + 46, "org.gnu.gdb.or1k.group0", "system"},
109 {"epcr15" , GROUP0 + 47, "org.gnu.gdb.or1k.group0", "system"},
110 {"eear0" , GROUP0 + 48, "org.gnu.gdb.or1k.group0", "system"},
111 {"eear1" , GROUP0 + 49, "org.gnu.gdb.or1k.group0", "system"},
112 {"eear2" , GROUP0 + 50, "org.gnu.gdb.or1k.group0", "system"},
113 {"eear3" , GROUP0 + 51, "org.gnu.gdb.or1k.group0", "system"},
114 {"eear4" , GROUP0 + 52, "org.gnu.gdb.or1k.group0", "system"},
115 {"eear5" , GROUP0 + 53, "org.gnu.gdb.or1k.group0", "system"},
116 {"eear6" , GROUP0 + 54, "org.gnu.gdb.or1k.group0", "system"},
117 {"eear7" , GROUP0 + 55, "org.gnu.gdb.or1k.group0", "system"},
118 {"eear8" , GROUP0 + 56, "org.gnu.gdb.or1k.group0", "system"},
119 {"eear9" , GROUP0 + 57, "org.gnu.gdb.or1k.group0", "system"},
120 {"eear10" , GROUP0 + 58, "org.gnu.gdb.or1k.group0", "system"},
121 {"eear11" , GROUP0 + 59, "org.gnu.gdb.or1k.group0", "system"},
122 {"eear12" , GROUP0 + 60, "org.gnu.gdb.or1k.group0", "system"},
123 {"eear13" , GROUP0 + 61, "org.gnu.gdb.or1k.group0", "system"},
124 {"eear14" , GROUP0 + 62, "org.gnu.gdb.or1k.group0", "system"},
125 {"eear15" , GROUP0 + 63, "org.gnu.gdb.or1k.group0", "system"},
126 {"esr0" , GROUP0 + 64, "org.gnu.gdb.or1k.group0", "system"},
127 {"esr1" , GROUP0 + 65, "org.gnu.gdb.or1k.group0", "system"},
128 {"esr2" , GROUP0 + 66, "org.gnu.gdb.or1k.group0", "system"},
129 {"esr3" , GROUP0 + 67, "org.gnu.gdb.or1k.group0", "system"},
130 {"esr4" , GROUP0 + 68, "org.gnu.gdb.or1k.group0", "system"},
131 {"esr5" , GROUP0 + 69, "org.gnu.gdb.or1k.group0", "system"},
132 {"esr6" , GROUP0 + 70, "org.gnu.gdb.or1k.group0", "system"},
133 {"esr7" , GROUP0 + 71, "org.gnu.gdb.or1k.group0", "system"},
134 {"esr8" , GROUP0 + 72, "org.gnu.gdb.or1k.group0", "system"},
135 {"esr9" , GROUP0 + 73, "org.gnu.gdb.or1k.group0", "system"},
136 {"esr10" , GROUP0 + 74, "org.gnu.gdb.or1k.group0", "system"},
137 {"esr11" , GROUP0 + 75, "org.gnu.gdb.or1k.group0", "system"},
138 {"esr12" , GROUP0 + 76, "org.gnu.gdb.or1k.group0", "system"},
139 {"esr13" , GROUP0 + 77, "org.gnu.gdb.or1k.group0", "system"},
140 {"esr14" , GROUP0 + 78, "org.gnu.gdb.or1k.group0", "system"},
141 {"esr15" , GROUP0 + 79, "org.gnu.gdb.or1k.group0", "system"},
142
143 {"dmmuucr" , GROUP1 + 0, "org.gnu.gdb.or1k.group1", "dmmu"},
144 {"dmmuupr" , GROUP1 + 1, "org.gnu.gdb.or1k.group1", "dmmu"},
145 {"dtlbeir" , GROUP1 + 2, "org.gnu.gdb.or1k.group1", "dmmu"},
146 {"datbmr0" , GROUP1 + 4, "org.gnu.gdb.or1k.group1", "dmmu"},
147 {"datbmr1" , GROUP1 + 5, "org.gnu.gdb.or1k.group1", "dmmu"},
148 {"datbmr2" , GROUP1 + 6, "org.gnu.gdb.or1k.group1", "dmmu"},
149 {"datbmr3" , GROUP1 + 7, "org.gnu.gdb.or1k.group1", "dmmu"},
150 {"datbtr0" , GROUP1 + 8, "org.gnu.gdb.or1k.group1", "dmmu"},
151 {"datbtr1" , GROUP1 + 9, "org.gnu.gdb.or1k.group1", "dmmu"},
152 {"datbtr2" , GROUP1 + 10, "org.gnu.gdb.or1k.group1", "dmmu"},
153 {"datbtr3" , GROUP1 + 11, "org.gnu.gdb.or1k.group1", "dmmu"},
154
155 {"immucr" , GROUP2 + 0, "org.gnu.gdb.or1k.group2", "immu"},
156 {"immupr" , GROUP2 + 1, "org.gnu.gdb.or1k.group2", "immu"},
157 {"itlbeir" , GROUP2 + 2, "org.gnu.gdb.or1k.group2", "immu"},
158 {"iatbmr0" , GROUP2 + 4, "org.gnu.gdb.or1k.group2", "immu"},
159 {"iatbmr1" , GROUP2 + 5, "org.gnu.gdb.or1k.group2", "immu"},
160 {"iatbmr2" , GROUP2 + 6, "org.gnu.gdb.or1k.group2", "immu"},
161 {"iatbmr3" , GROUP2 + 7, "org.gnu.gdb.or1k.group2", "immu"},
162 {"iatbtr0" , GROUP2 + 8, "org.gnu.gdb.or1k.group2", "immu"},
163 {"iatbtr1" , GROUP2 + 9, "org.gnu.gdb.or1k.group2", "immu"},
164 {"iatbtr2" , GROUP2 + 10, "org.gnu.gdb.or1k.group2", "immu"},
165 {"iatbtr3" , GROUP2 + 11, "org.gnu.gdb.or1k.group2", "immu"},
166
167 {"dccr" , GROUP3 + 0, "org.gnu.gdb.or1k.group3", "dcache"},
168 {"dcbpr" , GROUP3 + 1, "org.gnu.gdb.or1k.group3", "dcache"},
169 {"dcbfr" , GROUP3 + 2, "org.gnu.gdb.or1k.group3", "dcache"},
170 {"dcbir" , GROUP3 + 3, "org.gnu.gdb.or1k.group3", "dcache"},
171 {"dcbwr" , GROUP3 + 4, "org.gnu.gdb.or1k.group3", "dcache"},
172 {"dcblr" , GROUP3 + 5, "org.gnu.gdb.or1k.group3", "dcache"},
173
174 {"iccr" , GROUP4 + 0, "org.gnu.gdb.or1k.group4", "icache"},
175 {"icbpr" , GROUP4 + 1, "org.gnu.gdb.or1k.group4", "icache"},
176 {"icbir" , GROUP4 + 2, "org.gnu.gdb.or1k.group4", "icache"},
177 {"icblr" , GROUP4 + 3, "org.gnu.gdb.or1k.group4", "icache"},
178
179 {"maclo" , GROUP5 + 0, "org.gnu.gdb.or1k.group5", "mac"},
180 {"machi" , GROUP5 + 1, "org.gnu.gdb.or1k.group5", "mac"},
181
182 {"dvr0" , GROUP6 + 0, "org.gnu.gdb.or1k.group6", "debug"},
183 {"dvr1" , GROUP6 + 1, "org.gnu.gdb.or1k.group6", "debug"},
184 {"dvr2" , GROUP6 + 2, "org.gnu.gdb.or1k.group6", "debug"},
185 {"dvr3" , GROUP6 + 3, "org.gnu.gdb.or1k.group6", "debug"},
186 {"dvr4" , GROUP6 + 4, "org.gnu.gdb.or1k.group6", "debug"},
187 {"dvr5" , GROUP6 + 5, "org.gnu.gdb.or1k.group6", "debug"},
188 {"dvr6" , GROUP6 + 6, "org.gnu.gdb.or1k.group6", "debug"},
189 {"dvr7" , GROUP6 + 7, "org.gnu.gdb.or1k.group6", "debug"},
190 {"dcr0" , GROUP6 + 8, "org.gnu.gdb.or1k.group6", "debug"},
191 {"dcr1" , GROUP6 + 9, "org.gnu.gdb.or1k.group6", "debug"},
192 {"dcr2" , GROUP6 + 10, "org.gnu.gdb.or1k.group6", "debug"},
193 {"dcr3" , GROUP6 + 11, "org.gnu.gdb.or1k.group6", "debug"},
194 {"dcr4" , GROUP6 + 12, "org.gnu.gdb.or1k.group6", "debug"},
195 {"dcr5" , GROUP6 + 13, "org.gnu.gdb.or1k.group6", "debug"},
196 {"dcr6" , GROUP6 + 14, "org.gnu.gdb.or1k.group6", "debug"},
197 {"dcr7" , GROUP6 + 15, "org.gnu.gdb.or1k.group6", "debug"},
198 {"dmr1" , GROUP6 + 16, "org.gnu.gdb.or1k.group6", "debug"},
199 {"dmr2" , GROUP6 + 17, "org.gnu.gdb.or1k.group6", "debug"},
200 {"dcwr0" , GROUP6 + 18, "org.gnu.gdb.or1k.group6", "debug"},
201 {"dcwr1" , GROUP6 + 19, "org.gnu.gdb.or1k.group6", "debug"},
202 {"dsr" , GROUP6 + 20, "org.gnu.gdb.or1k.group6", "debug"},
203 {"drr" , GROUP6 + 21, "org.gnu.gdb.or1k.group6", "debug"},
204
205 {"pccr0" , GROUP7 + 0, "org.gnu.gdb.or1k.group7", "perf"},
206 {"pccr1" , GROUP7 + 1, "org.gnu.gdb.or1k.group7", "perf"},
207 {"pccr2" , GROUP7 + 2, "org.gnu.gdb.or1k.group7", "perf"},
208 {"pccr3" , GROUP7 + 3, "org.gnu.gdb.or1k.group7", "perf"},
209 {"pccr4" , GROUP7 + 4, "org.gnu.gdb.or1k.group7", "perf"},
210 {"pccr5" , GROUP7 + 5, "org.gnu.gdb.or1k.group7", "perf"},
211 {"pccr6" , GROUP7 + 6, "org.gnu.gdb.or1k.group7", "perf"},
212 {"pccr7" , GROUP7 + 7, "org.gnu.gdb.or1k.group7", "perf"},
213 {"pcmr0" , GROUP7 + 8, "org.gnu.gdb.or1k.group7", "perf"},
214 {"pcmr1" , GROUP7 + 9, "org.gnu.gdb.or1k.group7", "perf"},
215 {"pcmr2" , GROUP7 + 10, "org.gnu.gdb.or1k.group7", "perf"},
216 {"pcmr3" , GROUP7 + 11, "org.gnu.gdb.or1k.group7", "perf"},
217 {"pcmr4" , GROUP7 + 12, "org.gnu.gdb.or1k.group7", "perf"},
218 {"pcmr5" , GROUP7 + 13, "org.gnu.gdb.or1k.group7", "perf"},
219 {"pcmr6" , GROUP7 + 14, "org.gnu.gdb.or1k.group7", "perf"},
220 {"pcmr7" , GROUP7 + 15, "org.gnu.gdb.or1k.group7", "perf"},
221
222 {"pmr" , GROUP8 + 0, "org.gnu.gdb.or1k.group8", "power"},
223
224 {"picmr" , GROUP9 + 0, "org.gnu.gdb.or1k.group9", "pic"},
225 {"picsr" , GROUP9 + 2, "org.gnu.gdb.or1k.group9", "pic"},
226
227 {"ttmr" , GROUP10 + 0, "org.gnu.gdb.or1k.group10", "timer"},
228 {"ttcr" , GROUP10 + 1, "org.gnu.gdb.or1k.group10", "timer"},
229 };
230
231 static int or1k_add_reg(struct target *target, struct or1k_core_reg *new_reg)
232 {
233 struct or1k_common *or1k = target_to_or1k(target);
234 int reg_list_size = or1k->nb_regs * sizeof(struct or1k_core_reg);
235
236 or1k_core_reg_list_arch_info = realloc(or1k_core_reg_list_arch_info,
237 reg_list_size + sizeof(struct or1k_core_reg));
238
239 memcpy(&or1k_core_reg_list_arch_info[or1k->nb_regs], new_reg,
240 sizeof(struct or1k_core_reg));
241
242 or1k_core_reg_list_arch_info[or1k->nb_regs].list_num = or1k->nb_regs;
243
244 or1k->nb_regs++;
245
246 return ERROR_OK;
247 }
248
249 static int or1k_create_reg_list(struct target *target)
250 {
251 struct or1k_common *or1k = target_to_or1k(target);
252
253 LOG_DEBUG("-");
254
255 or1k_core_reg_list_arch_info = malloc(ARRAY_SIZE(or1k_init_reg_list) *
256 sizeof(struct or1k_core_reg));
257
258 for (int i = 0; i < (int)ARRAY_SIZE(or1k_init_reg_list); i++) {
259 or1k_core_reg_list_arch_info[i].name = or1k_init_reg_list[i].name;
260 or1k_core_reg_list_arch_info[i].spr_num = or1k_init_reg_list[i].spr_num;
261 or1k_core_reg_list_arch_info[i].group = or1k_init_reg_list[i].group;
262 or1k_core_reg_list_arch_info[i].feature = or1k_init_reg_list[i].feature;
263 or1k_core_reg_list_arch_info[i].list_num = i;
264 or1k_core_reg_list_arch_info[i].target = NULL;
265 or1k_core_reg_list_arch_info[i].or1k_common = NULL;
266 }
267
268 or1k->nb_regs = ARRAY_SIZE(or1k_init_reg_list);
269
270 struct or1k_core_reg new_reg;
271 new_reg.target = NULL;
272 new_reg.or1k_common = NULL;
273
274 char name[32];
275 for (int way = 0; way < 4; way++) {
276 for (int i = 0; i < 128; i++) {
277
278 sprintf(name, "dtlbw%dmr%d", way, i);
279 new_reg.name = strdup(name);
280 new_reg.spr_num = GROUP1 + 512 + i + (way * 256);
281 new_reg.feature = "org.gnu.gdb.or1k.group1";
282 new_reg.group = "dmmu";
283 or1k_add_reg(target, &new_reg);
284
285 sprintf(name, "dtlbw%dtr%d", way, i);
286 new_reg.name = strdup(name);
287 new_reg.spr_num = GROUP1 + 640 + i + (way * 256);
288 new_reg.feature = "org.gnu.gdb.or1k.group1";
289 new_reg.group = "dmmu";
290 or1k_add_reg(target, &new_reg);
291
292
293 sprintf(name, "itlbw%dmr%d", way, i);
294 new_reg.name = strdup(name);
295 new_reg.spr_num = GROUP2 + 512 + i + (way * 256);
296 new_reg.feature = "org.gnu.gdb.or1k.group2";
297 new_reg.group = "immu";
298 or1k_add_reg(target, &new_reg);
299
300
301 sprintf(name, "itlbw%dtr%d", way, i);
302 new_reg.name = strdup(name);
303 new_reg.spr_num = GROUP2 + 640 + i + (way * 256);
304 new_reg.feature = "org.gnu.gdb.or1k.group2";
305 new_reg.group = "immu";
306 or1k_add_reg(target, &new_reg);
307
308 }
309 }
310
311 return ERROR_OK;
312 }
313
314 static int or1k_jtag_read_regs(struct or1k_common *or1k, uint32_t *regs)
315 {
316 struct or1k_du *du_core = or1k_jtag_to_du(&or1k->jtag);
317
318 LOG_DEBUG("-");
319
320 return du_core->or1k_jtag_read_cpu(&or1k->jtag,
321 or1k->arch_info[OR1K_REG_R0].spr_num, OR1K_REG_R31 + 1,
322 regs + OR1K_REG_R0);
323 }
324
325 static int or1k_jtag_write_regs(struct or1k_common *or1k, uint32_t *regs)
326 {
327 struct or1k_du *du_core = or1k_jtag_to_du(&or1k->jtag);
328
329 LOG_DEBUG("-");
330
331 return du_core->or1k_jtag_write_cpu(&or1k->jtag,
332 or1k->arch_info[OR1K_REG_R0].spr_num, OR1K_REG_R31 + 1,
333 &regs[OR1K_REG_R0]);
334 }
335
336 static int or1k_save_context(struct target *target)
337 {
338 struct or1k_common *or1k = target_to_or1k(target);
339 struct or1k_du *du_core = or1k_to_du(or1k);
340 int regs_read = 0;
341 int retval;
342
343 LOG_DEBUG("-");
344
345 for (int i = 0; i < OR1KNUMCOREREGS; i++) {
346 if (!or1k->core_cache->reg_list[i].valid) {
347 if (i == OR1K_REG_PPC || i == OR1K_REG_NPC || i == OR1K_REG_SR) {
348 retval = du_core->or1k_jtag_read_cpu(&or1k->jtag,
349 or1k->arch_info[i].spr_num, 1,
350 &or1k->core_regs[i]);
351 if (retval != ERROR_OK)
352 return retval;
353 } else if (!regs_read) {
354 /* read gpr registers at once (but only one time in this loop) */
355 retval = or1k_jtag_read_regs(or1k, or1k->core_regs);
356 if (retval != ERROR_OK)
357 return retval;
358 /* prevent next reads in this loop */
359 regs_read = 1;
360 }
361 /* We've just updated the core_reg[i], now update
362 the core cache */
363 or1k_read_core_reg(target, i);
364 }
365 }
366
367 return ERROR_OK;
368 }
369
370 static int or1k_restore_context(struct target *target)
371 {
372 struct or1k_common *or1k = target_to_or1k(target);
373 struct or1k_du *du_core = or1k_to_du(or1k);
374 int reg_write = 0;
375 int retval;
376
377 LOG_DEBUG("-");
378
379 for (int i = 0; i < OR1KNUMCOREREGS; i++) {
380 if (or1k->core_cache->reg_list[i].dirty) {
381 or1k_write_core_reg(target, i);
382
383 if (i == OR1K_REG_PPC || i == OR1K_REG_NPC || i == OR1K_REG_SR) {
384 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
385 or1k->arch_info[i].spr_num, 1,
386 &or1k->core_regs[i]);
387 if (retval != ERROR_OK) {
388 LOG_ERROR("Error while restoring context");
389 return retval;
390 }
391 } else
392 reg_write = 1;
393 }
394 }
395
396 if (reg_write) {
397 /* read gpr registers at once (but only one time in this loop) */
398 retval = or1k_jtag_write_regs(or1k, or1k->core_regs);
399 if (retval != ERROR_OK) {
400 LOG_ERROR("Error while restoring context");
401 return retval;
402 }
403 }
404
405 return ERROR_OK;
406 }
407
408 static int or1k_read_core_reg(struct target *target, int num)
409 {
410 struct or1k_common *or1k = target_to_or1k(target);
411 struct or1k_du *du_core = or1k_to_du(or1k);
412 uint32_t reg_value;
413
414 LOG_DEBUG("-");
415
416 if ((num < 0) || (num >= or1k->nb_regs))
417 return ERROR_COMMAND_SYNTAX_ERROR;
418
419 if ((num >= 0) && (num < OR1KNUMCOREREGS)) {
420 reg_value = or1k->core_regs[num];
421 buf_set_u32(or1k->core_cache->reg_list[num].value, 0, 32, reg_value);
422 LOG_DEBUG("Read core reg %i value 0x%08" PRIx32, num , reg_value);
423 or1k->core_cache->reg_list[num].valid = 1;
424 or1k->core_cache->reg_list[num].dirty = 0;
425 } else {
426 /* This is an spr, always read value from HW */
427 int retval = du_core->or1k_jtag_read_cpu(&or1k->jtag,
428 or1k->arch_info[num].spr_num, 1, &reg_value);
429 if (retval != ERROR_OK) {
430 LOG_ERROR("Error while reading spr 0x%08" PRIx32, or1k->arch_info[num].spr_num);
431 return retval;
432 }
433 buf_set_u32(or1k->core_cache->reg_list[num].value, 0, 32, reg_value);
434 LOG_DEBUG("Read spr reg %i value 0x%08" PRIx32, num , reg_value);
435 }
436
437 return ERROR_OK;
438 }
439
440 static int or1k_write_core_reg(struct target *target, int num)
441 {
442 struct or1k_common *or1k = target_to_or1k(target);
443
444 LOG_DEBUG("-");
445
446 if ((num < 0) || (num >= OR1KNUMCOREREGS))
447 return ERROR_COMMAND_SYNTAX_ERROR;
448
449 uint32_t reg_value = buf_get_u32(or1k->core_cache->reg_list[num].value, 0, 32);
450 or1k->core_regs[num] = reg_value;
451 LOG_DEBUG("Write core reg %i value 0x%08" PRIx32, num , reg_value);
452 or1k->core_cache->reg_list[num].valid = 1;
453 or1k->core_cache->reg_list[num].dirty = 0;
454
455 return ERROR_OK;
456 }
457
458 static int or1k_get_core_reg(struct reg *reg)
459 {
460 struct or1k_core_reg *or1k_reg = reg->arch_info;
461 struct target *target = or1k_reg->target;
462
463 LOG_DEBUG("-");
464
465 if (target->state != TARGET_HALTED)
466 return ERROR_TARGET_NOT_HALTED;
467
468 return or1k_read_core_reg(target, or1k_reg->list_num);
469 }
470
471 static int or1k_set_core_reg(struct reg *reg, uint8_t *buf)
472 {
473 struct or1k_core_reg *or1k_reg = reg->arch_info;
474 struct target *target = or1k_reg->target;
475 struct or1k_common *or1k = target_to_or1k(target);
476 struct or1k_du *du_core = or1k_to_du(or1k);
477 uint32_t value = buf_get_u32(buf, 0, 32);
478
479 LOG_DEBUG("-");
480
481 if (target->state != TARGET_HALTED)
482 return ERROR_TARGET_NOT_HALTED;
483
484 if (or1k_reg->list_num < OR1KNUMCOREREGS) {
485 buf_set_u32(reg->value, 0, 32, value);
486 reg->dirty = 1;
487 reg->valid = 1;
488 } else {
489 /* This is an spr, write it to the HW */
490 int retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
491 or1k_reg->spr_num, 1, &value);
492 if (retval != ERROR_OK) {
493 LOG_ERROR("Error while writing spr 0x%08" PRIx32, or1k_reg->spr_num);
494 return retval;
495 }
496 }
497
498 return ERROR_OK;
499 }
500
501 static const struct reg_arch_type or1k_reg_type = {
502 .get = or1k_get_core_reg,
503 .set = or1k_set_core_reg,
504 };
505
506 static struct reg_cache *or1k_build_reg_cache(struct target *target)
507 {
508 struct or1k_common *or1k = target_to_or1k(target);
509 struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
510 struct reg_cache *cache = malloc(sizeof(struct reg_cache));
511 struct reg *reg_list = calloc(or1k->nb_regs, sizeof(struct reg));
512 struct or1k_core_reg *arch_info =
513 malloc((or1k->nb_regs) * sizeof(struct or1k_core_reg));
514 struct reg_feature *feature;
515
516 LOG_DEBUG("-");
517
518 /* Build the process context cache */
519 cache->name = "OpenRISC 1000 registers";
520 cache->next = NULL;
521 cache->reg_list = reg_list;
522 cache->num_regs = or1k->nb_regs;
523 (*cache_p) = cache;
524 or1k->core_cache = cache;
525 or1k->arch_info = arch_info;
526
527 for (int i = 0; i < or1k->nb_regs; i++) {
528 arch_info[i] = or1k_core_reg_list_arch_info[i];
529 arch_info[i].target = target;
530 arch_info[i].or1k_common = or1k;
531 reg_list[i].name = or1k_core_reg_list_arch_info[i].name;
532
533 feature = malloc(sizeof(struct reg_feature));
534 feature->name = or1k_core_reg_list_arch_info[i].feature;
535 reg_list[i].feature = feature;
536
537 reg_list[i].group = or1k_core_reg_list_arch_info[i].group;
538 reg_list[i].size = 32;
539 reg_list[i].value = calloc(1, 4);
540 reg_list[i].dirty = 0;
541 reg_list[i].valid = 0;
542 reg_list[i].type = &or1k_reg_type;
543 reg_list[i].arch_info = &arch_info[i];
544 reg_list[i].number = i;
545 reg_list[i].exist = true;
546 }
547
548 return cache;
549 }
550
551 static int or1k_debug_entry(struct target *target)
552 {
553 LOG_DEBUG("-");
554
555 int retval = or1k_save_context(target);
556 if (retval != ERROR_OK) {
557 LOG_ERROR("Error while calling or1k_save_context");
558 return retval;
559 }
560
561 struct or1k_common *or1k = target_to_or1k(target);
562 uint32_t addr = or1k->core_regs[OR1K_REG_NPC];
563
564 if (breakpoint_find(target, addr))
565 /* Halted on a breakpoint, step back to permit executing the instruction there */
566 retval = or1k_set_core_reg(&or1k->core_cache->reg_list[OR1K_REG_NPC],
567 (uint8_t *)&addr);
568
569 return retval;
570 }
571
572 static int or1k_halt(struct target *target)
573 {
574 struct or1k_common *or1k = target_to_or1k(target);
575 struct or1k_du *du_core = or1k_to_du(or1k);
576
577 LOG_DEBUG("target->state: %s",
578 target_state_name(target));
579
580 if (target->state == TARGET_HALTED) {
581 LOG_DEBUG("Target was already halted");
582 return ERROR_OK;
583 }
584
585 if (target->state == TARGET_UNKNOWN)
586 LOG_WARNING("Target was in unknown state when halt was requested");
587
588 if (target->state == TARGET_RESET) {
589 if ((jtag_get_reset_config() & RESET_SRST_PULLS_TRST) &&
590 jtag_get_srst()) {
591 LOG_ERROR("Can't request a halt while in reset if nSRST pulls nTRST");
592 return ERROR_TARGET_FAILURE;
593 } else {
594 target->debug_reason = DBG_REASON_DBGRQ;
595 return ERROR_OK;
596 }
597 }
598
599 int retval = du_core->or1k_cpu_stall(&or1k->jtag, CPU_STALL);
600 if (retval != ERROR_OK) {
601 LOG_ERROR("Impossible to stall the CPU");
602 return retval;
603 }
604
605 target->debug_reason = DBG_REASON_DBGRQ;
606
607 return ERROR_OK;
608 }
609
610 static int or1k_is_cpu_running(struct target *target, int *running)
611 {
612 struct or1k_common *or1k = target_to_or1k(target);
613 struct or1k_du *du_core = or1k_to_du(or1k);
614 int retval;
615 int tries = 0;
616 const int RETRIES_MAX = 5;
617
618 /* Have a retry loop to determine of the CPU is running.
619 If target has been hard reset for any reason, it might take a couple
620 of goes before it's ready again.
621 */
622 while (tries < RETRIES_MAX) {
623
624 tries++;
625
626 retval = du_core->or1k_is_cpu_running(&or1k->jtag, running);
627 if (retval != ERROR_OK) {
628 LOG_WARNING("Debug IF CPU control reg read failure.");
629 /* Try once to restart the JTAG infrastructure -
630 quite possibly the board has just been reset. */
631 LOG_WARNING("Resetting JTAG TAP state and reconnectiong to debug IF.");
632 du_core->or1k_jtag_init(&or1k->jtag);
633
634 LOG_WARNING("...attempt %d of %d", tries, RETRIES_MAX);
635
636 alive_sleep(2);
637
638 continue;
639 } else
640 return ERROR_OK;
641 }
642
643 LOG_ERROR("Could not re-establish communication with target");
644 return retval;
645 }
646
647 static int or1k_poll(struct target *target)
648 {
649 int retval;
650 int running;
651
652 retval = or1k_is_cpu_running(target, &running);
653 if (retval != ERROR_OK) {
654 LOG_ERROR("Error while calling or1k_is_cpu_running");
655 return retval;
656 }
657
658 /* check for processor halted */
659 if (!running) {
660 /* It's actually stalled, so update our software's state */
661 if ((target->state == TARGET_RUNNING) ||
662 (target->state == TARGET_RESET)) {
663
664 target->state = TARGET_HALTED;
665
666 retval = or1k_debug_entry(target);
667 if (retval != ERROR_OK) {
668 LOG_ERROR("Error while calling or1k_debug_entry");
669 return retval;
670 }
671
672 target_call_event_callbacks(target,
673 TARGET_EVENT_HALTED);
674 } else if (target->state == TARGET_DEBUG_RUNNING) {
675 target->state = TARGET_HALTED;
676
677 retval = or1k_debug_entry(target);
678 if (retval != ERROR_OK) {
679 LOG_ERROR("Error while calling or1k_debug_entry");
680 return retval;
681 }
682
683 target_call_event_callbacks(target,
684 TARGET_EVENT_DEBUG_HALTED);
685 }
686 } else { /* ... target is running */
687
688 /* If target was supposed to be stalled, stall it again */
689 if (target->state == TARGET_HALTED) {
690
691 target->state = TARGET_RUNNING;
692
693 retval = or1k_halt(target);
694 if (retval != ERROR_OK) {
695 LOG_ERROR("Error while calling or1k_halt");
696 return retval;
697 }
698
699 retval = or1k_debug_entry(target);
700 if (retval != ERROR_OK) {
701 LOG_ERROR("Error while calling or1k_debug_entry");
702 return retval;
703 }
704
705 target_call_event_callbacks(target,
706 TARGET_EVENT_DEBUG_HALTED);
707 }
708
709 target->state = TARGET_RUNNING;
710
711 }
712
713 return ERROR_OK;
714 }
715
716 static int or1k_assert_reset(struct target *target)
717 {
718 struct or1k_common *or1k = target_to_or1k(target);
719 struct or1k_du *du_core = or1k_to_du(or1k);
720
721 LOG_DEBUG("-");
722
723 int retval = du_core->or1k_cpu_reset(&or1k->jtag, CPU_RESET);
724 if (retval != ERROR_OK) {
725 LOG_ERROR("Error while asserting RESET");
726 return retval;
727 }
728
729 return ERROR_OK;
730 }
731
732 static int or1k_deassert_reset(struct target *target)
733 {
734 struct or1k_common *or1k = target_to_or1k(target);
735 struct or1k_du *du_core = or1k_to_du(or1k);
736
737 LOG_DEBUG("-");
738
739 int retval = du_core->or1k_cpu_reset(&or1k->jtag, CPU_NOT_RESET);
740 if (retval != ERROR_OK) {
741 LOG_ERROR("Error while desasserting RESET");
742 return retval;
743 }
744
745 return ERROR_OK;
746 }
747
748 static int or1k_soft_reset_halt(struct target *target)
749 {
750 struct or1k_common *or1k = target_to_or1k(target);
751 struct or1k_du *du_core = or1k_to_du(or1k);
752
753 LOG_DEBUG("-");
754
755 int retval = du_core->or1k_cpu_stall(&or1k->jtag, CPU_STALL);
756 if (retval != ERROR_OK) {
757 LOG_ERROR("Error while stalling the CPU");
758 return retval;
759 }
760
761 retval = or1k_assert_reset(target);
762 if (retval != ERROR_OK)
763 return retval;
764
765 retval = or1k_deassert_reset(target);
766 if (retval != ERROR_OK)
767 return retval;
768
769 return ERROR_OK;
770 }
771
772 static bool is_any_soft_breakpoint(struct target *target)
773 {
774 struct breakpoint *breakpoint = target->breakpoints;
775
776 LOG_DEBUG("-");
777
778 while (breakpoint)
779 if (breakpoint->type == BKPT_SOFT)
780 return true;
781
782 return false;
783 }
784
785 static int or1k_resume_or_step(struct target *target, int current,
786 uint32_t address, int handle_breakpoints,
787 int debug_execution, int step)
788 {
789 struct or1k_common *or1k = target_to_or1k(target);
790 struct or1k_du *du_core = or1k_to_du(or1k);
791 struct breakpoint *breakpoint = NULL;
792 uint32_t resume_pc;
793 uint32_t debug_reg_list[OR1K_DEBUG_REG_NUM];
794
795 LOG_DEBUG("Addr: 0x%" PRIx32 ", stepping: %s, handle breakpoints %s\n",
796 address, step ? "yes" : "no", handle_breakpoints ? "yes" : "no");
797
798 if (target->state != TARGET_HALTED) {
799 LOG_ERROR("Target not halted");
800 return ERROR_TARGET_NOT_HALTED;
801 }
802
803 if (!debug_execution)
804 target_free_all_working_areas(target);
805
806 /* current ? continue on current pc : continue at <address> */
807 if (!current)
808 buf_set_u32(or1k->core_cache->reg_list[OR1K_REG_NPC].value, 0,
809 32, address);
810
811 int retval = or1k_restore_context(target);
812 if (retval != ERROR_OK) {
813 LOG_ERROR("Error while calling or1k_restore_context");
814 return retval;
815 }
816
817 /* read debug registers (starting from DMR1 register) */
818 retval = du_core->or1k_jtag_read_cpu(&or1k->jtag, OR1K_DMR1_CPU_REG_ADD,
819 OR1K_DEBUG_REG_NUM, debug_reg_list);
820 if (retval != ERROR_OK) {
821 LOG_ERROR("Error while reading debug registers");
822 return retval;
823 }
824
825 /* Clear Debug Reason Register (DRR) */
826 debug_reg_list[OR1K_DEBUG_REG_DRR] = 0;
827
828 /* Clear watchpoint break generation in Debug Mode Register 2 (DMR2) */
829 debug_reg_list[OR1K_DEBUG_REG_DMR2] &= ~OR1K_DMR2_WGB;
830 if (step)
831 /* Set the single step trigger in Debug Mode Register 1 (DMR1) */
832 debug_reg_list[OR1K_DEBUG_REG_DMR1] |= OR1K_DMR1_ST | OR1K_DMR1_BT;
833 else
834 /* Clear the single step trigger in Debug Mode Register 1 (DMR1) */
835 debug_reg_list[OR1K_DEBUG_REG_DMR1] &= ~(OR1K_DMR1_ST | OR1K_DMR1_BT);
836
837 /* Set traps to be handled by the debug unit in the Debug Stop
838 Register (DSR). Check if we have any software breakpoints in
839 place before setting this value - the kernel, for instance,
840 relies on l.trap instructions not stalling the processor ! */
841 if (is_any_soft_breakpoint(target) == true)
842 debug_reg_list[OR1K_DEBUG_REG_DSR] |= OR1K_DSR_TE;
843
844 /* Write debug registers (starting from DMR1 register) */
845 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag, OR1K_DMR1_CPU_REG_ADD,
846 OR1K_DEBUG_REG_NUM, debug_reg_list);
847 if (retval != ERROR_OK) {
848 LOG_ERROR("Error while writing back debug registers");
849 return retval;
850 }
851
852 resume_pc = buf_get_u32(or1k->core_cache->reg_list[OR1K_REG_NPC].value,
853 0, 32);
854
855 /* The front-end may request us not to handle breakpoints */
856 if (handle_breakpoints) {
857 /* Single step past breakpoint at current address */
858 breakpoint = breakpoint_find(target, resume_pc);
859 if (breakpoint) {
860 LOG_DEBUG("Unset breakpoint at 0x%08" PRIx32, breakpoint->address);
861 retval = or1k_remove_breakpoint(target, breakpoint);
862 if (retval != ERROR_OK)
863 return retval;
864 }
865 }
866
867 /* Unstall time */
868 retval = du_core->or1k_cpu_stall(&or1k->jtag, CPU_UNSTALL);
869 if (retval != ERROR_OK) {
870 LOG_ERROR("Error while unstalling the CPU");
871 return retval;
872 }
873
874 if (step)
875 target->debug_reason = DBG_REASON_SINGLESTEP;
876 else
877 target->debug_reason = DBG_REASON_NOTHALTED;
878
879 /* Registers are now invalid */
880 register_cache_invalidate(or1k->core_cache);
881
882 if (!debug_execution) {
883 target->state = TARGET_RUNNING;
884 target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
885 LOG_DEBUG("Target resumed at 0x%08" PRIx32, resume_pc);
886 } else {
887 target->state = TARGET_DEBUG_RUNNING;
888 target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
889 LOG_DEBUG("Target debug resumed at 0x%08" PRIx32, resume_pc);
890 }
891
892 return ERROR_OK;
893 }
894
895 static int or1k_resume(struct target *target, int current,
896 uint32_t address, int handle_breakpoints, int debug_execution)
897 {
898 return or1k_resume_or_step(target, current, address,
899 handle_breakpoints,
900 debug_execution,
901 NO_SINGLE_STEP);
902 }
903
904 static int or1k_step(struct target *target, int current,
905 uint32_t address, int handle_breakpoints)
906 {
907 return or1k_resume_or_step(target, current, address,
908 handle_breakpoints,
909 0,
910 SINGLE_STEP);
911
912 }
913
914 static int or1k_add_breakpoint(struct target *target,
915 struct breakpoint *breakpoint)
916 {
917 struct or1k_common *or1k = target_to_or1k(target);
918 struct or1k_du *du_core = or1k_to_du(or1k);
919 uint8_t data;
920
921 LOG_DEBUG("Adding breakpoint: addr 0x%08" PRIx32 ", len %d, type %d, set: %d, id: %" PRId32,
922 breakpoint->address, breakpoint->length, breakpoint->type,
923 breakpoint->set, breakpoint->unique_id);
924
925 /* Only support SW breakpoints for now. */
926 if (breakpoint->type == BKPT_HARD)
927 LOG_ERROR("HW breakpoints not supported for now. Doing SW breakpoint.");
928
929 /* Read and save the instruction */
930 int retval = du_core->or1k_jtag_read_memory(&or1k->jtag,
931 breakpoint->address,
932 4,
933 1,
934 &data);
935 if (retval != ERROR_OK) {
936 LOG_ERROR("Error while reading the instruction at 0x%08" PRIx32,
937 breakpoint->address);
938 return retval;
939 }
940
941 if (breakpoint->orig_instr != NULL)
942 free(breakpoint->orig_instr);
943
944 breakpoint->orig_instr = malloc(breakpoint->length);
945 memcpy(breakpoint->orig_instr, &data, breakpoint->length);
946
947 /* Sub in the OR1K trap instruction */
948 uint8_t or1k_trap_insn[4];
949 target_buffer_set_u32(target, or1k_trap_insn, OR1K_TRAP_INSTR);
950 retval = du_core->or1k_jtag_write_memory(&or1k->jtag,
951 breakpoint->address,
952 4,
953 1,
954 or1k_trap_insn);
955
956 if (retval != ERROR_OK) {
957 LOG_ERROR("Error while writing OR1K_TRAP_INSTR at 0x%08" PRIx32,
958 breakpoint->address);
959 return retval;
960 }
961
962 /* invalidate instruction cache */
963 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
964 OR1K_ICBIR_CPU_REG_ADD, 1, &breakpoint->address);
965 if (retval != ERROR_OK) {
966 LOG_ERROR("Error while invalidating the ICACHE");
967 return retval;
968 }
969
970 return ERROR_OK;
971 }
972
973 static int or1k_remove_breakpoint(struct target *target,
974 struct breakpoint *breakpoint)
975 {
976 struct or1k_common *or1k = target_to_or1k(target);
977 struct or1k_du *du_core = or1k_to_du(or1k);
978
979 LOG_DEBUG("Removing breakpoint: addr 0x%08" PRIx32 ", len %d, type %d, set: %d, id: %" PRId32,
980 breakpoint->address, breakpoint->length, breakpoint->type,
981 breakpoint->set, breakpoint->unique_id);
982
983 /* Only support SW breakpoints for now. */
984 if (breakpoint->type == BKPT_HARD)
985 LOG_ERROR("HW breakpoints not supported for now. Doing SW breakpoint.");
986
987 /* Replace the removed instruction */
988 int retval = du_core->or1k_jtag_write_memory(&or1k->jtag,
989 breakpoint->address,
990 4,
991 1,
992 breakpoint->orig_instr);
993
994 if (retval != ERROR_OK) {
995 LOG_ERROR("Error while writing back the instruction at 0x%08" PRIx32,
996 breakpoint->address);
997 return retval;
998 }
999
1000 /* invalidate instruction cache */
1001 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
1002 OR1K_ICBIR_CPU_REG_ADD, 1, &breakpoint->address);
1003 if (retval != ERROR_OK) {
1004 LOG_ERROR("Error while invalidating the ICACHE");
1005 return retval;
1006 }
1007
1008 return ERROR_OK;
1009 }
1010
1011 static int or1k_add_watchpoint(struct target *target,
1012 struct watchpoint *watchpoint)
1013 {
1014 LOG_ERROR("%s: implement me", __func__);
1015 return ERROR_OK;
1016 }
1017
1018 static int or1k_remove_watchpoint(struct target *target,
1019 struct watchpoint *watchpoint)
1020 {
1021 LOG_ERROR("%s: implement me", __func__);
1022 return ERROR_OK;
1023 }
1024
1025 static int or1k_read_memory(struct target *target, uint32_t address,
1026 uint32_t size, uint32_t count, uint8_t *buffer)
1027 {
1028 struct or1k_common *or1k = target_to_or1k(target);
1029 struct or1k_du *du_core = or1k_to_du(or1k);
1030
1031 LOG_DEBUG("Read memory at 0x%08" PRIx32 ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
1032
1033 if (target->state != TARGET_HALTED) {
1034 LOG_ERROR("Target not halted");
1035 return ERROR_TARGET_NOT_HALTED;
1036 }
1037
1038 /* Sanitize arguments */
1039 if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !buffer) {
1040 LOG_ERROR("Bad arguments");
1041 return ERROR_COMMAND_SYNTAX_ERROR;
1042 }
1043
1044 if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u))) {
1045 LOG_ERROR("Can't handle unaligned memory access");
1046 return ERROR_TARGET_UNALIGNED_ACCESS;
1047 }
1048
1049 return du_core->or1k_jtag_read_memory(&or1k->jtag, address, size, count, buffer);
1050 }
1051
1052 static int or1k_write_memory(struct target *target, uint32_t address,
1053 uint32_t size, uint32_t count, const uint8_t *buffer)
1054 {
1055 struct or1k_common *or1k = target_to_or1k(target);
1056 struct or1k_du *du_core = or1k_to_du(or1k);
1057
1058 LOG_DEBUG("Write memory at 0x%08" PRIx32 ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
1059
1060 if (target->state != TARGET_HALTED) {
1061 LOG_WARNING("Target not halted");
1062 return ERROR_TARGET_NOT_HALTED;
1063 }
1064
1065 /* Sanitize arguments */
1066 if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !buffer) {
1067 LOG_ERROR("Bad arguments");
1068 return ERROR_COMMAND_SYNTAX_ERROR;
1069 }
1070
1071 if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u))) {
1072 LOG_ERROR("Can't handle unaligned memory access");
1073 return ERROR_TARGET_UNALIGNED_ACCESS;
1074 }
1075
1076 return du_core->or1k_jtag_write_memory(&or1k->jtag, address, size, count, buffer);
1077 }
1078
1079 static int or1k_init_target(struct command_context *cmd_ctx,
1080 struct target *target)
1081 {
1082 struct or1k_common *or1k = target_to_or1k(target);
1083 struct or1k_du *du_core = or1k_to_du(or1k);
1084 struct or1k_jtag *jtag = &or1k->jtag;
1085
1086 if (du_core == NULL) {
1087 LOG_ERROR("No debug unit selected");
1088 return ERROR_FAIL;
1089 }
1090
1091 if (jtag->tap_ip == NULL) {
1092 LOG_ERROR("No tap selected");
1093 return ERROR_FAIL;
1094 }
1095
1096 or1k->jtag.tap = target->tap;
1097 or1k->jtag.or1k_jtag_inited = 0;
1098 or1k->jtag.or1k_jtag_module_selected = -1;
1099 or1k->jtag.target = target;
1100
1101 or1k_build_reg_cache(target);
1102
1103 return ERROR_OK;
1104 }
1105
1106 static int or1k_target_create(struct target *target, Jim_Interp *interp)
1107 {
1108 if (target->tap == NULL)
1109 return ERROR_FAIL;
1110
1111 struct or1k_common *or1k = calloc(1, sizeof(struct or1k_common));
1112
1113 target->arch_info = or1k;
1114
1115 or1k_create_reg_list(target);
1116
1117 or1k_tap_vjtag_register();
1118 or1k_tap_xilinx_bscan_register();
1119 or1k_tap_mohor_register();
1120
1121 or1k_du_adv_register();
1122
1123 return ERROR_OK;
1124 }
1125
1126 static int or1k_examine(struct target *target)
1127 {
1128 struct or1k_common *or1k = target_to_or1k(target);
1129 struct or1k_du *du_core = or1k_to_du(or1k);
1130
1131 if (!target_was_examined(target)) {
1132
1133 target_set_examined(target);
1134
1135 int running;
1136
1137 int retval = du_core->or1k_is_cpu_running(&or1k->jtag, &running);
1138 if (retval != ERROR_OK) {
1139 LOG_ERROR("Couldn't read the CPU state");
1140 return retval;
1141 } else {
1142 if (running)
1143 target->state = TARGET_RUNNING;
1144 else {
1145 LOG_DEBUG("Target is halted");
1146
1147 /* This is the first time we examine the target,
1148 * it is stalled and we don't know why. Let's
1149 * assume this is because of a debug reason.
1150 */
1151 if (target->state == TARGET_UNKNOWN)
1152 target->debug_reason = DBG_REASON_DBGRQ;
1153
1154 target->state = TARGET_HALTED;
1155 }
1156 }
1157 }
1158
1159 return ERROR_OK;
1160 }
1161
1162 static int or1k_arch_state(struct target *target)
1163 {
1164 return ERROR_OK;
1165 }
1166
1167 static int or1k_get_gdb_reg_list(struct target *target, struct reg **reg_list[],
1168 int *reg_list_size, enum target_register_class reg_class)
1169 {
1170 struct or1k_common *or1k = target_to_or1k(target);
1171
1172 if (reg_class == REG_CLASS_GENERAL) {
1173 /* We will have this called whenever GDB connects. */
1174 int retval = or1k_save_context(target);
1175 if (retval != ERROR_OK) {
1176 LOG_ERROR("Error while calling or1k_save_context");
1177 return retval;
1178 }
1179 *reg_list_size = OR1KNUMCOREREGS;
1180 /* this is free()'d back in gdb_server.c's gdb_get_register_packet() */
1181 *reg_list = malloc((*reg_list_size) * sizeof(struct reg *));
1182
1183 for (int i = 0; i < OR1KNUMCOREREGS; i++)
1184 (*reg_list)[i] = &or1k->core_cache->reg_list[i];
1185 } else {
1186 *reg_list_size = or1k->nb_regs;
1187 *reg_list = malloc((*reg_list_size) * sizeof(struct reg *));
1188
1189 for (int i = 0; i < or1k->nb_regs; i++)
1190 (*reg_list)[i] = &or1k->core_cache->reg_list[i];
1191 }
1192
1193 return ERROR_OK;
1194
1195 }
1196
1197 int or1k_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
1198 {
1199 return ERROR_FAIL;
1200 }
1201
1202 static int or1k_checksum_memory(struct target *target, uint32_t address,
1203 uint32_t count, uint32_t *checksum) {
1204
1205 return ERROR_FAIL;
1206 }
1207
1208 COMMAND_HANDLER(or1k_tap_select_command_handler)
1209 {
1210 struct target *target = get_current_target(CMD_CTX);
1211 struct or1k_common *or1k = target_to_or1k(target);
1212 struct or1k_jtag *jtag = &or1k->jtag;
1213 struct or1k_tap_ip *or1k_tap;
1214
1215 if (CMD_ARGC != 1)
1216 return ERROR_COMMAND_SYNTAX_ERROR;
1217
1218 list_for_each_entry(or1k_tap, &tap_list, list) {
1219 if (or1k_tap->name) {
1220 if (!strcmp(CMD_ARGV[0], or1k_tap->name)) {
1221 jtag->tap_ip = or1k_tap;
1222 LOG_INFO("%s tap selected", or1k_tap->name);
1223 return ERROR_OK;
1224 }
1225 }
1226 }
1227
1228 LOG_ERROR("%s unknown, no tap selected", CMD_ARGV[0]);
1229 return ERROR_COMMAND_SYNTAX_ERROR;
1230 }
1231
1232 COMMAND_HANDLER(or1k_tap_list_command_handler)
1233 {
1234 struct or1k_tap_ip *or1k_tap;
1235
1236 if (CMD_ARGC != 0)
1237 return ERROR_COMMAND_SYNTAX_ERROR;
1238
1239 list_for_each_entry(or1k_tap, &tap_list, list) {
1240 if (or1k_tap->name)
1241 command_print(CMD_CTX, "%s", or1k_tap->name);
1242 }
1243
1244 return ERROR_OK;
1245 }
1246
1247 COMMAND_HANDLER(or1k_du_select_command_handler)
1248 {
1249 struct target *target = get_current_target(CMD_CTX);
1250 struct or1k_common *or1k = target_to_or1k(target);
1251 struct or1k_jtag *jtag = &or1k->jtag;
1252 struct or1k_du *or1k_du;
1253
1254 if (CMD_ARGC > 2)
1255 return ERROR_COMMAND_SYNTAX_ERROR;
1256
1257 list_for_each_entry(or1k_du, &du_list, list) {
1258 if (or1k_du->name) {
1259 if (!strcmp(CMD_ARGV[0], or1k_du->name)) {
1260 jtag->du_core = or1k_du;
1261 LOG_INFO("%s debug unit selected", or1k_du->name);
1262
1263 if (CMD_ARGC == 2) {
1264 int options;
1265 COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], options);
1266 or1k_du->options = options;
1267 LOG_INFO("Option %x is passed to %s debug unit"
1268 , options, or1k_du->name);
1269 }
1270
1271 return ERROR_OK;
1272 }
1273 }
1274 }
1275
1276 LOG_ERROR("%s unknown, no debug unit selected", CMD_ARGV[0]);
1277 return ERROR_COMMAND_SYNTAX_ERROR;
1278 }
1279
1280 COMMAND_HANDLER(or1k_du_list_command_handler)
1281 {
1282 struct or1k_du *or1k_du;
1283
1284 if (CMD_ARGC != 0)
1285 return ERROR_COMMAND_SYNTAX_ERROR;
1286
1287 list_for_each_entry(or1k_du, &du_list, list) {
1288 if (or1k_du->name)
1289 command_print(CMD_CTX, "%s", or1k_du->name);
1290 }
1291
1292 return ERROR_OK;
1293 }
1294
1295 COMMAND_HANDLER(or1k_addreg_command_handler)
1296 {
1297 struct target *target = get_current_target(CMD_CTX);
1298 struct or1k_core_reg new_reg;
1299
1300 if (CMD_ARGC != 4)
1301 return ERROR_COMMAND_SYNTAX_ERROR;
1302
1303 new_reg.target = NULL;
1304 new_reg.or1k_common = NULL;
1305
1306 uint32_t addr;
1307 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], addr);
1308
1309 new_reg.name = strdup(CMD_ARGV[0]);
1310 new_reg.spr_num = addr;
1311 new_reg.feature = strdup(CMD_ARGV[2]);
1312 new_reg.group = strdup(CMD_ARGV[3]);
1313
1314 or1k_add_reg(target, &new_reg);
1315
1316 LOG_DEBUG("Add reg \"%s\" @ 0x%08" PRIx32 ", group \"%s\", feature \"%s\"",
1317 new_reg.name, addr, new_reg.group, new_reg.feature);
1318
1319 return ERROR_OK;
1320 }
1321
1322 static const struct command_registration or1k_hw_ip_command_handlers[] = {
1323 {
1324 "tap_select",
1325 .handler = or1k_tap_select_command_handler,
1326 .mode = COMMAND_ANY,
1327 .usage = "tap_select name",
1328 .help = "Select the TAP core to use",
1329 },
1330 {
1331 "tap_list",
1332 .handler = or1k_tap_list_command_handler,
1333 .mode = COMMAND_ANY,
1334 .usage = "tap_list",
1335 .help = "Display available TAP core",
1336 },
1337 {
1338 "du_select",
1339 .handler = or1k_du_select_command_handler,
1340 .mode = COMMAND_ANY,
1341 .usage = "du_select name",
1342 .help = "Select the Debug Unit core to use",
1343 },
1344 {
1345 "du_list",
1346 .handler = or1k_du_list_command_handler,
1347 .mode = COMMAND_ANY,
1348 .usage = "select_tap name",
1349 .help = "Display available Debug Unit core",
1350 },
1351 COMMAND_REGISTRATION_DONE
1352 };
1353
1354 static const struct command_registration or1k_reg_command_handlers[] = {
1355 {
1356 "addreg",
1357 .handler = or1k_addreg_command_handler,
1358 .mode = COMMAND_ANY,
1359 .usage = "addreg name addr feature group",
1360 .help = "Add a register to the register list",
1361 },
1362 COMMAND_REGISTRATION_DONE
1363 };
1364
1365 static const struct command_registration or1k_command_handlers[] = {
1366 {
1367 .chain = or1k_reg_command_handlers,
1368 },
1369 {
1370 .chain = or1k_hw_ip_command_handlers,
1371 },
1372 COMMAND_REGISTRATION_DONE
1373 };
1374
1375
1376 struct target_type or1k_target = {
1377 .name = "or1k",
1378
1379 .poll = or1k_poll,
1380 .arch_state = or1k_arch_state,
1381
1382 .target_request_data = NULL,
1383
1384 .halt = or1k_halt,
1385 .resume = or1k_resume,
1386 .step = or1k_step,
1387
1388 .assert_reset = or1k_assert_reset,
1389 .deassert_reset = or1k_deassert_reset,
1390 .soft_reset_halt = or1k_soft_reset_halt,
1391
1392 .get_gdb_reg_list = or1k_get_gdb_reg_list,
1393
1394 .read_memory = or1k_read_memory,
1395 .write_memory = or1k_write_memory,
1396 .checksum_memory = or1k_checksum_memory,
1397
1398 .commands = or1k_command_handlers,
1399 .add_breakpoint = or1k_add_breakpoint,
1400 .remove_breakpoint = or1k_remove_breakpoint,
1401 .add_watchpoint = or1k_add_watchpoint,
1402 .remove_watchpoint = or1k_remove_watchpoint,
1403
1404 .target_create = or1k_target_create,
1405 .init_target = or1k_init_target,
1406 .examine = or1k_examine,
1407
1408 .get_gdb_fileio_info = or1k_get_gdb_fileio_info,
1409 };

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)