32x: drc: new debug facility (pdb). Few fixes thanks to it.
[picodrive.git] / cpu / debug_net.c
diff --git a/cpu/debug_net.c b/cpu/debug_net.c
new file mode 100644 (file)
index 0000000..0305a1a
--- /dev/null
@@ -0,0 +1,126 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <unistd.h>
+
+#include "debug_net.h"
+
+static const char * const regnames[] = {
+  "PC",
+  "R0",   "R1",   "R2",  "R3",  "R4",  "R5",  "R6",   "R7",
+  "R8",   "R9",   "R10", "R11", "R12", "R13", "R14",  "SP",
+  "PC2",  "PC3",  "PR",  "SR",  "GBR", "VBR", "MACH", "MACL",
+  "MEM0", "MEM1", // mem i/o csums
+};
+
+int main(int argc, char *argv[])
+{
+  unsigned int pc_trace[5][4], pc_trace_p[5] = { 0, };
+  struct addrinfo *ai, *ais, hints;
+  int sock = -1, sock1, sock2;
+  struct sockaddr_in6 sa;
+  packet_t packet1, packet2;
+  int i, ret, cnt, cpuid;
+  socklen_t sal;
+
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_flags = AI_CANONNAME;
+  hints.ai_family = PF_UNSPEC;
+  hints.ai_socktype = SOCK_STREAM;
+
+  ret = getaddrinfo("::", "1234", &hints, &ais);
+  if (ret != 0)
+    return -1;
+
+  for (ai = ais; ai != NULL; ai = ai->ai_next) {
+    sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
+    if (sock == -1)
+      continue;
+
+    ret = bind(sock, ai->ai_addr, ai->ai_addrlen);
+    if (ret != 0) {
+      close(sock);
+      sock = -1;
+      continue;
+    }
+    break;
+  }
+  freeaddrinfo(ais);
+
+  if (sock == -1) {
+    perror("failed to bind");
+    return -1;
+  }
+  ret = listen(sock, SOMAXCONN);
+  if (ret != 0) {
+    perror("failed to listen");
+    return -1;
+  }
+
+  sal = sizeof(sa);
+  sock1 = accept(sock, (struct sockaddr *)&sa, &sal);
+  if (sock1 == -1) {
+    perror("failed to accept");
+    return -1;
+  }
+  printf("client1 connected\n");
+
+  sal = sizeof(sa);
+  sock2 = accept(sock, (struct sockaddr *)&sa, &sal);
+  if (sock2 == -1) {
+    perror("failed to accept");
+    return -1;
+  }
+  printf("client2 connected\n");
+
+  for (cnt = 0; ; cnt++)
+  {
+#define tmp_size (4+4 + 24*4 + 2*4)
+    ret = recv(sock1, &packet1, tmp_size, MSG_WAITALL);
+    if (ret != tmp_size) {
+      if (ret < 0)
+        perror("recv1");
+      else
+        printf("recv1 %d\n", ret);
+      return -1;
+    }
+    ret = recv(sock2, &packet2, tmp_size, MSG_WAITALL);
+    if (ret != tmp_size) {
+      if (ret < 0)
+        perror("recv2");
+      else
+        printf("recv2 %d\n", ret);
+      return -1;
+    }
+
+    cpuid = packet1.header.cpuid;
+    if (memcmp(&packet1, &packet2, sizeof(packet1.header) + packet1.header.len) == 0) {
+      pc_trace[cpuid][pc_trace_p[cpuid]++ & 3] = packet1.regs[0];
+      continue;
+    }
+
+    if (*(int *)&packet1.header != *(int *)&packet2.header)
+      printf("%d: header\n", cnt);
+
+    // check regs (and stuff)
+    for (i = 0; i < 1+24+2; i++)
+      if (packet1.regs[i] != packet2.regs[i])
+        printf("%d: %3s: %08x %08x\n", cnt, regnames[i], packet1.regs[i], packet2.regs[i]);
+
+    break;
+  }
+
+  printf("--\nCPU %d, trace:", cpuid);
+  for (i = 0; i < 4; i++)
+    printf(" %08x", pc_trace[cpuid][pc_trace_p[cpuid]++ & 3]);
+  printf(" %08x\n", packet1.regs[0]);
+
+  for (i = 0; i < 24+1; i++)
+    printf("%3s: %08x %08x\n", regnames[i], packet1.regs[i], packet2.regs[i]);
+
+  return 0;
+}
+