|
|
@ -175,7 +175,11 @@ static int sim_command(uint8_t op, uint8_t addr, uint64_t *data)
|
|
|
|
printf("%02x ", buf[i]);
|
|
|
|
printf("%02x ", buf[i]);
|
|
|
|
printf("\n");
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
write(sim_fd, buf, p - buf);
|
|
|
|
r = write(sim_fd, buf, p - buf);
|
|
|
|
|
|
|
|
if (r < 0) {
|
|
|
|
|
|
|
|
fprintf(stderr, "failed to write sim command\n");
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
r = read(sim_fd, buf, sizeof(buf));
|
|
|
|
r = read(sim_fd, buf, sizeof(buf));
|
|
|
|
if (0 && r > 0) {
|
|
|
|
if (0 && r > 0) {
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
@ -506,6 +510,37 @@ static void load(const char *filename, uint64_t addr)
|
|
|
|
if (!(count % 1024))
|
|
|
|
if (!(count % 1024))
|
|
|
|
printf("%x...\n", count);
|
|
|
|
printf("%x...\n", count);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
printf("%x done.\n", count);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void save(const char *filename, uint64_t addr, uint64_t size)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
uint64_t data;
|
|
|
|
|
|
|
|
int fd, rc, count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fd = open(filename, O_WRONLY | O_CREAT, 00666);
|
|
|
|
|
|
|
|
if (fd < 0) {
|
|
|
|
|
|
|
|
fprintf(stderr, "Failed to open '%s': %s\n", filename, strerror(errno));
|
|
|
|
|
|
|
|
exit(1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
check(dmi_write(DBG_WB_CTRL, 0x7ff), "writing WB_CTRL");
|
|
|
|
|
|
|
|
check(dmi_write(DBG_WB_ADDR, addr), "writing WB_ADDR");
|
|
|
|
|
|
|
|
count = 0;
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
|
|
|
|
check(dmi_read(DBG_WB_DATA, &data), "reading WB_DATA");
|
|
|
|
|
|
|
|
rc = write(fd, &data, 8);
|
|
|
|
|
|
|
|
if (rc <= 0) {
|
|
|
|
|
|
|
|
fprintf(stderr, "Failed to write: %s\n", strerror(errno));
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
count += 8;
|
|
|
|
|
|
|
|
if (!(count % 1024))
|
|
|
|
|
|
|
|
printf("%x...\n", count);
|
|
|
|
|
|
|
|
if (count >= size)
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
close(fd);
|
|
|
|
printf("%x done.\n", count);
|
|
|
|
printf("%x done.\n", count);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -523,9 +558,10 @@ static void usage(const char *cmd)
|
|
|
|
|
|
|
|
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
fprintf(stderr, " Memory:\n");
|
|
|
|
fprintf(stderr, " Memory:\n");
|
|
|
|
fprintf(stderr, " mr <hex addr>\n");
|
|
|
|
fprintf(stderr, " mr <hex addr> [count]\n");
|
|
|
|
fprintf(stderr, " mw <hex addr> <hex value>\n");
|
|
|
|
fprintf(stderr, " mw <hex addr> <hex value>\n");
|
|
|
|
fprintf(stderr, " load <file> [addr] If omitted address is 0\n");
|
|
|
|
fprintf(stderr, " load <file> [addr] If omitted address is 0\n");
|
|
|
|
|
|
|
|
fprintf(stderr, " save <file> <addr> <size>\n");
|
|
|
|
|
|
|
|
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
fprintf(stderr, " Registers:\n");
|
|
|
|
fprintf(stderr, " Registers:\n");
|
|
|
@ -651,6 +687,16 @@ int main(int argc, char *argv[])
|
|
|
|
if (((i+1) < argc) && isdigit(argv[i+1][0]))
|
|
|
|
if (((i+1) < argc) && isdigit(argv[i+1][0]))
|
|
|
|
addr = strtoul(argv[++i], NULL, 16);
|
|
|
|
addr = strtoul(argv[++i], NULL, 16);
|
|
|
|
load(filename, addr);
|
|
|
|
load(filename, addr);
|
|
|
|
|
|
|
|
} else if (strcmp(argv[i], "save") == 0) {
|
|
|
|
|
|
|
|
const char *filename;
|
|
|
|
|
|
|
|
uint64_t addr, size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((i+3) >= argc)
|
|
|
|
|
|
|
|
usage(argv[0]);
|
|
|
|
|
|
|
|
filename = argv[++i];
|
|
|
|
|
|
|
|
addr = strtoul(argv[++i], NULL, 16);
|
|
|
|
|
|
|
|
size = strtoul(argv[++i], NULL, 16);
|
|
|
|
|
|
|
|
save(filename, addr, size);
|
|
|
|
} else if (strcmp(argv[i], "gpr") == 0) {
|
|
|
|
} else if (strcmp(argv[i], "gpr") == 0) {
|
|
|
|
uint64_t reg, count = 1;
|
|
|
|
uint64_t reg, count = 1;
|
|
|
|
|
|
|
|
|
|
|
|