#define DBG_LOG_ADDR 0x16
#define DBG_LOG_DATA 0x17
+#define DBG_LOG_TRIGGER 0x18
static bool debug;
static void mem_read(uint64_t addr, uint64_t count)
{
- uint64_t data;
- int i, rc;
+ union {
+ uint64_t data;
+ unsigned char c[8];
+ } u;
+ int i, j, rc;
rc = dmi_write(DBG_WB_CTRL, 0x7ff);
if (rc < 0)
if (rc < 0)
return;
for (i = 0; i < count; i++) {
- rc = dmi_read(DBG_WB_DATA, &data);
+ rc = dmi_read(DBG_WB_DATA, &u.data);
if (rc < 0)
return;
- printf("%016llx: %016llx\n",
+ printf("%016llx: %016llx ",
(unsigned long long)addr,
- (unsigned long long)data);
+ (unsigned long long)u.data);
+ for (j = 0; j < 8; ++j)
+ putchar(u.c[j] >= 0x20 && u.c[j] < 0x7f? u.c[j]: '.');
+ putchar('\n');
addr += 8;
}
}
check(dmi_write(DBG_LOG_ADDR, orig_laddr), "writing LOG_ADDR");
}
+static void ltrig_show(void)
+{
+ uint64_t trig;
+
+ check(dmi_read(DBG_LOG_TRIGGER, &trig), "reading LOG_TRIGGER");
+ if (trig & 1)
+ printf("log stop trigger at %" PRIx64, trig & ~3);
+ else
+ printf("log stop trigger disabled");
+ printf(", %striggered\n", (trig & 2? "": "not "));
+}
+
+static void ltrig_off(void)
+{
+ check(dmi_write(DBG_LOG_TRIGGER, 0), "writing LOG_TRIGGER");
+}
+
+static void ltrig_set(uint64_t addr)
+{
+ check(dmi_write(DBG_LOG_TRIGGER, (addr & ~(uint64_t)2) | 1), "writing LOG_TRIGGER");
+}
+
static void usage(const char *cmd)
{
fprintf(stderr, "Usage: %s -b <jtag|sim> <command> <args>\n", cmd);
fprintf(stderr, " lstart start logging\n");
fprintf(stderr, " lstop stop logging\n");
fprintf(stderr, " ldump <file> dump log to file\n");
+ fprintf(stderr, " ltrig show logging stop trigger status\n");
+ fprintf(stderr, " ltrig off clear logging stop trigger address\n");
+ fprintf(stderr, " ltrig <addr> set logging stop trigger address\n");
fprintf(stderr, "\n");
fprintf(stderr, " JTAG:\n");
usage(argv[0]);
filename = argv[++i];
log_dump(filename);
+ } else if (strcmp(argv[i], "ltrig") == 0) {
+ uint64_t addr;
+
+ if ((i+1) >= argc)
+ ltrig_show();
+ else if (strcmp(argv[++i], "off") == 0)
+ ltrig_off();
+ else {
+ addr = strtoul(argv[i], NULL, 16);
+ ltrig_set(addr);
+ }
} else {
fprintf(stderr, "Unknown command %s\n", argv[i]);
- exit(1);
+ usage(argv[0]);
}
}
core_status();