jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / src / target / openrisc / or1k.c
blob8c386108057e4292cde7a8e2bc5fef46a6049882
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2011 by Julius Baxter *
5 * julius@opencores.org *
6 * *
7 * Copyright (C) 2013 by Marek Czerski *
8 * ma.czerski@gmail.com *
9 * *
10 * Copyright (C) 2013 by Franck Jullien *
11 * elec4fun@gmail.com *
12 * *
13 ***************************************************************************/
15 #ifdef HAVE_CONFIG_H
16 #include "config.h"
17 #endif
19 #include <jtag/jtag.h>
20 #include <target/register.h>
21 #include <target/target.h>
22 #include <target/breakpoints.h>
23 #include <target/target_type.h>
24 #include <helper/time_support.h>
25 #include <helper/fileio.h>
26 #include "or1k_tap.h"
27 #include "or1k.h"
28 #include "or1k_du.h"
30 LIST_HEAD(tap_list);
31 LIST_HEAD(du_list);
33 static int or1k_remove_breakpoint(struct target *target,
34 struct breakpoint *breakpoint);
36 static int or1k_read_core_reg(struct target *target, int num);
37 static int or1k_write_core_reg(struct target *target, int num);
39 static struct or1k_core_reg *or1k_core_reg_list_arch_info;
41 static const struct or1k_core_reg_init or1k_init_reg_list[] = {
42 {"r0", GROUP0 + 1024, "org.gnu.gdb.or1k.group0", NULL},
43 {"r1", GROUP0 + 1025, "org.gnu.gdb.or1k.group0", NULL},
44 {"r2", GROUP0 + 1026, "org.gnu.gdb.or1k.group0", NULL},
45 {"r3", GROUP0 + 1027, "org.gnu.gdb.or1k.group0", NULL},
46 {"r4", GROUP0 + 1028, "org.gnu.gdb.or1k.group0", NULL},
47 {"r5", GROUP0 + 1029, "org.gnu.gdb.or1k.group0", NULL},
48 {"r6", GROUP0 + 1030, "org.gnu.gdb.or1k.group0", NULL},
49 {"r7", GROUP0 + 1031, "org.gnu.gdb.or1k.group0", NULL},
50 {"r8", GROUP0 + 1032, "org.gnu.gdb.or1k.group0", NULL},
51 {"r9", GROUP0 + 1033, "org.gnu.gdb.or1k.group0", NULL},
52 {"r10", GROUP0 + 1034, "org.gnu.gdb.or1k.group0", NULL},
53 {"r11", GROUP0 + 1035, "org.gnu.gdb.or1k.group0", NULL},
54 {"r12", GROUP0 + 1036, "org.gnu.gdb.or1k.group0", NULL},
55 {"r13", GROUP0 + 1037, "org.gnu.gdb.or1k.group0", NULL},
56 {"r14", GROUP0 + 1038, "org.gnu.gdb.or1k.group0", NULL},
57 {"r15", GROUP0 + 1039, "org.gnu.gdb.or1k.group0", NULL},
58 {"r16", GROUP0 + 1040, "org.gnu.gdb.or1k.group0", NULL},
59 {"r17", GROUP0 + 1041, "org.gnu.gdb.or1k.group0", NULL},
60 {"r18", GROUP0 + 1042, "org.gnu.gdb.or1k.group0", NULL},
61 {"r19", GROUP0 + 1043, "org.gnu.gdb.or1k.group0", NULL},
62 {"r20", GROUP0 + 1044, "org.gnu.gdb.or1k.group0", NULL},
63 {"r21", GROUP0 + 1045, "org.gnu.gdb.or1k.group0", NULL},
64 {"r22", GROUP0 + 1046, "org.gnu.gdb.or1k.group0", NULL},
65 {"r23", GROUP0 + 1047, "org.gnu.gdb.or1k.group0", NULL},
66 {"r24", GROUP0 + 1048, "org.gnu.gdb.or1k.group0", NULL},
67 {"r25", GROUP0 + 1049, "org.gnu.gdb.or1k.group0", NULL},
68 {"r26", GROUP0 + 1050, "org.gnu.gdb.or1k.group0", NULL},
69 {"r27", GROUP0 + 1051, "org.gnu.gdb.or1k.group0", NULL},
70 {"r28", GROUP0 + 1052, "org.gnu.gdb.or1k.group0", NULL},
71 {"r29", GROUP0 + 1053, "org.gnu.gdb.or1k.group0", NULL},
72 {"r30", GROUP0 + 1054, "org.gnu.gdb.or1k.group0", NULL},
73 {"r31", GROUP0 + 1055, "org.gnu.gdb.or1k.group0", NULL},
74 {"ppc", GROUP0 + 18, "org.gnu.gdb.or1k.group0", NULL},
75 {"npc", GROUP0 + 16, "org.gnu.gdb.or1k.group0", NULL},
76 {"sr", GROUP0 + 17, "org.gnu.gdb.or1k.group0", NULL},
77 {"vr", GROUP0 + 0, "org.gnu.gdb.or1k.group0", "system"},
78 {"upr", GROUP0 + 1, "org.gnu.gdb.or1k.group0", "system"},
79 {"cpucfgr", GROUP0 + 2, "org.gnu.gdb.or1k.group0", "system"},
80 {"dmmucfgr", GROUP0 + 3, "org.gnu.gdb.or1k.group0", "system"},
81 {"immucfgr", GROUP0 + 4, "org.gnu.gdb.or1k.group0", "system"},
82 {"dccfgr", GROUP0 + 5, "org.gnu.gdb.or1k.group0", "system"},
83 {"iccfgr", GROUP0 + 6, "org.gnu.gdb.or1k.group0", "system"},
84 {"dcfgr", GROUP0 + 7, "org.gnu.gdb.or1k.group0", "system"},
85 {"pccfgr", GROUP0 + 8, "org.gnu.gdb.or1k.group0", "system"},
86 {"fpcsr", GROUP0 + 20, "org.gnu.gdb.or1k.group0", "system"},
87 {"epcr0", GROUP0 + 32, "org.gnu.gdb.or1k.group0", "system"},
88 {"epcr1", GROUP0 + 33, "org.gnu.gdb.or1k.group0", "system"},
89 {"epcr2", GROUP0 + 34, "org.gnu.gdb.or1k.group0", "system"},
90 {"epcr3", GROUP0 + 35, "org.gnu.gdb.or1k.group0", "system"},
91 {"epcr4", GROUP0 + 36, "org.gnu.gdb.or1k.group0", "system"},
92 {"epcr5", GROUP0 + 37, "org.gnu.gdb.or1k.group0", "system"},
93 {"epcr6", GROUP0 + 38, "org.gnu.gdb.or1k.group0", "system"},
94 {"epcr7", GROUP0 + 39, "org.gnu.gdb.or1k.group0", "system"},
95 {"epcr8", GROUP0 + 40, "org.gnu.gdb.or1k.group0", "system"},
96 {"epcr9", GROUP0 + 41, "org.gnu.gdb.or1k.group0", "system"},
97 {"epcr10", GROUP0 + 42, "org.gnu.gdb.or1k.group0", "system"},
98 {"epcr11", GROUP0 + 43, "org.gnu.gdb.or1k.group0", "system"},
99 {"epcr12", GROUP0 + 44, "org.gnu.gdb.or1k.group0", "system"},
100 {"epcr13", GROUP0 + 45, "org.gnu.gdb.or1k.group0", "system"},
101 {"epcr14", GROUP0 + 46, "org.gnu.gdb.or1k.group0", "system"},
102 {"epcr15", GROUP0 + 47, "org.gnu.gdb.or1k.group0", "system"},
103 {"eear0", GROUP0 + 48, "org.gnu.gdb.or1k.group0", "system"},
104 {"eear1", GROUP0 + 49, "org.gnu.gdb.or1k.group0", "system"},
105 {"eear2", GROUP0 + 50, "org.gnu.gdb.or1k.group0", "system"},
106 {"eear3", GROUP0 + 51, "org.gnu.gdb.or1k.group0", "system"},
107 {"eear4", GROUP0 + 52, "org.gnu.gdb.or1k.group0", "system"},
108 {"eear5", GROUP0 + 53, "org.gnu.gdb.or1k.group0", "system"},
109 {"eear6", GROUP0 + 54, "org.gnu.gdb.or1k.group0", "system"},
110 {"eear7", GROUP0 + 55, "org.gnu.gdb.or1k.group0", "system"},
111 {"eear8", GROUP0 + 56, "org.gnu.gdb.or1k.group0", "system"},
112 {"eear9", GROUP0 + 57, "org.gnu.gdb.or1k.group0", "system"},
113 {"eear10", GROUP0 + 58, "org.gnu.gdb.or1k.group0", "system"},
114 {"eear11", GROUP0 + 59, "org.gnu.gdb.or1k.group0", "system"},
115 {"eear12", GROUP0 + 60, "org.gnu.gdb.or1k.group0", "system"},
116 {"eear13", GROUP0 + 61, "org.gnu.gdb.or1k.group0", "system"},
117 {"eear14", GROUP0 + 62, "org.gnu.gdb.or1k.group0", "system"},
118 {"eear15", GROUP0 + 63, "org.gnu.gdb.or1k.group0", "system"},
119 {"esr0", GROUP0 + 64, "org.gnu.gdb.or1k.group0", "system"},
120 {"esr1", GROUP0 + 65, "org.gnu.gdb.or1k.group0", "system"},
121 {"esr2", GROUP0 + 66, "org.gnu.gdb.or1k.group0", "system"},
122 {"esr3", GROUP0 + 67, "org.gnu.gdb.or1k.group0", "system"},
123 {"esr4", GROUP0 + 68, "org.gnu.gdb.or1k.group0", "system"},
124 {"esr5", GROUP0 + 69, "org.gnu.gdb.or1k.group0", "system"},
125 {"esr6", GROUP0 + 70, "org.gnu.gdb.or1k.group0", "system"},
126 {"esr7", GROUP0 + 71, "org.gnu.gdb.or1k.group0", "system"},
127 {"esr8", GROUP0 + 72, "org.gnu.gdb.or1k.group0", "system"},
128 {"esr9", GROUP0 + 73, "org.gnu.gdb.or1k.group0", "system"},
129 {"esr10", GROUP0 + 74, "org.gnu.gdb.or1k.group0", "system"},
130 {"esr11", GROUP0 + 75, "org.gnu.gdb.or1k.group0", "system"},
131 {"esr12", GROUP0 + 76, "org.gnu.gdb.or1k.group0", "system"},
132 {"esr13", GROUP0 + 77, "org.gnu.gdb.or1k.group0", "system"},
133 {"esr14", GROUP0 + 78, "org.gnu.gdb.or1k.group0", "system"},
134 {"esr15", GROUP0 + 79, "org.gnu.gdb.or1k.group0", "system"},
136 {"dmmuucr", GROUP1 + 0, "org.gnu.gdb.or1k.group1", "dmmu"},
137 {"dmmuupr", GROUP1 + 1, "org.gnu.gdb.or1k.group1", "dmmu"},
138 {"dtlbeir", GROUP1 + 2, "org.gnu.gdb.or1k.group1", "dmmu"},
139 {"datbmr0", GROUP1 + 4, "org.gnu.gdb.or1k.group1", "dmmu"},
140 {"datbmr1", GROUP1 + 5, "org.gnu.gdb.or1k.group1", "dmmu"},
141 {"datbmr2", GROUP1 + 6, "org.gnu.gdb.or1k.group1", "dmmu"},
142 {"datbmr3", GROUP1 + 7, "org.gnu.gdb.or1k.group1", "dmmu"},
143 {"datbtr0", GROUP1 + 8, "org.gnu.gdb.or1k.group1", "dmmu"},
144 {"datbtr1", GROUP1 + 9, "org.gnu.gdb.or1k.group1", "dmmu"},
145 {"datbtr2", GROUP1 + 10, "org.gnu.gdb.or1k.group1", "dmmu"},
146 {"datbtr3", GROUP1 + 11, "org.gnu.gdb.or1k.group1", "dmmu"},
148 {"immucr", GROUP2 + 0, "org.gnu.gdb.or1k.group2", "immu"},
149 {"immupr", GROUP2 + 1, "org.gnu.gdb.or1k.group2", "immu"},
150 {"itlbeir", GROUP2 + 2, "org.gnu.gdb.or1k.group2", "immu"},
151 {"iatbmr0", GROUP2 + 4, "org.gnu.gdb.or1k.group2", "immu"},
152 {"iatbmr1", GROUP2 + 5, "org.gnu.gdb.or1k.group2", "immu"},
153 {"iatbmr2", GROUP2 + 6, "org.gnu.gdb.or1k.group2", "immu"},
154 {"iatbmr3", GROUP2 + 7, "org.gnu.gdb.or1k.group2", "immu"},
155 {"iatbtr0", GROUP2 + 8, "org.gnu.gdb.or1k.group2", "immu"},
156 {"iatbtr1", GROUP2 + 9, "org.gnu.gdb.or1k.group2", "immu"},
157 {"iatbtr2", GROUP2 + 10, "org.gnu.gdb.or1k.group2", "immu"},
158 {"iatbtr3", GROUP2 + 11, "org.gnu.gdb.or1k.group2", "immu"},
160 {"dccr", GROUP3 + 0, "org.gnu.gdb.or1k.group3", "dcache"},
161 {"dcbpr", GROUP3 + 1, "org.gnu.gdb.or1k.group3", "dcache"},
162 {"dcbfr", GROUP3 + 2, "org.gnu.gdb.or1k.group3", "dcache"},
163 {"dcbir", GROUP3 + 3, "org.gnu.gdb.or1k.group3", "dcache"},
164 {"dcbwr", GROUP3 + 4, "org.gnu.gdb.or1k.group3", "dcache"},
165 {"dcblr", GROUP3 + 5, "org.gnu.gdb.or1k.group3", "dcache"},
167 {"iccr", GROUP4 + 0, "org.gnu.gdb.or1k.group4", "icache"},
168 {"icbpr", GROUP4 + 1, "org.gnu.gdb.or1k.group4", "icache"},
169 {"icbir", GROUP4 + 2, "org.gnu.gdb.or1k.group4", "icache"},
170 {"icblr", GROUP4 + 3, "org.gnu.gdb.or1k.group4", "icache"},
172 {"maclo", GROUP5 + 0, "org.gnu.gdb.or1k.group5", "mac"},
173 {"machi", GROUP5 + 1, "org.gnu.gdb.or1k.group5", "mac"},
175 {"dvr0", GROUP6 + 0, "org.gnu.gdb.or1k.group6", "debug"},
176 {"dvr1", GROUP6 + 1, "org.gnu.gdb.or1k.group6", "debug"},
177 {"dvr2", GROUP6 + 2, "org.gnu.gdb.or1k.group6", "debug"},
178 {"dvr3", GROUP6 + 3, "org.gnu.gdb.or1k.group6", "debug"},
179 {"dvr4", GROUP6 + 4, "org.gnu.gdb.or1k.group6", "debug"},
180 {"dvr5", GROUP6 + 5, "org.gnu.gdb.or1k.group6", "debug"},
181 {"dvr6", GROUP6 + 6, "org.gnu.gdb.or1k.group6", "debug"},
182 {"dvr7", GROUP6 + 7, "org.gnu.gdb.or1k.group6", "debug"},
183 {"dcr0", GROUP6 + 8, "org.gnu.gdb.or1k.group6", "debug"},
184 {"dcr1", GROUP6 + 9, "org.gnu.gdb.or1k.group6", "debug"},
185 {"dcr2", GROUP6 + 10, "org.gnu.gdb.or1k.group6", "debug"},
186 {"dcr3", GROUP6 + 11, "org.gnu.gdb.or1k.group6", "debug"},
187 {"dcr4", GROUP6 + 12, "org.gnu.gdb.or1k.group6", "debug"},
188 {"dcr5", GROUP6 + 13, "org.gnu.gdb.or1k.group6", "debug"},
189 {"dcr6", GROUP6 + 14, "org.gnu.gdb.or1k.group6", "debug"},
190 {"dcr7", GROUP6 + 15, "org.gnu.gdb.or1k.group6", "debug"},
191 {"dmr1", GROUP6 + 16, "org.gnu.gdb.or1k.group6", "debug"},
192 {"dmr2", GROUP6 + 17, "org.gnu.gdb.or1k.group6", "debug"},
193 {"dcwr0", GROUP6 + 18, "org.gnu.gdb.or1k.group6", "debug"},
194 {"dcwr1", GROUP6 + 19, "org.gnu.gdb.or1k.group6", "debug"},
195 {"dsr", GROUP6 + 20, "org.gnu.gdb.or1k.group6", "debug"},
196 {"drr", GROUP6 + 21, "org.gnu.gdb.or1k.group6", "debug"},
198 {"pccr0", GROUP7 + 0, "org.gnu.gdb.or1k.group7", "perf"},
199 {"pccr1", GROUP7 + 1, "org.gnu.gdb.or1k.group7", "perf"},
200 {"pccr2", GROUP7 + 2, "org.gnu.gdb.or1k.group7", "perf"},
201 {"pccr3", GROUP7 + 3, "org.gnu.gdb.or1k.group7", "perf"},
202 {"pccr4", GROUP7 + 4, "org.gnu.gdb.or1k.group7", "perf"},
203 {"pccr5", GROUP7 + 5, "org.gnu.gdb.or1k.group7", "perf"},
204 {"pccr6", GROUP7 + 6, "org.gnu.gdb.or1k.group7", "perf"},
205 {"pccr7", GROUP7 + 7, "org.gnu.gdb.or1k.group7", "perf"},
206 {"pcmr0", GROUP7 + 8, "org.gnu.gdb.or1k.group7", "perf"},
207 {"pcmr1", GROUP7 + 9, "org.gnu.gdb.or1k.group7", "perf"},
208 {"pcmr2", GROUP7 + 10, "org.gnu.gdb.or1k.group7", "perf"},
209 {"pcmr3", GROUP7 + 11, "org.gnu.gdb.or1k.group7", "perf"},
210 {"pcmr4", GROUP7 + 12, "org.gnu.gdb.or1k.group7", "perf"},
211 {"pcmr5", GROUP7 + 13, "org.gnu.gdb.or1k.group7", "perf"},
212 {"pcmr6", GROUP7 + 14, "org.gnu.gdb.or1k.group7", "perf"},
213 {"pcmr7", GROUP7 + 15, "org.gnu.gdb.or1k.group7", "perf"},
215 {"pmr", GROUP8 + 0, "org.gnu.gdb.or1k.group8", "power"},
217 {"picmr", GROUP9 + 0, "org.gnu.gdb.or1k.group9", "pic"},
218 {"picsr", GROUP9 + 2, "org.gnu.gdb.or1k.group9", "pic"},
220 {"ttmr", GROUP10 + 0, "org.gnu.gdb.or1k.group10", "timer"},
221 {"ttcr", GROUP10 + 1, "org.gnu.gdb.or1k.group10", "timer"},
224 static int or1k_add_reg(struct target *target, struct or1k_core_reg *new_reg)
226 struct or1k_common *or1k = target_to_or1k(target);
227 int reg_list_size = or1k->nb_regs * sizeof(struct or1k_core_reg);
229 or1k_core_reg_list_arch_info = realloc(or1k_core_reg_list_arch_info,
230 reg_list_size + sizeof(struct or1k_core_reg));
232 memcpy(&or1k_core_reg_list_arch_info[or1k->nb_regs], new_reg,
233 sizeof(struct or1k_core_reg));
235 or1k_core_reg_list_arch_info[or1k->nb_regs].list_num = or1k->nb_regs;
237 or1k->nb_regs++;
239 return ERROR_OK;
242 static int or1k_create_reg_list(struct target *target)
244 struct or1k_common *or1k = target_to_or1k(target);
246 LOG_DEBUG("-");
248 or1k_core_reg_list_arch_info = malloc(ARRAY_SIZE(or1k_init_reg_list) *
249 sizeof(struct or1k_core_reg));
251 for (int i = 0; i < (int)ARRAY_SIZE(or1k_init_reg_list); i++) {
252 or1k_core_reg_list_arch_info[i].name = or1k_init_reg_list[i].name;
253 or1k_core_reg_list_arch_info[i].spr_num = or1k_init_reg_list[i].spr_num;
254 or1k_core_reg_list_arch_info[i].group = or1k_init_reg_list[i].group;
255 or1k_core_reg_list_arch_info[i].feature = or1k_init_reg_list[i].feature;
256 or1k_core_reg_list_arch_info[i].list_num = i;
257 or1k_core_reg_list_arch_info[i].target = NULL;
258 or1k_core_reg_list_arch_info[i].or1k_common = NULL;
261 or1k->nb_regs = ARRAY_SIZE(or1k_init_reg_list);
263 struct or1k_core_reg new_reg;
264 new_reg.target = NULL;
265 new_reg.or1k_common = NULL;
267 char name[32];
268 for (int way = 0; way < 4; way++) {
269 for (int i = 0; i < 128; i++) {
271 sprintf(name, "dtlbw%dmr%d", way, i);
272 new_reg.name = strdup(name);
273 new_reg.spr_num = GROUP1 + 512 + i + (way * 256);
274 new_reg.feature = "org.gnu.gdb.or1k.group1";
275 new_reg.group = "dmmu";
276 or1k_add_reg(target, &new_reg);
278 sprintf(name, "dtlbw%dtr%d", way, i);
279 new_reg.name = strdup(name);
280 new_reg.spr_num = GROUP1 + 640 + i + (way * 256);
281 new_reg.feature = "org.gnu.gdb.or1k.group1";
282 new_reg.group = "dmmu";
283 or1k_add_reg(target, &new_reg);
286 sprintf(name, "itlbw%dmr%d", way, i);
287 new_reg.name = strdup(name);
288 new_reg.spr_num = GROUP2 + 512 + i + (way * 256);
289 new_reg.feature = "org.gnu.gdb.or1k.group2";
290 new_reg.group = "immu";
291 or1k_add_reg(target, &new_reg);
294 sprintf(name, "itlbw%dtr%d", way, i);
295 new_reg.name = strdup(name);
296 new_reg.spr_num = GROUP2 + 640 + i + (way * 256);
297 new_reg.feature = "org.gnu.gdb.or1k.group2";
298 new_reg.group = "immu";
299 or1k_add_reg(target, &new_reg);
304 return ERROR_OK;
307 static int or1k_jtag_read_regs(struct or1k_common *or1k, uint32_t *regs)
309 struct or1k_du *du_core = or1k_jtag_to_du(&or1k->jtag);
311 LOG_DEBUG("-");
313 return du_core->or1k_jtag_read_cpu(&or1k->jtag,
314 or1k->arch_info[OR1K_REG_R0].spr_num, OR1K_REG_R31 + 1,
315 regs + OR1K_REG_R0);
318 static int or1k_jtag_write_regs(struct or1k_common *or1k, uint32_t *regs)
320 struct or1k_du *du_core = or1k_jtag_to_du(&or1k->jtag);
322 LOG_DEBUG("-");
324 return du_core->or1k_jtag_write_cpu(&or1k->jtag,
325 or1k->arch_info[OR1K_REG_R0].spr_num, OR1K_REG_R31 + 1,
326 &regs[OR1K_REG_R0]);
329 static int or1k_save_context(struct target *target)
331 struct or1k_common *or1k = target_to_or1k(target);
332 struct or1k_du *du_core = or1k_to_du(or1k);
333 int regs_read = 0;
334 int retval;
336 LOG_DEBUG("-");
338 for (int i = 0; i < OR1KNUMCOREREGS; i++) {
339 if (!or1k->core_cache->reg_list[i].valid) {
340 if (i == OR1K_REG_PPC || i == OR1K_REG_NPC || i == OR1K_REG_SR) {
341 retval = du_core->or1k_jtag_read_cpu(&or1k->jtag,
342 or1k->arch_info[i].spr_num, 1,
343 &or1k->core_regs[i]);
344 if (retval != ERROR_OK)
345 return retval;
346 } else if (!regs_read) {
347 /* read gpr registers at once (but only one time in this loop) */
348 retval = or1k_jtag_read_regs(or1k, or1k->core_regs);
349 if (retval != ERROR_OK)
350 return retval;
351 /* prevent next reads in this loop */
352 regs_read = 1;
354 /* We've just updated the core_reg[i], now update
355 the core cache */
356 or1k_read_core_reg(target, i);
360 return ERROR_OK;
363 static int or1k_restore_context(struct target *target)
365 struct or1k_common *or1k = target_to_or1k(target);
366 struct or1k_du *du_core = or1k_to_du(or1k);
367 int reg_write = 0;
368 int retval;
370 LOG_DEBUG("-");
372 for (int i = 0; i < OR1KNUMCOREREGS; i++) {
373 if (or1k->core_cache->reg_list[i].dirty) {
374 or1k_write_core_reg(target, i);
376 if (i == OR1K_REG_PPC || i == OR1K_REG_NPC || i == OR1K_REG_SR) {
377 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
378 or1k->arch_info[i].spr_num, 1,
379 &or1k->core_regs[i]);
380 if (retval != ERROR_OK) {
381 LOG_ERROR("Error while restoring context");
382 return retval;
384 } else
385 reg_write = 1;
389 if (reg_write) {
390 /* read gpr registers at once (but only one time in this loop) */
391 retval = or1k_jtag_write_regs(or1k, or1k->core_regs);
392 if (retval != ERROR_OK) {
393 LOG_ERROR("Error while restoring context");
394 return retval;
398 return ERROR_OK;
401 static int or1k_read_core_reg(struct target *target, int num)
403 struct or1k_common *or1k = target_to_or1k(target);
404 struct or1k_du *du_core = or1k_to_du(or1k);
405 uint32_t reg_value;
407 LOG_DEBUG("-");
409 if ((num < 0) || (num >= or1k->nb_regs))
410 return ERROR_COMMAND_SYNTAX_ERROR;
412 if ((num >= 0) && (num < OR1KNUMCOREREGS)) {
413 reg_value = or1k->core_regs[num];
414 buf_set_u32(or1k->core_cache->reg_list[num].value, 0, 32, reg_value);
415 LOG_DEBUG("Read core reg %i value 0x%08" PRIx32, num, reg_value);
416 or1k->core_cache->reg_list[num].valid = true;
417 or1k->core_cache->reg_list[num].dirty = false;
418 } else {
419 /* This is an spr, always read value from HW */
420 int retval = du_core->or1k_jtag_read_cpu(&or1k->jtag,
421 or1k->arch_info[num].spr_num, 1, &reg_value);
422 if (retval != ERROR_OK) {
423 LOG_ERROR("Error while reading spr 0x%08" PRIx32, or1k->arch_info[num].spr_num);
424 return retval;
426 buf_set_u32(or1k->core_cache->reg_list[num].value, 0, 32, reg_value);
427 LOG_DEBUG("Read spr reg %i value 0x%08" PRIx32, num, reg_value);
430 return ERROR_OK;
433 static int or1k_write_core_reg(struct target *target, int num)
435 struct or1k_common *or1k = target_to_or1k(target);
437 LOG_DEBUG("-");
439 if ((num < 0) || (num >= OR1KNUMCOREREGS))
440 return ERROR_COMMAND_SYNTAX_ERROR;
442 uint32_t reg_value = buf_get_u32(or1k->core_cache->reg_list[num].value, 0, 32);
443 or1k->core_regs[num] = reg_value;
444 LOG_DEBUG("Write core reg %i value 0x%08" PRIx32, num, reg_value);
445 or1k->core_cache->reg_list[num].valid = true;
446 or1k->core_cache->reg_list[num].dirty = false;
448 return ERROR_OK;
451 static int or1k_get_core_reg(struct reg *reg)
453 struct or1k_core_reg *or1k_reg = reg->arch_info;
454 struct target *target = or1k_reg->target;
456 LOG_DEBUG("-");
458 if (target->state != TARGET_HALTED)
459 return ERROR_TARGET_NOT_HALTED;
461 return or1k_read_core_reg(target, or1k_reg->list_num);
464 static int or1k_set_core_reg(struct reg *reg, uint8_t *buf)
466 struct or1k_core_reg *or1k_reg = reg->arch_info;
467 struct target *target = or1k_reg->target;
468 struct or1k_common *or1k = target_to_or1k(target);
469 struct or1k_du *du_core = or1k_to_du(or1k);
470 uint32_t value = buf_get_u32(buf, 0, 32);
472 LOG_DEBUG("-");
474 if (target->state != TARGET_HALTED)
475 return ERROR_TARGET_NOT_HALTED;
477 if (or1k_reg->list_num < OR1KNUMCOREREGS) {
478 buf_set_u32(reg->value, 0, 32, value);
479 reg->dirty = true;
480 reg->valid = true;
481 } else {
482 /* This is an spr, write it to the HW */
483 int retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
484 or1k_reg->spr_num, 1, &value);
485 if (retval != ERROR_OK) {
486 LOG_ERROR("Error while writing spr 0x%08" PRIx32, or1k_reg->spr_num);
487 return retval;
491 return ERROR_OK;
494 static const struct reg_arch_type or1k_reg_type = {
495 .get = or1k_get_core_reg,
496 .set = or1k_set_core_reg,
499 static struct reg_cache *or1k_build_reg_cache(struct target *target)
501 struct or1k_common *or1k = target_to_or1k(target);
502 struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
503 struct reg_cache *cache = malloc(sizeof(struct reg_cache));
504 struct reg *reg_list = calloc(or1k->nb_regs, sizeof(struct reg));
505 struct or1k_core_reg *arch_info =
506 malloc((or1k->nb_regs) * sizeof(struct or1k_core_reg));
507 struct reg_feature *feature;
509 LOG_DEBUG("-");
511 /* Build the process context cache */
512 cache->name = "OpenRISC 1000 registers";
513 cache->next = NULL;
514 cache->reg_list = reg_list;
515 cache->num_regs = or1k->nb_regs;
516 (*cache_p) = cache;
517 or1k->core_cache = cache;
518 or1k->arch_info = arch_info;
520 for (int i = 0; i < or1k->nb_regs; i++) {
521 arch_info[i] = or1k_core_reg_list_arch_info[i];
522 arch_info[i].target = target;
523 arch_info[i].or1k_common = or1k;
524 reg_list[i].name = or1k_core_reg_list_arch_info[i].name;
526 feature = malloc(sizeof(struct reg_feature));
527 feature->name = or1k_core_reg_list_arch_info[i].feature;
528 reg_list[i].feature = feature;
530 reg_list[i].group = or1k_core_reg_list_arch_info[i].group;
531 reg_list[i].size = 32;
532 reg_list[i].value = calloc(1, 4);
533 reg_list[i].dirty = false;
534 reg_list[i].valid = false;
535 reg_list[i].type = &or1k_reg_type;
536 reg_list[i].arch_info = &arch_info[i];
537 reg_list[i].number = i;
538 reg_list[i].exist = true;
541 return cache;
544 static int or1k_debug_entry(struct target *target)
546 LOG_DEBUG("-");
548 int retval = or1k_save_context(target);
549 if (retval != ERROR_OK) {
550 LOG_ERROR("Error while calling or1k_save_context");
551 return retval;
554 struct or1k_common *or1k = target_to_or1k(target);
555 uint32_t addr = or1k->core_regs[OR1K_REG_NPC];
557 if (breakpoint_find(target, addr))
558 /* Halted on a breakpoint, step back to permit executing the instruction there */
559 retval = or1k_set_core_reg(&or1k->core_cache->reg_list[OR1K_REG_NPC],
560 (uint8_t *)&addr);
562 return retval;
565 static int or1k_halt(struct target *target)
567 struct or1k_common *or1k = target_to_or1k(target);
568 struct or1k_du *du_core = or1k_to_du(or1k);
570 LOG_DEBUG("target->state: %s",
571 target_state_name(target));
573 if (target->state == TARGET_HALTED) {
574 LOG_DEBUG("Target was already halted");
575 return ERROR_OK;
578 if (target->state == TARGET_UNKNOWN)
579 LOG_WARNING("Target was in unknown state when halt was requested");
581 if (target->state == TARGET_RESET) {
582 if ((jtag_get_reset_config() & RESET_SRST_PULLS_TRST) &&
583 jtag_get_srst()) {
584 LOG_ERROR("Can't request a halt while in reset if nSRST pulls nTRST");
585 return ERROR_TARGET_FAILURE;
586 } else {
587 target->debug_reason = DBG_REASON_DBGRQ;
588 return ERROR_OK;
592 int retval = du_core->or1k_cpu_stall(&or1k->jtag, CPU_STALL);
593 if (retval != ERROR_OK) {
594 LOG_ERROR("Impossible to stall the CPU");
595 return retval;
598 target->debug_reason = DBG_REASON_DBGRQ;
600 return ERROR_OK;
603 static int or1k_is_cpu_running(struct target *target, int *running)
605 struct or1k_common *or1k = target_to_or1k(target);
606 struct or1k_du *du_core = or1k_to_du(or1k);
607 int retval;
608 int tries = 0;
609 const int RETRIES_MAX = 5;
611 /* Have a retry loop to determine of the CPU is running.
612 If target has been hard reset for any reason, it might take a couple
613 of goes before it's ready again.
615 while (tries < RETRIES_MAX) {
617 tries++;
619 retval = du_core->or1k_is_cpu_running(&or1k->jtag, running);
620 if (retval != ERROR_OK) {
621 LOG_WARNING("Debug IF CPU control reg read failure.");
622 /* Try once to restart the JTAG infrastructure -
623 quite possibly the board has just been reset. */
624 LOG_WARNING("Resetting JTAG TAP state and reconnecting to debug IF.");
625 du_core->or1k_jtag_init(&or1k->jtag);
627 LOG_WARNING("...attempt %d of %d", tries, RETRIES_MAX);
629 alive_sleep(2);
631 continue;
632 } else
633 return ERROR_OK;
636 LOG_ERROR("Could not re-establish communication with target");
637 return retval;
640 static int or1k_poll(struct target *target)
642 int retval;
643 int running;
645 retval = or1k_is_cpu_running(target, &running);
646 if (retval != ERROR_OK) {
647 LOG_ERROR("Error while calling or1k_is_cpu_running");
648 return retval;
651 /* check for processor halted */
652 if (!running) {
653 /* It's actually stalled, so update our software's state */
654 if ((target->state == TARGET_RUNNING) ||
655 (target->state == TARGET_RESET)) {
657 target->state = TARGET_HALTED;
659 retval = or1k_debug_entry(target);
660 if (retval != ERROR_OK) {
661 LOG_ERROR("Error while calling or1k_debug_entry");
662 return retval;
665 target_call_event_callbacks(target,
666 TARGET_EVENT_HALTED);
667 } else if (target->state == TARGET_DEBUG_RUNNING) {
668 target->state = TARGET_HALTED;
670 retval = or1k_debug_entry(target);
671 if (retval != ERROR_OK) {
672 LOG_ERROR("Error while calling or1k_debug_entry");
673 return retval;
676 target_call_event_callbacks(target,
677 TARGET_EVENT_DEBUG_HALTED);
679 } else { /* ... target is running */
681 /* If target was supposed to be stalled, stall it again */
682 if (target->state == TARGET_HALTED) {
684 target->state = TARGET_RUNNING;
686 retval = or1k_halt(target);
687 if (retval != ERROR_OK) {
688 LOG_ERROR("Error while calling or1k_halt");
689 return retval;
692 retval = or1k_debug_entry(target);
693 if (retval != ERROR_OK) {
694 LOG_ERROR("Error while calling or1k_debug_entry");
695 return retval;
698 target_call_event_callbacks(target,
699 TARGET_EVENT_DEBUG_HALTED);
702 target->state = TARGET_RUNNING;
706 return ERROR_OK;
709 static int or1k_assert_reset(struct target *target)
711 struct or1k_common *or1k = target_to_or1k(target);
712 struct or1k_du *du_core = or1k_to_du(or1k);
714 LOG_DEBUG("-");
716 int retval = du_core->or1k_cpu_reset(&or1k->jtag, CPU_RESET);
717 if (retval != ERROR_OK) {
718 LOG_ERROR("Error while asserting RESET");
719 return retval;
722 return ERROR_OK;
725 static int or1k_deassert_reset(struct target *target)
727 struct or1k_common *or1k = target_to_or1k(target);
728 struct or1k_du *du_core = or1k_to_du(or1k);
730 LOG_DEBUG("-");
732 int retval = du_core->or1k_cpu_reset(&or1k->jtag, CPU_NOT_RESET);
733 if (retval != ERROR_OK) {
734 LOG_ERROR("Error while deasserting RESET");
735 return retval;
738 return ERROR_OK;
741 static int or1k_soft_reset_halt(struct target *target)
743 struct or1k_common *or1k = target_to_or1k(target);
744 struct or1k_du *du_core = or1k_to_du(or1k);
746 LOG_DEBUG("-");
748 int retval = du_core->or1k_cpu_stall(&or1k->jtag, CPU_STALL);
749 if (retval != ERROR_OK) {
750 LOG_ERROR("Error while stalling the CPU");
751 return retval;
754 retval = or1k_assert_reset(target);
755 if (retval != ERROR_OK)
756 return retval;
758 retval = or1k_deassert_reset(target);
759 if (retval != ERROR_OK)
760 return retval;
762 return ERROR_OK;
765 static bool is_any_soft_breakpoint(struct target *target)
767 struct breakpoint *breakpoint = target->breakpoints;
769 LOG_DEBUG("-");
771 while (breakpoint)
772 if (breakpoint->type == BKPT_SOFT)
773 return true;
775 return false;
778 static int or1k_resume_or_step(struct target *target, int current,
779 uint32_t address, int handle_breakpoints,
780 int debug_execution, int step)
782 struct or1k_common *or1k = target_to_or1k(target);
783 struct or1k_du *du_core = or1k_to_du(or1k);
784 struct breakpoint *breakpoint = NULL;
785 uint32_t resume_pc;
786 uint32_t debug_reg_list[OR1K_DEBUG_REG_NUM];
788 LOG_DEBUG("Addr: 0x%" PRIx32 ", stepping: %s, handle breakpoints %s\n",
789 address, step ? "yes" : "no", handle_breakpoints ? "yes" : "no");
791 if (target->state != TARGET_HALTED) {
792 LOG_TARGET_ERROR(target, "not halted");
793 return ERROR_TARGET_NOT_HALTED;
796 if (!debug_execution)
797 target_free_all_working_areas(target);
799 /* current ? continue on current pc : continue at <address> */
800 if (!current)
801 buf_set_u32(or1k->core_cache->reg_list[OR1K_REG_NPC].value, 0,
802 32, address);
804 int retval = or1k_restore_context(target);
805 if (retval != ERROR_OK) {
806 LOG_ERROR("Error while calling or1k_restore_context");
807 return retval;
810 /* read debug registers (starting from DMR1 register) */
811 retval = du_core->or1k_jtag_read_cpu(&or1k->jtag, OR1K_DMR1_CPU_REG_ADD,
812 OR1K_DEBUG_REG_NUM, debug_reg_list);
813 if (retval != ERROR_OK) {
814 LOG_ERROR("Error while reading debug registers");
815 return retval;
818 /* Clear Debug Reason Register (DRR) */
819 debug_reg_list[OR1K_DEBUG_REG_DRR] = 0;
821 /* Clear watchpoint break generation in Debug Mode Register 2 (DMR2) */
822 debug_reg_list[OR1K_DEBUG_REG_DMR2] &= ~OR1K_DMR2_WGB;
823 if (step)
824 /* Set the single step trigger in Debug Mode Register 1 (DMR1) */
825 debug_reg_list[OR1K_DEBUG_REG_DMR1] |= OR1K_DMR1_ST | OR1K_DMR1_BT;
826 else
827 /* Clear the single step trigger in Debug Mode Register 1 (DMR1) */
828 debug_reg_list[OR1K_DEBUG_REG_DMR1] &= ~(OR1K_DMR1_ST | OR1K_DMR1_BT);
830 /* Set traps to be handled by the debug unit in the Debug Stop
831 Register (DSR). Check if we have any software breakpoints in
832 place before setting this value - the kernel, for instance,
833 relies on l.trap instructions not stalling the processor ! */
834 if (is_any_soft_breakpoint(target) == true)
835 debug_reg_list[OR1K_DEBUG_REG_DSR] |= OR1K_DSR_TE;
837 /* Write debug registers (starting from DMR1 register) */
838 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag, OR1K_DMR1_CPU_REG_ADD,
839 OR1K_DEBUG_REG_NUM, debug_reg_list);
840 if (retval != ERROR_OK) {
841 LOG_ERROR("Error while writing back debug registers");
842 return retval;
845 resume_pc = buf_get_u32(or1k->core_cache->reg_list[OR1K_REG_NPC].value,
846 0, 32);
848 /* The front-end may request us not to handle breakpoints */
849 if (handle_breakpoints) {
850 /* Single step past breakpoint at current address */
851 breakpoint = breakpoint_find(target, resume_pc);
852 if (breakpoint) {
853 LOG_DEBUG("Unset breakpoint at 0x%08" TARGET_PRIxADDR, breakpoint->address);
854 retval = or1k_remove_breakpoint(target, breakpoint);
855 if (retval != ERROR_OK)
856 return retval;
860 /* Unstall time */
861 retval = du_core->or1k_cpu_stall(&or1k->jtag, CPU_UNSTALL);
862 if (retval != ERROR_OK) {
863 LOG_ERROR("Error while unstalling the CPU");
864 return retval;
867 if (step)
868 target->debug_reason = DBG_REASON_SINGLESTEP;
869 else
870 target->debug_reason = DBG_REASON_NOTHALTED;
872 /* Registers are now invalid */
873 register_cache_invalidate(or1k->core_cache);
875 if (!debug_execution) {
876 target->state = TARGET_RUNNING;
877 target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
878 LOG_DEBUG("Target resumed at 0x%08" PRIx32, resume_pc);
879 } else {
880 target->state = TARGET_DEBUG_RUNNING;
881 target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
882 LOG_DEBUG("Target debug resumed at 0x%08" PRIx32, resume_pc);
885 return ERROR_OK;
888 static int or1k_resume(struct target *target, int current,
889 target_addr_t address, int handle_breakpoints,
890 int debug_execution)
892 return or1k_resume_or_step(target, current, address,
893 handle_breakpoints,
894 debug_execution,
895 NO_SINGLE_STEP);
898 static int or1k_step(struct target *target, int current,
899 target_addr_t address, int handle_breakpoints)
901 return or1k_resume_or_step(target, current, address,
902 handle_breakpoints,
904 SINGLE_STEP);
908 static int or1k_add_breakpoint(struct target *target,
909 struct breakpoint *breakpoint)
911 struct or1k_common *or1k = target_to_or1k(target);
912 struct or1k_du *du_core = or1k_to_du(or1k);
913 uint8_t data;
915 LOG_DEBUG("Adding breakpoint: addr 0x%08" TARGET_PRIxADDR ", len %d, type %d, id: %" PRIu32,
916 breakpoint->address, breakpoint->length, breakpoint->type,
917 breakpoint->unique_id);
919 /* Only support SW breakpoints for now. */
920 if (breakpoint->type == BKPT_HARD)
921 LOG_ERROR("HW breakpoints not supported for now. Doing SW breakpoint.");
923 /* Read and save the instruction */
924 int retval = du_core->or1k_jtag_read_memory(&or1k->jtag,
925 breakpoint->address,
928 &data);
929 if (retval != ERROR_OK) {
930 LOG_ERROR("Error while reading the instruction at 0x%08" TARGET_PRIxADDR,
931 breakpoint->address);
932 return retval;
935 free(breakpoint->orig_instr);
937 breakpoint->orig_instr = malloc(breakpoint->length);
938 memcpy(breakpoint->orig_instr, &data, breakpoint->length);
940 /* Sub in the OR1K trap instruction */
941 uint8_t or1k_trap_insn[4];
942 target_buffer_set_u32(target, or1k_trap_insn, OR1K_TRAP_INSTR);
943 retval = du_core->or1k_jtag_write_memory(&or1k->jtag,
944 breakpoint->address,
947 or1k_trap_insn);
949 if (retval != ERROR_OK) {
950 LOG_ERROR("Error while writing OR1K_TRAP_INSTR at 0x%08" TARGET_PRIxADDR,
951 breakpoint->address);
952 return retval;
955 /* invalidate instruction cache */
956 uint32_t addr = breakpoint->address;
957 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
958 OR1K_ICBIR_CPU_REG_ADD, 1, &addr);
959 if (retval != ERROR_OK) {
960 LOG_ERROR("Error while invalidating the ICACHE");
961 return retval;
964 return ERROR_OK;
967 static int or1k_remove_breakpoint(struct target *target,
968 struct breakpoint *breakpoint)
970 struct or1k_common *or1k = target_to_or1k(target);
971 struct or1k_du *du_core = or1k_to_du(or1k);
973 LOG_DEBUG("Removing breakpoint: addr 0x%08" TARGET_PRIxADDR ", len %d, type %d, id: %" PRIu32,
974 breakpoint->address, breakpoint->length, breakpoint->type,
975 breakpoint->unique_id);
977 /* Only support SW breakpoints for now. */
978 if (breakpoint->type == BKPT_HARD)
979 LOG_ERROR("HW breakpoints not supported for now. Doing SW breakpoint.");
981 /* Replace the removed instruction */
982 int retval = du_core->or1k_jtag_write_memory(&or1k->jtag,
983 breakpoint->address,
986 breakpoint->orig_instr);
988 if (retval != ERROR_OK) {
989 LOG_ERROR("Error while writing back the instruction at 0x%08" TARGET_PRIxADDR,
990 breakpoint->address);
991 return retval;
994 /* invalidate instruction cache */
995 uint32_t addr = breakpoint->address;
996 retval = du_core->or1k_jtag_write_cpu(&or1k->jtag,
997 OR1K_ICBIR_CPU_REG_ADD, 1, &addr);
998 if (retval != ERROR_OK) {
999 LOG_ERROR("Error while invalidating the ICACHE");
1000 return retval;
1003 return ERROR_OK;
1006 static int or1k_add_watchpoint(struct target *target,
1007 struct watchpoint *watchpoint)
1009 LOG_ERROR("%s: implement me", __func__);
1010 return ERROR_OK;
1013 static int or1k_remove_watchpoint(struct target *target,
1014 struct watchpoint *watchpoint)
1016 LOG_ERROR("%s: implement me", __func__);
1017 return ERROR_OK;
1020 static int or1k_read_memory(struct target *target, target_addr_t address,
1021 uint32_t size, uint32_t count, uint8_t *buffer)
1023 struct or1k_common *or1k = target_to_or1k(target);
1024 struct or1k_du *du_core = or1k_to_du(or1k);
1026 LOG_DEBUG("Read memory at 0x%08" TARGET_PRIxADDR ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
1028 if (target->state != TARGET_HALTED) {
1029 LOG_TARGET_ERROR(target, "not halted");
1030 return ERROR_TARGET_NOT_HALTED;
1033 /* Sanitize arguments */
1034 if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !buffer) {
1035 LOG_ERROR("Bad arguments");
1036 return ERROR_COMMAND_SYNTAX_ERROR;
1039 if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u))) {
1040 LOG_ERROR("Can't handle unaligned memory access");
1041 return ERROR_TARGET_UNALIGNED_ACCESS;
1044 return du_core->or1k_jtag_read_memory(&or1k->jtag, address, size, count, buffer);
1047 static int or1k_write_memory(struct target *target, target_addr_t address,
1048 uint32_t size, uint32_t count, const uint8_t *buffer)
1050 struct or1k_common *or1k = target_to_or1k(target);
1051 struct or1k_du *du_core = or1k_to_du(or1k);
1053 LOG_DEBUG("Write memory at 0x%08" TARGET_PRIxADDR ", size: %" PRIu32 ", count: 0x%08" PRIx32, address, size, count);
1055 if (target->state != TARGET_HALTED) {
1056 LOG_TARGET_ERROR(target, "not halted");
1057 return ERROR_TARGET_NOT_HALTED;
1060 /* Sanitize arguments */
1061 if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !buffer) {
1062 LOG_ERROR("Bad arguments");
1063 return ERROR_COMMAND_SYNTAX_ERROR;
1066 if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u))) {
1067 LOG_ERROR("Can't handle unaligned memory access");
1068 return ERROR_TARGET_UNALIGNED_ACCESS;
1071 return du_core->or1k_jtag_write_memory(&or1k->jtag, address, size, count, buffer);
1074 static int or1k_init_target(struct command_context *cmd_ctx,
1075 struct target *target)
1077 struct or1k_common *or1k = target_to_or1k(target);
1078 struct or1k_du *du_core = or1k_to_du(or1k);
1079 struct or1k_jtag *jtag = &or1k->jtag;
1081 if (!du_core) {
1082 LOG_ERROR("No debug unit selected");
1083 return ERROR_FAIL;
1086 if (!jtag->tap_ip) {
1087 LOG_ERROR("No tap selected");
1088 return ERROR_FAIL;
1091 or1k->jtag.tap = target->tap;
1092 or1k->jtag.or1k_jtag_inited = 0;
1093 or1k->jtag.or1k_jtag_module_selected = -1;
1094 or1k->jtag.target = target;
1096 or1k_build_reg_cache(target);
1098 return ERROR_OK;
1101 static int or1k_target_create(struct target *target, Jim_Interp *interp)
1103 if (!target->tap)
1104 return ERROR_FAIL;
1106 struct or1k_common *or1k = calloc(1, sizeof(struct or1k_common));
1108 target->arch_info = or1k;
1110 or1k_create_reg_list(target);
1112 or1k_tap_vjtag_register();
1113 or1k_tap_xilinx_bscan_register();
1114 or1k_tap_mohor_register();
1116 or1k_du_adv_register();
1118 return ERROR_OK;
1121 static int or1k_examine(struct target *target)
1123 struct or1k_common *or1k = target_to_or1k(target);
1124 struct or1k_du *du_core = or1k_to_du(or1k);
1126 if (!target_was_examined(target)) {
1128 target_set_examined(target);
1130 int running;
1132 int retval = du_core->or1k_is_cpu_running(&or1k->jtag, &running);
1133 if (retval != ERROR_OK) {
1134 LOG_ERROR("Couldn't read the CPU state");
1135 return retval;
1136 } else {
1137 if (running)
1138 target->state = TARGET_RUNNING;
1139 else {
1140 LOG_DEBUG("Target is halted");
1142 /* This is the first time we examine the target,
1143 * it is stalled and we don't know why. Let's
1144 * assume this is because of a debug reason.
1146 if (target->state == TARGET_UNKNOWN)
1147 target->debug_reason = DBG_REASON_DBGRQ;
1149 target->state = TARGET_HALTED;
1154 return ERROR_OK;
1157 static int or1k_arch_state(struct target *target)
1159 return ERROR_OK;
1162 static int or1k_get_gdb_reg_list(struct target *target, struct reg **reg_list[],
1163 int *reg_list_size, enum target_register_class reg_class)
1165 struct or1k_common *or1k = target_to_or1k(target);
1167 if (reg_class == REG_CLASS_GENERAL) {
1168 /* We will have this called whenever GDB connects. */
1169 int retval = or1k_save_context(target);
1170 if (retval != ERROR_OK) {
1171 LOG_ERROR("Error while calling or1k_save_context");
1172 return retval;
1174 *reg_list_size = OR1KNUMCOREREGS;
1175 /* this is free()'d back in gdb_server.c's gdb_get_register_packet() */
1176 *reg_list = malloc((*reg_list_size) * sizeof(struct reg *));
1178 for (int i = 0; i < OR1KNUMCOREREGS; i++)
1179 (*reg_list)[i] = &or1k->core_cache->reg_list[i];
1180 } else {
1181 *reg_list_size = or1k->nb_regs;
1182 *reg_list = malloc((*reg_list_size) * sizeof(struct reg *));
1184 for (int i = 0; i < or1k->nb_regs; i++)
1185 (*reg_list)[i] = &or1k->core_cache->reg_list[i];
1188 return ERROR_OK;
1192 static int or1k_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
1194 return ERROR_FAIL;
1197 static int or1k_checksum_memory(struct target *target, target_addr_t address,
1198 uint32_t count, uint32_t *checksum)
1200 return ERROR_FAIL;
1203 static int or1k_profiling(struct target *target, uint32_t *samples,
1204 uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
1206 struct timeval timeout, now;
1207 struct or1k_common *or1k = target_to_or1k(target);
1208 struct or1k_du *du_core = or1k_to_du(or1k);
1209 int retval = ERROR_OK;
1211 gettimeofday(&timeout, NULL);
1212 timeval_add_time(&timeout, seconds, 0);
1214 LOG_INFO("Starting or1k profiling. Sampling npc as fast as we can...");
1216 /* Make sure the target is running */
1217 target_poll(target);
1218 if (target->state == TARGET_HALTED)
1219 retval = target_resume(target, 1, 0, 0, 0);
1221 if (retval != ERROR_OK) {
1222 LOG_ERROR("Error while resuming target");
1223 return retval;
1226 uint32_t sample_count = 0;
1228 for (;;) {
1229 uint32_t reg_value;
1230 retval = du_core->or1k_jtag_read_cpu(&or1k->jtag, GROUP0 + 16 /* NPC */, 1, &reg_value);
1231 if (retval != ERROR_OK) {
1232 LOG_ERROR("Error while reading NPC");
1233 return retval;
1236 samples[sample_count++] = reg_value;
1238 gettimeofday(&now, NULL);
1239 if ((sample_count >= max_num_samples) || timeval_compare(&now, &timeout) > 0) {
1240 LOG_INFO("Profiling completed. %" PRIu32 " samples.", sample_count);
1241 break;
1245 *num_samples = sample_count;
1246 return retval;
1249 COMMAND_HANDLER(or1k_tap_select_command_handler)
1251 struct target *target = get_current_target(CMD_CTX);
1252 struct or1k_common *or1k = target_to_or1k(target);
1253 struct or1k_jtag *jtag = &or1k->jtag;
1254 struct or1k_tap_ip *or1k_tap;
1256 if (CMD_ARGC != 1)
1257 return ERROR_COMMAND_SYNTAX_ERROR;
1259 list_for_each_entry(or1k_tap, &tap_list, list) {
1260 if (or1k_tap->name) {
1261 if (!strcmp(CMD_ARGV[0], or1k_tap->name)) {
1262 jtag->tap_ip = or1k_tap;
1263 LOG_INFO("%s tap selected", or1k_tap->name);
1264 return ERROR_OK;
1269 LOG_ERROR("%s unknown, no tap selected", CMD_ARGV[0]);
1270 return ERROR_COMMAND_SYNTAX_ERROR;
1273 COMMAND_HANDLER(or1k_tap_list_command_handler)
1275 struct or1k_tap_ip *or1k_tap;
1277 if (CMD_ARGC != 0)
1278 return ERROR_COMMAND_SYNTAX_ERROR;
1280 list_for_each_entry(or1k_tap, &tap_list, list) {
1281 if (or1k_tap->name)
1282 command_print(CMD, "%s", or1k_tap->name);
1285 return ERROR_OK;
1288 COMMAND_HANDLER(or1k_du_select_command_handler)
1290 struct target *target = get_current_target(CMD_CTX);
1291 struct or1k_common *or1k = target_to_or1k(target);
1292 struct or1k_jtag *jtag = &or1k->jtag;
1293 struct or1k_du *or1k_du;
1295 if (CMD_ARGC > 2)
1296 return ERROR_COMMAND_SYNTAX_ERROR;
1298 list_for_each_entry(or1k_du, &du_list, list) {
1299 if (or1k_du->name) {
1300 if (!strcmp(CMD_ARGV[0], or1k_du->name)) {
1301 jtag->du_core = or1k_du;
1302 LOG_INFO("%s debug unit selected", or1k_du->name);
1304 if (CMD_ARGC == 2) {
1305 int options;
1306 COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], options);
1307 or1k_du->options = options;
1308 LOG_INFO("Option %x is passed to %s debug unit"
1309 , options, or1k_du->name);
1312 return ERROR_OK;
1317 LOG_ERROR("%s unknown, no debug unit selected", CMD_ARGV[0]);
1318 return ERROR_COMMAND_SYNTAX_ERROR;
1321 COMMAND_HANDLER(or1k_du_list_command_handler)
1323 struct or1k_du *or1k_du;
1325 if (CMD_ARGC != 0)
1326 return ERROR_COMMAND_SYNTAX_ERROR;
1328 list_for_each_entry(or1k_du, &du_list, list) {
1329 if (or1k_du->name)
1330 command_print(CMD, "%s", or1k_du->name);
1333 return ERROR_OK;
1336 COMMAND_HANDLER(or1k_addreg_command_handler)
1338 struct target *target = get_current_target(CMD_CTX);
1339 struct or1k_core_reg new_reg;
1341 if (CMD_ARGC != 4)
1342 return ERROR_COMMAND_SYNTAX_ERROR;
1344 new_reg.target = NULL;
1345 new_reg.or1k_common = NULL;
1347 uint32_t addr;
1348 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], addr);
1350 new_reg.name = strdup(CMD_ARGV[0]);
1351 new_reg.spr_num = addr;
1352 new_reg.feature = strdup(CMD_ARGV[2]);
1353 new_reg.group = strdup(CMD_ARGV[3]);
1355 or1k_add_reg(target, &new_reg);
1357 LOG_DEBUG("Add reg \"%s\" @ 0x%08" PRIx32 ", group \"%s\", feature \"%s\"",
1358 new_reg.name, addr, new_reg.group, new_reg.feature);
1360 return ERROR_OK;
1363 static const struct command_registration or1k_hw_ip_command_handlers[] = {
1365 .name = "tap_select",
1366 .handler = or1k_tap_select_command_handler,
1367 .mode = COMMAND_ANY,
1368 .usage = "name",
1369 .help = "Select the TAP core to use",
1372 .name = "tap_list",
1373 .handler = or1k_tap_list_command_handler,
1374 .mode = COMMAND_ANY,
1375 .usage = "",
1376 .help = "Display available TAP core",
1379 .name = "du_select",
1380 .handler = or1k_du_select_command_handler,
1381 .mode = COMMAND_ANY,
1382 .usage = "name",
1383 .help = "Select the Debug Unit core to use",
1386 .name = "du_list",
1387 .handler = or1k_du_list_command_handler,
1388 .mode = COMMAND_ANY,
1389 .usage = "select_tap name",
1390 .help = "Display available Debug Unit core",
1392 COMMAND_REGISTRATION_DONE
1395 static const struct command_registration or1k_reg_command_handlers[] = {
1397 .name = "addreg",
1398 .handler = or1k_addreg_command_handler,
1399 .mode = COMMAND_ANY,
1400 .usage = "name addr feature group",
1401 .help = "Add a register to the register list",
1403 COMMAND_REGISTRATION_DONE
1406 static const struct command_registration or1k_command_handlers[] = {
1408 .chain = or1k_reg_command_handlers,
1411 .chain = or1k_hw_ip_command_handlers,
1413 COMMAND_REGISTRATION_DONE
1417 struct target_type or1k_target = {
1418 .name = "or1k",
1420 .poll = or1k_poll,
1421 .arch_state = or1k_arch_state,
1423 .target_request_data = NULL,
1425 .halt = or1k_halt,
1426 .resume = or1k_resume,
1427 .step = or1k_step,
1429 .assert_reset = or1k_assert_reset,
1430 .deassert_reset = or1k_deassert_reset,
1431 .soft_reset_halt = or1k_soft_reset_halt,
1433 .get_gdb_reg_list = or1k_get_gdb_reg_list,
1435 .read_memory = or1k_read_memory,
1436 .write_memory = or1k_write_memory,
1437 .checksum_memory = or1k_checksum_memory,
1439 .commands = or1k_command_handlers,
1440 .add_breakpoint = or1k_add_breakpoint,
1441 .remove_breakpoint = or1k_remove_breakpoint,
1442 .add_watchpoint = or1k_add_watchpoint,
1443 .remove_watchpoint = or1k_remove_watchpoint,
1445 .target_create = or1k_target_create,
1446 .init_target = or1k_init_target,
1447 .examine = or1k_examine,
1449 .get_gdb_fileio_info = or1k_get_gdb_fileio_info,
1451 .profiling = or1k_profiling,