debug_net.c 3.0 KB

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