comparison rvinterf/tmsh/tmcore.c @ 69:2159f260ed13

fc-tmsh: all commands internally return values in preparation for adding one-shot mode of operation
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 26 Oct 2016 23:17:03 +0000
parents e7502631a0f9
children 4c7f3778dc24
comparison
equal deleted inserted replaced
68:585f63e5bca6 69:2159f260ed13
10 #include <stdlib.h> 10 #include <stdlib.h>
11 #include "pktmux.h" 11 #include "pktmux.h"
12 #include "limits.h" 12 #include "limits.h"
13 #include "localtypes.h" 13 #include "localtypes.h"
14 #include "etm.h" 14 #include "etm.h"
15 #include "exitcodes.h"
15 16
16 extern u_char rvi_msg[]; 17 extern u_char rvi_msg[];
17 extern int rvi_msg_len; 18 extern int rvi_msg_len;
18 19
19 static void 20 static void
192 unknown: 193 unknown:
193 print_etm_pkt_raw("ETM_CORE resp"); 194 print_etm_pkt_raw("ETM_CORE resp");
194 } 195 }
195 } 196 }
196 197
197 void
198 cmd_r8(argc, argv) 198 cmd_r8(argc, argv)
199 char **argv; 199 char **argv;
200 { 200 {
201 u32 addr; 201 u32 addr;
202 int count; 202 int count;
207 count = strtoul(argv[2], 0, 0); 207 count = strtoul(argv[2], 0, 0);
208 else 208 else
209 count = 1; 209 count = 1;
210 if (count < 1 || count > 253) { 210 if (count < 1 || count > 253) {
211 printf("error: count argument outside valid range\n"); 211 printf("error: count argument outside valid range\n");
212 return; 212 return(ERROR_USAGE);
213 } 213 }
214 cmdpkt[1] = ETM_CORE; 214 cmdpkt[1] = ETM_CORE;
215 cmdpkt[2] = TMCORE_OPC_MEM; 215 cmdpkt[2] = TMCORE_OPC_MEM;
216 cmdpkt[3] = 0x01; 216 cmdpkt[3] = 0x01;
217 cmdpkt[4] = count; 217 cmdpkt[4] = count;
218 cmdpkt[5] = addr; 218 cmdpkt[5] = addr;
219 cmdpkt[6] = addr >> 8; 219 cmdpkt[6] = addr >> 8;
220 cmdpkt[7] = addr >> 16; 220 cmdpkt[7] = addr >> 16;
221 cmdpkt[8] = addr >> 24; 221 cmdpkt[8] = addr >> 24;
222 send_etm_cmd(cmdpkt, 8); 222 send_etm_cmd(cmdpkt, 8);
223 } 223 return(0);
224 224 }
225 void 225
226 cmd_r16(argc, argv) 226 cmd_r16(argc, argv)
227 char **argv; 227 char **argv;
228 { 228 {
229 u32 addr; 229 u32 addr;
230 int count; 230 int count;
235 count = strtoul(argv[2], 0, 0); 235 count = strtoul(argv[2], 0, 0);
236 else 236 else
237 count = 1; 237 count = 1;
238 if (addr & 1) { 238 if (addr & 1) {
239 printf("error: address not aligned\n"); 239 printf("error: address not aligned\n");
240 return; 240 return(ERROR_USAGE);
241 } 241 }
242 if (count < 1 || count > 126) { 242 if (count < 1 || count > 126) {
243 printf("error: count argument outside valid range\n"); 243 printf("error: count argument outside valid range\n");
244 return; 244 return(ERROR_USAGE);
245 } 245 }
246 cmdpkt[1] = ETM_CORE; 246 cmdpkt[1] = ETM_CORE;
247 cmdpkt[2] = TMCORE_OPC_MEM; 247 cmdpkt[2] = TMCORE_OPC_MEM;
248 cmdpkt[3] = 0x02; 248 cmdpkt[3] = 0x02;
249 cmdpkt[4] = count; 249 cmdpkt[4] = count;
250 cmdpkt[5] = addr; 250 cmdpkt[5] = addr;
251 cmdpkt[6] = addr >> 8; 251 cmdpkt[6] = addr >> 8;
252 cmdpkt[7] = addr >> 16; 252 cmdpkt[7] = addr >> 16;
253 cmdpkt[8] = addr >> 24; 253 cmdpkt[8] = addr >> 24;
254 send_etm_cmd(cmdpkt, 8); 254 send_etm_cmd(cmdpkt, 8);
255 } 255 return(0);
256 256 }
257 void 257
258 cmd_r32(argc, argv) 258 cmd_r32(argc, argv)
259 char **argv; 259 char **argv;
260 { 260 {
261 u32 addr; 261 u32 addr;
262 int count; 262 int count;
267 count = strtoul(argv[2], 0, 0); 267 count = strtoul(argv[2], 0, 0);
268 else 268 else
269 count = 1; 269 count = 1;
270 if (addr & 3) { 270 if (addr & 3) {
271 printf("error: address not aligned\n"); 271 printf("error: address not aligned\n");
272 return; 272 return(ERROR_USAGE);
273 } 273 }
274 if (count < 1 || count > 63) { 274 if (count < 1 || count > 63) {
275 printf("error: count argument outside valid range\n"); 275 printf("error: count argument outside valid range\n");
276 return; 276 return(ERROR_USAGE);
277 } 277 }
278 cmdpkt[1] = ETM_CORE; 278 cmdpkt[1] = ETM_CORE;
279 cmdpkt[2] = TMCORE_OPC_MEM; 279 cmdpkt[2] = TMCORE_OPC_MEM;
280 cmdpkt[3] = 0x04; 280 cmdpkt[3] = 0x04;
281 cmdpkt[4] = count; 281 cmdpkt[4] = count;
282 cmdpkt[5] = addr; 282 cmdpkt[5] = addr;
283 cmdpkt[6] = addr >> 8; 283 cmdpkt[6] = addr >> 8;
284 cmdpkt[7] = addr >> 16; 284 cmdpkt[7] = addr >> 16;
285 cmdpkt[8] = addr >> 24; 285 cmdpkt[8] = addr >> 24;
286 send_etm_cmd(cmdpkt, 8); 286 send_etm_cmd(cmdpkt, 8);
287 } 287 return(0);
288 288 }
289 void 289
290 cmd_w8(argc, argv) 290 cmd_w8(argc, argv)
291 char **argv; 291 char **argv;
292 { 292 {
293 u32 addr, v; 293 u32 addr, v;
294 u_char cmdpkt[MAX_PKT_TO_TARGET]; 294 u_char cmdpkt[MAX_PKT_TO_TARGET];
308 for (ap = argv + 2; *ap; ap++) { 308 for (ap = argv + 2; *ap; ap++) {
309 v = strtoul(*ap, 0, 16); 309 v = strtoul(*ap, 0, 16);
310 cmdpkt[di++] = v; 310 cmdpkt[di++] = v;
311 } 311 }
312 send_etm_cmd(cmdpkt, di - 1); 312 send_etm_cmd(cmdpkt, di - 1);
313 } 313 return(0);
314 314 }
315 void 315
316 cmd_w16(argc, argv) 316 cmd_w16(argc, argv)
317 char **argv; 317 char **argv;
318 { 318 {
319 u32 addr, v; 319 u32 addr, v;
320 u_char cmdpkt[MAX_PKT_TO_TARGET]; 320 u_char cmdpkt[MAX_PKT_TO_TARGET];
322 char **ap; 322 char **ap;
323 323
324 addr = strtoul(argv[1], 0, 16); 324 addr = strtoul(argv[1], 0, 16);
325 if (addr & 1) { 325 if (addr & 1) {
326 printf("error: address not aligned\n"); 326 printf("error: address not aligned\n");
327 return; 327 return(ERROR_USAGE);
328 } 328 }
329 cmdpkt[1] = ETM_CORE; 329 cmdpkt[1] = ETM_CORE;
330 cmdpkt[2] = TMCORE_OPC_MEM; 330 cmdpkt[2] = TMCORE_OPC_MEM;
331 cmdpkt[3] = 0x12; 331 cmdpkt[3] = 0x12;
332 cmdpkt[4] = argc - 2; 332 cmdpkt[4] = argc - 2;
339 v = strtoul(*ap, 0, 16); 339 v = strtoul(*ap, 0, 16);
340 cmdpkt[di++] = v; 340 cmdpkt[di++] = v;
341 cmdpkt[di++] = v >> 8; 341 cmdpkt[di++] = v >> 8;
342 } 342 }
343 send_etm_cmd(cmdpkt, di - 1); 343 send_etm_cmd(cmdpkt, di - 1);
344 } 344 return(0);
345 345 }
346 void 346
347 cmd_w32(argc, argv) 347 cmd_w32(argc, argv)
348 char **argv; 348 char **argv;
349 { 349 {
350 u32 addr, v; 350 u32 addr, v;
351 u_char cmdpkt[MAX_PKT_TO_TARGET]; 351 u_char cmdpkt[MAX_PKT_TO_TARGET];
353 char **ap; 353 char **ap;
354 354
355 addr = strtoul(argv[1], 0, 16); 355 addr = strtoul(argv[1], 0, 16);
356 if (addr & 3) { 356 if (addr & 3) {
357 printf("error: address not aligned\n"); 357 printf("error: address not aligned\n");
358 return; 358 return(ERROR_USAGE);
359 } 359 }
360 cmdpkt[1] = ETM_CORE; 360 cmdpkt[1] = ETM_CORE;
361 cmdpkt[2] = TMCORE_OPC_MEM; 361 cmdpkt[2] = TMCORE_OPC_MEM;
362 cmdpkt[3] = 0x14; 362 cmdpkt[3] = 0x14;
363 cmdpkt[4] = argc - 2; 363 cmdpkt[4] = argc - 2;
372 cmdpkt[di++] = v >> 8; 372 cmdpkt[di++] = v >> 8;
373 cmdpkt[di++] = v >> 16; 373 cmdpkt[di++] = v >> 16;
374 cmdpkt[di++] = v >> 24; 374 cmdpkt[di++] = v >> 24;
375 } 375 }
376 send_etm_cmd(cmdpkt, di - 1); 376 send_etm_cmd(cmdpkt, di - 1);
377 } 377 return(0);
378 378 }
379 void 379
380 cmd_dieid(argc, argv) 380 cmd_dieid(argc, argv)
381 char **argv; 381 char **argv;
382 { 382 {
383 u_char cmdpkt[4]; 383 u_char cmdpkt[4];
384 384
385 cmdpkt[1] = ETM_CORE; 385 cmdpkt[1] = ETM_CORE;
386 cmdpkt[2] = TMCORE_OPC_DIEID; 386 cmdpkt[2] = TMCORE_OPC_DIEID;
387 send_etm_cmd(cmdpkt, 2); 387 send_etm_cmd(cmdpkt, 2);
388 } 388 return(0);
389 389 }
390 void 390
391 cmd_ping(argc, argv) 391 cmd_ping(argc, argv)
392 char **argv; 392 char **argv;
393 { 393 {
394 int delay, size; 394 int delay, size;
395 u_char cmdpkt[8]; 395 u_char cmdpkt[8];
396 396
397 if (argc > 1) { 397 if (argc > 1) {
398 delay = strtoul(argv[1], 0, 0); 398 delay = strtoul(argv[1], 0, 0);
399 if (delay > 65535) { 399 if (delay > 65535) {
400 printf("error: ping delay argument too big\n"); 400 printf("error: ping delay argument too big\n");
401 return; 401 return(ERROR_USAGE);
402 } 402 }
403 } else 403 } else
404 delay = 0; 404 delay = 0;
405 if (argc > 2) { 405 if (argc > 2) {
406 size = strtoul(argv[2], 0, 0); 406 size = strtoul(argv[2], 0, 0);
407 if (size > 240) { 407 if (size > 240) {
408 printf("error: ping size argument too big\n"); 408 printf("error: ping size argument too big\n");
409 return; 409 return(ERROR_USAGE);
410 } 410 }
411 } else 411 } else
412 size = 1; 412 size = 1;
413 cmdpkt[1] = ETM_CORE; 413 cmdpkt[1] = ETM_CORE;
414 cmdpkt[2] = TMCORE_OPC_ECHO; 414 cmdpkt[2] = TMCORE_OPC_ECHO;
415 cmdpkt[3] = delay; 415 cmdpkt[3] = delay;
416 cmdpkt[4] = delay >> 8; 416 cmdpkt[4] = delay >> 8;
417 cmdpkt[5] = size; 417 cmdpkt[5] = size;
418 cmdpkt[6] = size >> 8; 418 cmdpkt[6] = size >> 8;
419 send_etm_cmd(cmdpkt, 6); 419 send_etm_cmd(cmdpkt, 6);
420 } 420 return(0);
421 421 }
422 void 422
423 cmd_tgtreset(argc, argv) 423 cmd_tgtreset(argc, argv)
424 char **argv; 424 char **argv;
425 { 425 {
426 u_char cmdpkt[4]; 426 u_char cmdpkt[4];
427 427
428 cmdpkt[1] = ETM_CORE; 428 cmdpkt[1] = ETM_CORE;
429 cmdpkt[2] = TMCORE_OPC_RESET; 429 cmdpkt[2] = TMCORE_OPC_RESET;
430 send_etm_cmd(cmdpkt, 2); 430 send_etm_cmd(cmdpkt, 2);
431 } 431 return(0);
432 432 }
433 void 433
434 cmd_version(argc, argv) 434 cmd_version(argc, argv)
435 char **argv; 435 char **argv;
436 { 436 {
437 u32 arg; 437 u32 arg;
438 u_char cmdpkt[8]; 438 u_char cmdpkt[8];
443 cmdpkt[3] = arg; 443 cmdpkt[3] = arg;
444 cmdpkt[4] = arg >> 8; 444 cmdpkt[4] = arg >> 8;
445 cmdpkt[5] = arg >> 16; 445 cmdpkt[5] = arg >> 16;
446 cmdpkt[6] = arg >> 24; 446 cmdpkt[6] = arg >> 24;
447 send_etm_cmd(cmdpkt, 6); 447 send_etm_cmd(cmdpkt, 6);
448 } 448 return(0);
449 }