28e43b4f0b85162a353ce09fc4b0b3ac705ded7f
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
> 64)
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
);
459 printf(":\t%016"PRIx64
"\n", data
);
463 static void mem_read(uint64_t addr
, uint64_t count
)
468 rc
= dmi_write(DBG_WB_CTRL
, 0x7ff);
471 rc
= dmi_write(DBG_WB_ADDR
, addr
);
474 for (i
= 0; i
< count
; i
++) {
475 rc
= dmi_read(DBG_WB_DATA
, &data
);
478 printf("%016llx: %016llx\n",
479 (unsigned long long)addr
,
480 (unsigned long long)data
);
485 static void mem_write(uint64_t addr
, uint64_t data
)
487 check(dmi_write(DBG_WB_CTRL
, 0x7ff), "writing WB_CTRL");
488 check(dmi_write(DBG_WB_ADDR
, addr
), "writing WB_ADDR");
489 check(dmi_write(DBG_WB_DATA
, data
), "writing WB_DATA");
492 static void load(const char *filename
, uint64_t addr
)
497 fd
= open(filename
, O_RDONLY
);
499 fprintf(stderr
, "Failed to open '%s': %s\n", filename
, strerror(errno
));
502 check(dmi_write(DBG_WB_CTRL
, 0x7ff), "writing WB_CTRL");
503 check(dmi_write(DBG_WB_ADDR
, addr
), "writing WB_ADDR");
507 rc
= read(fd
, &data
, 8);
510 // if (rc < 8) XXX fixup endian ?
511 check(dmi_write(DBG_WB_DATA
, data
), "writing WB_DATA");
513 if (!(count
% 1024)) {
514 printf("%x...\r", count
);
519 printf("%x done.\n", count
);
522 static void save(const char *filename
, uint64_t addr
, uint64_t size
)
527 fd
= open(filename
, O_WRONLY
| O_CREAT
, 00666);
529 fprintf(stderr
, "Failed to open '%s': %s\n", filename
, strerror(errno
));
532 check(dmi_write(DBG_WB_CTRL
, 0x7ff), "writing WB_CTRL");
533 check(dmi_write(DBG_WB_ADDR
, addr
), "writing WB_ADDR");
536 check(dmi_read(DBG_WB_DATA
, &data
), "reading WB_DATA");
537 rc
= write(fd
, &data
, 8);
539 fprintf(stderr
, "Failed to write: %s\n", strerror(errno
));
543 if (!(count
% 1024)) {
544 printf("%x...\r", count
);
551 printf("%x done.\n", count
);
554 #define LOG_STOP 0x80000000ull
556 static void log_start(void)
558 check(dmi_write(DBG_LOG_ADDR
, 0), "writing LOG_ADDR");
561 static void log_stop(void)
563 uint64_t lsize
, laddr
, waddr
;
565 check(dmi_write(DBG_LOG_ADDR
, LOG_STOP
), "writing LOG_ADDR");
566 check(dmi_read(DBG_LOG_ADDR
, &laddr
), "reading LOG_ADDR");
568 for (lsize
= 1; lsize
; lsize
<<= 1)
569 if ((waddr
>> 1) < lsize
)
572 printf("Log size = %" PRIu64
" entries, ", lsize
);
573 printf("write ptr = %" PRIx64
"\n", waddr
);
576 static void log_dump(const char *filename
)
579 uint64_t lsize
, laddr
, waddr
;
583 f
= fopen(filename
, "w");
585 fprintf(stderr
, "Failed to create '%s': %s\n", filename
,
590 check(dmi_read(DBG_LOG_ADDR
, &orig_laddr
), "reading LOG_ADDR");
591 if (!(orig_laddr
& LOG_STOP
))
592 check(dmi_write(DBG_LOG_ADDR
, LOG_STOP
), "writing LOG_ADDR");
594 waddr
= orig_laddr
>> 32;
595 for (lsize
= 1; lsize
; lsize
<<= 1)
596 if ((waddr
>> 1) < lsize
)
599 printf("Log size = %" PRIu64
" entries\n", lsize
);
601 laddr
= LOG_STOP
| (waddr
<< 2);
602 check(dmi_write(DBG_LOG_ADDR
, laddr
), "writing LOG_ADDR");
604 for (i
= 0; i
< lsize
* 4; ++i
) {
605 check(dmi_read(DBG_LOG_DATA
, &ldata
), "reading LOG_DATA");
606 if (fwrite(&ldata
, sizeof(ldata
), 1, f
) != 1) {
607 fprintf(stderr
, "Write error on %s\n", filename
);
611 printf("%" PRIu64
"...\r", i
* 8);
616 printf("%" PRIu64
" done\n", lsize
* 32);
618 check(dmi_write(DBG_LOG_ADDR
, orig_laddr
), "writing LOG_ADDR");
621 static void usage(const char *cmd
)
623 fprintf(stderr
, "Usage: %s -b <jtag|sim> <command> <args>\n", cmd
);
625 fprintf(stderr
, "\n");
626 fprintf(stderr
, " CPU core:\n");
627 fprintf(stderr
, " start\n");
628 fprintf(stderr
, " stop\n");
629 fprintf(stderr
, " step\n");
630 fprintf(stderr
, " creset core reset\n");
631 fprintf(stderr
, " icreset icache reset\n");
633 fprintf(stderr
, "\n");
634 fprintf(stderr
, " Memory:\n");
635 fprintf(stderr
, " mr <hex addr> [count]\n");
636 fprintf(stderr
, " mw <hex addr> <hex value>\n");
637 fprintf(stderr
, " load <file> [addr] If omitted address is 0\n");
638 fprintf(stderr
, " save <file> <addr> <size>\n");
640 fprintf(stderr
, "\n");
641 fprintf(stderr
, " Registers:\n");
642 fprintf(stderr
, " gpr <reg> [count]\n");
643 fprintf(stderr
, " status\n");
645 fprintf(stderr
, "\n");
646 fprintf(stderr
, " Core logging:\n");
647 fprintf(stderr
, " lstart start logging\n");
648 fprintf(stderr
, " lstop stop logging\n");
649 fprintf(stderr
, " ldump <file> dump log to file\n");
651 fprintf(stderr
, "\n");
652 fprintf(stderr
, " JTAG:\n");
653 fprintf(stderr
, " dmiread <hex addr>\n");
654 fprintf(stderr
, " dmiwrite <hex addr> <hex value>\n");
655 fprintf(stderr
, " quit\n");
660 int main(int argc
, char *argv
[])
662 const char *progname
= argv
[0];
663 const char *target
= NULL
;
670 static struct option lopts
[] = {
671 { "help", no_argument
, 0, 'h' },
672 { "backend", required_argument
, 0, 'b' },
673 { "target", required_argument
, 0, 't' },
674 { "debug", no_argument
, 0, 'd' },
677 c
= getopt_long(argc
, argv
, "dhb:t:", lopts
, &oindex
);
685 if (strcmp(optarg
, "sim") == 0)
687 else if (strcmp(optarg
, "jtag") == 0)
690 fprintf(stderr
, "Unknown backend %s\n", optarg
);
703 fprintf(stderr
, "No backend selected\n");
707 rc
= b
->init(target
);
710 for (i
= optind
; i
< argc
; i
++) {
711 if (strcmp(argv
[i
], "dmiread") == 0) {
717 addr
= strtoul(argv
[++i
], NULL
, 16);
718 dmi_read(addr
, &data
);
719 printf("%02x: %016llx\n", addr
, (unsigned long long)data
);
720 } else if (strcmp(argv
[i
], "dmiwrite") == 0) {
726 addr
= strtoul(argv
[++i
], NULL
, 16);
727 data
= strtoul(argv
[++i
], NULL
, 16);
728 dmi_write(addr
, data
);
729 } else if (strcmp(argv
[i
], "creset") == 0) {
731 } else if (strcmp(argv
[i
], "icreset") == 0) {
733 } else if (strcmp(argv
[i
], "stop") == 0) {
735 } else if (strcmp(argv
[i
], "start") == 0) {
737 } else if (strcmp(argv
[i
], "step") == 0) {
739 } else if (strcmp(argv
[i
], "quit") == 0) {
741 } else if (strcmp(argv
[i
], "status") == 0) {
742 /* do nothing, always done below */
743 } else if (strcmp(argv
[i
], "mr") == 0) {
744 uint64_t addr
, count
= 1;
748 addr
= strtoul(argv
[++i
], NULL
, 16);
749 if (((i
+1) < argc
) && isdigit(argv
[i
+1][0]))
750 count
= strtoul(argv
[++i
], NULL
, 16);
751 mem_read(addr
, count
);
752 } else if (strcmp(argv
[i
], "mw") == 0) {
757 addr
= strtoul(argv
[++i
], NULL
, 16);
758 data
= strtoul(argv
[++i
], NULL
, 16);
759 mem_write(addr
, data
);
760 } else if (strcmp(argv
[i
], "load") == 0) {
761 const char *filename
;
766 filename
= argv
[++i
];
767 if (((i
+1) < argc
) && isdigit(argv
[i
+1][0]))
768 addr
= strtoul(argv
[++i
], NULL
, 16);
769 load(filename
, addr
);
770 } else if (strcmp(argv
[i
], "save") == 0) {
771 const char *filename
;
776 filename
= argv
[++i
];
777 addr
= strtoul(argv
[++i
], NULL
, 16);
778 size
= strtoul(argv
[++i
], NULL
, 16);
779 save(filename
, addr
, size
);
780 } else if (strcmp(argv
[i
], "gpr") == 0) {
781 uint64_t reg
, count
= 1;
785 reg
= strtoul(argv
[++i
], NULL
, 10);
786 if (((i
+1) < argc
) && isdigit(argv
[i
+1][0]))
787 count
= strtoul(argv
[++i
], NULL
, 10);
788 gpr_read(reg
, count
);
789 } else if (strcmp(argv
[i
], "lstart") == 0) {
791 } else if (strcmp(argv
[i
], "lstop") == 0) {
793 } else if (strcmp(argv
[i
], "ldump") == 0) {
794 const char *filename
;
798 filename
= argv
[++i
];
801 fprintf(stderr
, "Unknown command %s\n", argv
[i
]);