debug_net.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * PDB, the PicoDrive debugger
  3. * (C) notaz, 2010
  4. *
  5. * This work is licensed under the terms of MAME license.
  6. * See COPYING file in the top-level directory.
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <sys/types.h>
  12. #include <sys/socket.h>
  13. #include <netdb.h>
  14. #include <unistd.h>
  15. #include "debug_net.h"
  16. static const char * const regnames[] = {
  17. "PC",
  18. "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
  19. "R8", "R9", "R10", "R11", "R12", "R13", "R14", "SP",
  20. "PC2", "PC3", "PR", "SR", "GBR", "VBR", "MACH", "MACL",
  21. "MEM0", "MEM1", // mem i/o csums
  22. };
  23. int main(int argc, char *argv[])
  24. {
  25. unsigned int pc_trace[5][4], pc_trace_p[5] = { 0, };
  26. struct addrinfo *ai, *ais, hints;
  27. int sock = -1, sock1, sock2;
  28. struct sockaddr_in6 sa;
  29. packet_t packet1, packet2;
  30. int i, ret, cnt, cpuid;
  31. int check_len_override = 0;
  32. socklen_t sal;
  33. if (argv[1] != NULL)
  34. check_len_override = atoi(argv[1]);
  35. memset(&hints, 0, sizeof(hints));
  36. hints.ai_flags = AI_CANONNAME;
  37. hints.ai_family = PF_UNSPEC;
  38. hints.ai_socktype = SOCK_STREAM;
  39. ret = getaddrinfo("::", "1234", &hints, &ais);
  40. if (ret != 0)
  41. return -1;
  42. for (ai = ais; ai != NULL; ai = ai->ai_next) {
  43. sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
  44. if (sock == -1)
  45. continue;
  46. ret = bind(sock, ai->ai_addr, ai->ai_addrlen);
  47. if (ret != 0) {
  48. close(sock);
  49. sock = -1;
  50. continue;
  51. }
  52. break;
  53. }
  54. freeaddrinfo(ais);
  55. if (sock == -1) {
  56. perror("failed to bind");
  57. return -1;
  58. }
  59. ret = listen(sock, SOMAXCONN);
  60. if (ret != 0) {
  61. perror("failed to listen");
  62. return -1;
  63. }
  64. sal = sizeof(sa);
  65. sock1 = accept(sock, (struct sockaddr *)&sa, &sal);
  66. if (sock1 == -1) {
  67. perror("failed to accept");
  68. return -1;
  69. }
  70. printf("client1 connected\n");
  71. sal = sizeof(sa);
  72. sock2 = accept(sock, (struct sockaddr *)&sa, &sal);
  73. if (sock2 == -1) {
  74. perror("failed to accept");
  75. return -1;
  76. }
  77. printf("client2 connected\n");
  78. for (cnt = 0; ; cnt++)
  79. {
  80. int len;
  81. #define tmp_size (4+4 + 24*4 + 2*4)
  82. ret = recv(sock1, &packet1, tmp_size, MSG_WAITALL);
  83. if (ret != tmp_size) {
  84. if (ret < 0)
  85. perror("recv1");
  86. else
  87. printf("recv1 %d\n", ret);
  88. return -1;
  89. }
  90. ret = recv(sock2, &packet2, tmp_size, MSG_WAITALL);
  91. if (ret != tmp_size) {
  92. if (ret < 0)
  93. perror("recv2");
  94. else
  95. printf("recv2 %d\n", ret);
  96. return -1;
  97. }
  98. cpuid = packet1.header.cpuid;
  99. len = sizeof(packet1.header) + packet1.header.len;
  100. if (check_len_override > 0)
  101. len = check_len_override;
  102. if (memcmp(&packet1, &packet2, len) == 0) {
  103. pc_trace[cpuid][pc_trace_p[cpuid]++ & 3] = packet1.regs[0];
  104. continue;
  105. }
  106. if (packet1.header.cpuid != packet2.header.cpuid)
  107. printf("%d: CPU %d %d\n", cnt, packet1.header.cpuid & 0xff, packet2.header.cpuid & 0xff);
  108. else if (*(int *)&packet1.header != *(int *)&packet2.header)
  109. printf("%d: header\n", cnt);
  110. // check regs (and stuff)
  111. for (i = 0; i < 1+24+2; i++)
  112. if (packet1.regs[i] != packet2.regs[i])
  113. printf("%d: %3s: %08x %08x\n", cnt, regnames[i], packet1.regs[i], packet2.regs[i]);
  114. break;
  115. }
  116. printf("--\nCPU %d\n", cpuid);
  117. for (cpuid = 0; cpuid < 2; cpuid++) {
  118. printf("trace%d: ", cpuid);
  119. for (i = 0; i < 4; i++)
  120. printf(" %08x", pc_trace[cpuid][pc_trace_p[cpuid]++ & 3]);
  121. if (packet1.header.cpuid == cpuid)
  122. printf(" %08x", packet1.regs[0]);
  123. else if (packet2.header.cpuid == cpuid)
  124. printf(" %08x", packet2.regs[0]);
  125. printf("\n");
  126. }
  127. for (i = 0; i < 24+1; i++)
  128. printf("%3s: %08x %08x\n", regnames[i], packet1.regs[i], packet2.regs[i]);
  129. return 0;
  130. }