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