75b51af8695b32b3c3eb4349fc1488d8c4d899bb
1 #define _POSIX_C_SOURCE 200809L
17 #include <sys/types.h>
18 #include <sys/socket.h>
19 #include <netinet/in.h>
20 #include <urjtag/urjtag.h>
23 #define DBG_WB_ADDR 0x00
24 #define DBG_WB_DATA 0x01
25 #define DBG_WB_CTRL 0x02
27 #define DBG_CORE_CTRL 0x10
28 #define DBG_CORE_CTRL_STOP (1 << 0)
29 #define DBG_CORE_CTRL_RESET (1 << 1)
30 #define DBG_CORE_CTRL_ICRESET (1 << 2)
31 #define DBG_CORE_CTRL_STEP (1 << 3)
32 #define DBG_CORE_CTRL_START (1 << 4)
34 #define DBG_CORE_STAT 0x11
35 #define DBG_CORE_STAT_STOPPING (1 << 0)
36 #define DBG_CORE_STAT_STOPPED (1 << 1)
37 #define DBG_CORE_STAT_TERM (1 << 2)
39 #define DBG_CORE_NIA 0x12
40 #define DBG_CORE_MSR 0x13
42 #define DBG_CORE_GSPR_INDEX 0x14
43 #define DBG_CORE_GSPR_DATA 0x15
45 #define DBG_LOG_ADDR 0x16
46 #define DBG_LOG_DATA 0x17
51 int (*init
)(const char *target
);
53 int (*command
)(uint8_t op
, uint8_t addr
, uint64_t *data
);
55 static struct backend
*b
;
57 static void check(int r
, const char *failstr
)
61 fprintf(stderr
, "Error %s\n", failstr
);
65 /* -------------- SIM backend -------------- */
67 static int sim_fd
= -1;
69 static int sim_init(const char *target
)
71 struct sockaddr_in saddr
;
77 target
= "localhost:13245";
78 p
= strchr(target
, ':');
79 host
= strndup(target
, p
- target
);
84 port
= strtoul(p
, NULL
, 10);
86 printf("Opening sim backend host '%s' port %d\n", host
, port
);
88 sim_fd
= socket(PF_INET
, SOCK_STREAM
, 0);
90 fprintf(stderr
, "Error opening socket: %s\n",
94 hp
= gethostbyname(host
);
96 fprintf(stderr
,"Unknown host '%s'\n", host
);
99 memcpy(&saddr
.sin_addr
, hp
->h_addr
, hp
->h_length
);
100 saddr
.sin_port
= htons(port
);
101 saddr
.sin_family
= PF_INET
;
102 rc
= connect(sim_fd
, (struct sockaddr
*)&saddr
, sizeof(saddr
));
105 fprintf(stderr
,"Connection to '%s' failed: %s\n",
106 host
, strerror(errno
));
112 static int sim_reset(void)
117 static void add_bits(uint8_t **p
, int *b
, uint64_t d
, int c
)
119 uint8_t md
= 1 << *b
;
137 static uint64_t read_bits(uint8_t **p
, int *b
, int c
)
139 uint8_t ms
= 1 << *b
;
159 static int sim_command(uint8_t op
, uint8_t addr
, uint64_t *data
)
162 uint64_t d
= data
? *data
: 0;
167 add_bits(&p
, &b
, op
, 2);
168 add_bits(&p
, &b
, d
, 64);
169 add_bits(&p
, &b
, addr
, 8);
177 for (i
=0; i
<(p
-buf
); i
++)
178 printf("%02x ", buf
[i
]);
181 r
= write(sim_fd
, buf
, p
- buf
);
183 fprintf(stderr
, "failed to write sim command\n");
186 r
= read(sim_fd
, buf
, sizeof(buf
));
191 printf("%02x ", buf
[i
]);
196 r
= read_bits(&p
, &b
, 2);
198 *data
= read_bits(&p
, &b
, 64);
202 static struct backend sim_backend
= {
205 .command
= sim_command
,
208 /* -------------- JTAG backend -------------- */
210 static urj_chain_t
*jc
;
212 static int jtag_init(const char *target
)
216 char *params
[] = { NULL
, };
222 target
= "DigilentHS1";
223 sep
= strchr(target
, ':');
224 cable
= strndup(target
, sep
- target
);
226 fprintf(stderr
, "jtag cable params not supported yet\n");
230 printf("Opening jtag backend cable '%s'\n", cable
);
232 jc
= urj_tap_chain_alloc();
234 fprintf(stderr
, "Failed to alloc JTAG\n");
239 rc
= urj_tap_chain_connect(jc
, cable
, params
);
240 if (rc
!= URJ_STATUS_OK
) {
241 fprintf(stderr
, "JTAG cable detect failed\n");
245 /* XXX Hard wire part 0, that might need to change (use params and detect !) */
246 rc
= urj_tap_manual_add(jc
, 6);
248 fprintf(stderr
, "JTAG failed to add part !\n");
251 if (jc
->parts
== NULL
|| jc
->parts
->len
== 0) {
252 fprintf(stderr
, "JTAG Something's wrong after adding part !\n");
255 urj_part_parts_set_instruction(jc
->parts
, "BYPASS");
257 jc
->active_part
= part
= 0;
259 p
= urj_tap_chain_active_part(jc
);
261 fprintf(stderr
, "Failed to get active JTAG part\n");
264 rc
= urj_part_data_register_define(p
, "IDCODE_REG", 32);
265 if (rc
!= URJ_STATUS_OK
) {
266 fprintf(stderr
, "JTAG failed to add IDCODE_REG register !\n");
269 if (urj_part_instruction_define(p
, "IDCODE", "001001", "IDCODE_REG") == NULL
) {
270 fprintf(stderr
, "JTAG failed to add IDCODE instruction !\n");
273 rc
= urj_part_data_register_define(p
, "USER2_REG", 74);
274 if (rc
!= URJ_STATUS_OK
) {
275 fprintf(stderr
, "JTAG failed to add USER2_REG register !\n");
278 if (urj_part_instruction_define(p
, "USER2", "000011", "USER2_REG") == NULL
) {
279 fprintf(stderr
, "JTAG failed to add USER2 instruction !\n");
282 urj_part_set_instruction(p
, "IDCODE");
283 urj_tap_chain_shift_instructions(jc
);
284 urj_tap_chain_shift_data_registers(jc
, 1);
285 id
= urj_tap_register_get_value(p
->active_instruction
->data_register
->out
);
286 printf("Found device ID: 0x%08x\n", id
);
287 urj_part_set_instruction(p
, "USER2");
288 urj_tap_chain_shift_instructions(jc
);
293 static int jtag_reset(void)
298 static int jtag_command(uint8_t op
, uint8_t addr
, uint64_t *data
)
300 urj_part_t
*p
= urj_tap_chain_active_part(jc
);
301 urj_part_instruction_t
*insn
;
302 urj_data_register_t
*dr
;
303 uint64_t d
= data
? *data
: 0;
308 insn
= p
->active_instruction
;
311 dr
= insn
->data_register
;
314 rc
= urj_tap_register_set_value_bit_range(dr
->in
, op
, 1, 0);
315 if (rc
!= URJ_STATUS_OK
)
317 rc
= urj_tap_register_set_value_bit_range(dr
->in
, d
, 65, 2);
318 if (rc
!= URJ_STATUS_OK
)
320 rc
= urj_tap_register_set_value_bit_range(dr
->in
, addr
, 73, 66);
321 if (rc
!= URJ_STATUS_OK
)
323 rc
= urj_tap_chain_shift_data_registers(jc
, 1);
324 if (rc
!= URJ_STATUS_OK
)
326 rc
= urj_tap_register_get_value_bit_range(dr
->out
, 1, 0);
328 *data
= urj_tap_register_get_value_bit_range(dr
->out
, 65, 2);
332 static struct backend jtag_backend
= {
335 .command
= jtag_command
,
338 static int dmi_read(uint8_t addr
, uint64_t *data
)
342 rc
= b
->command(1, addr
, data
);
346 rc
= b
->command(0, 0, data
);
352 fprintf(stderr
, "Unknown status code %d !\n", rc
);
356 static int dmi_write(uint8_t addr
, uint64_t data
)
360 rc
= b
->command(2, addr
, &data
);
364 rc
= b
->command(0, 0, NULL
);
370 fprintf(stderr
, "Unknown status code %d !\n", rc
);
374 static void core_status(void)
376 uint64_t stat
, nia
, msr
;
377 const char *statstr
, *statstr2
;
379 check(dmi_read(DBG_CORE_STAT
, &stat
), "reading core status");
380 check(dmi_read(DBG_CORE_NIA
, &nia
), "reading core NIA");
381 check(dmi_read(DBG_CORE_MSR
, &msr
), "reading core MSR");
384 printf("Core status = 0x%llx\n", (unsigned long long)stat
);
387 if (stat
& DBG_CORE_STAT_STOPPED
) {
389 if (!(stat
& DBG_CORE_STAT_STOPPING
))
390 statstr2
= " (restarting?)";
391 else if (stat
& DBG_CORE_STAT_TERM
)
392 statstr2
= " (terminated)";
393 } else if (stat
& DBG_CORE_STAT_STOPPING
)
394 statstr
= "stopping";
395 else if (stat
& DBG_CORE_STAT_TERM
)
396 statstr
= "odd state (TERM but no STOP)";
397 printf("Core: %s%s\n", statstr
, statstr2
);
398 printf(" NIA: %016" PRIx64
"\n", nia
);
399 printf(" MSR: %016" PRIx64
"\n", msr
);
402 static void core_stop(void)
404 check(dmi_write(DBG_CORE_CTRL
, DBG_CORE_CTRL_STOP
), "stopping core");
407 static void core_start(void)
409 check(dmi_write(DBG_CORE_CTRL
, DBG_CORE_CTRL_START
), "starting core");
412 static void core_reset(void)
414 check(dmi_write(DBG_CORE_CTRL
, DBG_CORE_CTRL_RESET
), "resetting core");
417 static void core_step(void)
421 check(dmi_read(DBG_CORE_STAT
, &stat
), "reading core status");
423 if (!(stat
& DBG_CORE_STAT_STOPPED
)) {
424 printf("Core not stopped !\n");
427 check(dmi_write(DBG_CORE_CTRL
, DBG_CORE_CTRL_STEP
), "stepping core");
430 static void icache_reset(void)
432 check(dmi_write(DBG_CORE_CTRL
, DBG_CORE_CTRL_ICRESET
), "resetting icache");
435 static const char *fast_spr_names
[] =
437 "lr", "ctr", "srr0", "srr1", "hsrr0", "hsrr1",
438 "sprg0", "sprg1", "sprg2", "sprg3",
439 "hsprg0", "hsprg1", "xer"
442 static void gpr_read(uint64_t reg
, uint64_t count
)
447 if (reg
+ count
> 96)
449 for (; count
!= 0; --count
, ++reg
) {
450 check(dmi_write(DBG_CORE_GSPR_INDEX
, reg
), "setting GPR index");
452 check(dmi_read(DBG_CORE_GSPR_DATA
, &data
), "reading GPR data");
454 printf("r%"PRId64
, reg
);
455 else if ((reg
- 32) < sizeof(fast_spr_names
) / sizeof(fast_spr_names
[0]))
456 printf("%s", fast_spr_names
[reg
- 32]);
458 printf("gspr%"PRId64
, reg
);
460 printf("FPR%"PRId64
, reg
- 64);
461 printf(":\t%016"PRIx64
"\n", data
);
465 static void mem_read(uint64_t addr
, uint64_t count
)
470 rc
= dmi_write(DBG_WB_CTRL
, 0x7ff);
473 rc
= dmi_write(DBG_WB_ADDR
, addr
);
476 for (i
= 0; i
< count
; i
++) {
477 rc
= dmi_read(DBG_WB_DATA
, &data
);
480 printf("%016llx: %016llx\n",
481 (unsigned long long)addr
,
482 (unsigned long long)data
);
487 static void mem_write(uint64_t addr
, uint64_t data
)
489 check(dmi_write(DBG_WB_CTRL
, 0x7ff), "writing WB_CTRL");
490 check(dmi_write(DBG_WB_ADDR
, addr
), "writing WB_ADDR");
491 check(dmi_write(DBG_WB_DATA
, data
), "writing WB_DATA");
494 static void load(const char *filename
, uint64_t addr
)
499 fd
= open(filename
, O_RDONLY
);
501 fprintf(stderr
, "Failed to open '%s': %s\n", filename
, strerror(errno
));
504 check(dmi_write(DBG_WB_CTRL
, 0x7ff), "writing WB_CTRL");
505 check(dmi_write(DBG_WB_ADDR
, addr
), "writing WB_ADDR");
509 rc
= read(fd
, &data
, 8);
512 // if (rc < 8) XXX fixup endian ?
513 check(dmi_write(DBG_WB_DATA
, data
), "writing WB_DATA");
515 if (!(count
% 1024)) {
516 printf("%x...\r", count
);
521 printf("%x done.\n", count
);
524 static void save(const char *filename
, uint64_t addr
, uint64_t size
)
529 fd
= open(filename
, O_WRONLY
| O_CREAT
, 00666);
531 fprintf(stderr
, "Failed to open '%s': %s\n", filename
, strerror(errno
));
534 check(dmi_write(DBG_WB_CTRL
, 0x7ff), "writing WB_CTRL");
535 check(dmi_write(DBG_WB_ADDR
, addr
), "writing WB_ADDR");
538 check(dmi_read(DBG_WB_DATA
, &data
), "reading WB_DATA");
539 rc
= write(fd
, &data
, 8);
541 fprintf(stderr
, "Failed to write: %s\n", strerror(errno
));
545 if (!(count
% 1024)) {
546 printf("%x...\r", count
);
553 printf("%x done.\n", count
);
556 #define LOG_STOP 0x80000000ull
558 static void log_start(void)
560 check(dmi_write(DBG_LOG_ADDR
, 0), "writing LOG_ADDR");
563 static void log_stop(void)
565 uint64_t lsize
, laddr
, waddr
;
567 check(dmi_write(DBG_LOG_ADDR
, LOG_STOP
), "writing LOG_ADDR");
568 check(dmi_read(DBG_LOG_ADDR
, &laddr
), "reading LOG_ADDR");
570 for (lsize
= 1; lsize
; lsize
<<= 1)
571 if ((waddr
>> 1) < lsize
)
574 printf("Log size = %" PRIu64
" entries, ", lsize
);
575 printf("write ptr = %" PRIx64
"\n", waddr
);
578 static void log_dump(const char *filename
)
581 uint64_t lsize
, laddr
, waddr
;
585 f
= fopen(filename
, "w");
587 fprintf(stderr
, "Failed to create '%s': %s\n", filename
,
592 check(dmi_read(DBG_LOG_ADDR
, &orig_laddr
), "reading LOG_ADDR");
593 if (!(orig_laddr
& LOG_STOP
))
594 check(dmi_write(DBG_LOG_ADDR
, LOG_STOP
), "writing LOG_ADDR");
596 waddr
= orig_laddr
>> 32;
597 for (lsize
= 1; lsize
; lsize
<<= 1)
598 if ((waddr
>> 1) < lsize
)
601 printf("Log size = %" PRIu64
" entries\n", lsize
);
603 laddr
= LOG_STOP
| (waddr
<< 2);
604 check(dmi_write(DBG_LOG_ADDR
, laddr
), "writing LOG_ADDR");
606 for (i
= 0; i
< lsize
* 4; ++i
) {
607 check(dmi_read(DBG_LOG_DATA
, &ldata
), "reading LOG_DATA");
608 if (fwrite(&ldata
, sizeof(ldata
), 1, f
) != 1) {
609 fprintf(stderr
, "Write error on %s\n", filename
);
613 printf("%" PRIu64
"...\r", i
* 8);
618 printf("%" PRIu64
" done\n", lsize
* 32);
620 check(dmi_write(DBG_LOG_ADDR
, orig_laddr
), "writing LOG_ADDR");
623 static void usage(const char *cmd
)
625 fprintf(stderr
, "Usage: %s -b <jtag|sim> <command> <args>\n", cmd
);
627 fprintf(stderr
, "\n");
628 fprintf(stderr
, " CPU core:\n");
629 fprintf(stderr
, " start\n");
630 fprintf(stderr
, " stop\n");
631 fprintf(stderr
, " step\n");
632 fprintf(stderr
, " creset core reset\n");
633 fprintf(stderr
, " icreset icache reset\n");
635 fprintf(stderr
, "\n");
636 fprintf(stderr
, " Memory:\n");
637 fprintf(stderr
, " mr <hex addr> [count]\n");
638 fprintf(stderr
, " mw <hex addr> <hex value>\n");
639 fprintf(stderr
, " load <file> [addr] If omitted address is 0\n");
640 fprintf(stderr
, " save <file> <addr> <size>\n");
642 fprintf(stderr
, "\n");
643 fprintf(stderr
, " Registers:\n");
644 fprintf(stderr
, " gpr <reg> [count]\n");
645 fprintf(stderr
, " status\n");
647 fprintf(stderr
, "\n");
648 fprintf(stderr
, " Core logging:\n");
649 fprintf(stderr
, " lstart start logging\n");
650 fprintf(stderr
, " lstop stop logging\n");
651 fprintf(stderr
, " ldump <file> dump log to file\n");
653 fprintf(stderr
, "\n");
654 fprintf(stderr
, " JTAG:\n");
655 fprintf(stderr
, " dmiread <hex addr>\n");
656 fprintf(stderr
, " dmiwrite <hex addr> <hex value>\n");
657 fprintf(stderr
, " quit\n");
662 int main(int argc
, char *argv
[])
664 const char *progname
= argv
[0];
665 const char *target
= NULL
;
672 static struct option lopts
[] = {
673 { "help", no_argument
, 0, 'h' },
674 { "backend", required_argument
, 0, 'b' },
675 { "target", required_argument
, 0, 't' },
676 { "debug", no_argument
, 0, 'd' },
679 c
= getopt_long(argc
, argv
, "dhb:t:", lopts
, &oindex
);
687 if (strcmp(optarg
, "sim") == 0)
689 else if (strcmp(optarg
, "jtag") == 0)
692 fprintf(stderr
, "Unknown backend %s\n", optarg
);
705 fprintf(stderr
, "No backend selected\n");
709 rc
= b
->init(target
);
712 for (i
= optind
; i
< argc
; i
++) {
713 if (strcmp(argv
[i
], "dmiread") == 0) {
719 addr
= strtoul(argv
[++i
], NULL
, 16);
720 dmi_read(addr
, &data
);
721 printf("%02x: %016llx\n", addr
, (unsigned long long)data
);
722 } else if (strcmp(argv
[i
], "dmiwrite") == 0) {
728 addr
= strtoul(argv
[++i
], NULL
, 16);
729 data
= strtoul(argv
[++i
], NULL
, 16);
730 dmi_write(addr
, data
);
731 } else if (strcmp(argv
[i
], "creset") == 0) {
733 } else if (strcmp(argv
[i
], "icreset") == 0) {
735 } else if (strcmp(argv
[i
], "stop") == 0) {
737 } else if (strcmp(argv
[i
], "start") == 0) {
739 } else if (strcmp(argv
[i
], "step") == 0) {
741 } else if (strcmp(argv
[i
], "quit") == 0) {
743 } else if (strcmp(argv
[i
], "status") == 0) {
744 /* do nothing, always done below */
745 } else if (strcmp(argv
[i
], "mr") == 0) {
746 uint64_t addr
, count
= 1;
750 addr
= strtoul(argv
[++i
], NULL
, 16);
751 if (((i
+1) < argc
) && isdigit(argv
[i
+1][0]))
752 count
= strtoul(argv
[++i
], NULL
, 16);
753 mem_read(addr
, count
);
754 } else if (strcmp(argv
[i
], "mw") == 0) {
759 addr
= strtoul(argv
[++i
], NULL
, 16);
760 data
= strtoul(argv
[++i
], NULL
, 16);
761 mem_write(addr
, data
);
762 } else if (strcmp(argv
[i
], "load") == 0) {
763 const char *filename
;
768 filename
= argv
[++i
];
769 if (((i
+1) < argc
) && isdigit(argv
[i
+1][0]))
770 addr
= strtoul(argv
[++i
], NULL
, 16);
771 load(filename
, addr
);
772 } else if (strcmp(argv
[i
], "save") == 0) {
773 const char *filename
;
778 filename
= argv
[++i
];
779 addr
= strtoul(argv
[++i
], NULL
, 16);
780 size
= strtoul(argv
[++i
], NULL
, 16);
781 save(filename
, addr
, size
);
782 } else if (strcmp(argv
[i
], "gpr") == 0) {
783 uint64_t reg
, count
= 1;
787 reg
= strtoul(argv
[++i
], NULL
, 10);
788 if (((i
+1) < argc
) && isdigit(argv
[i
+1][0]))
789 count
= strtoul(argv
[++i
], NULL
, 10);
790 gpr_read(reg
, count
);
791 } else if (strcmp(argv
[i
], "lstart") == 0) {
793 } else if (strcmp(argv
[i
], "lstop") == 0) {
795 } else if (strcmp(argv
[i
], "ldump") == 0) {
796 const char *filename
;
800 filename
= argv
[++i
];
803 fprintf(stderr
, "Unknown command %s\n", argv
[i
]);