4 #include <sys/socket.h>
10 static const char * const regnames[] = {
12 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
13 "R8", "R9", "R10", "R11", "R12", "R13", "R14", "SP",
14 "PC2", "PC3", "PR", "SR", "GBR", "VBR", "MACH", "MACL",
15 "MEM0", "MEM1", // mem i/o csums
18 int main(int argc, char *argv[])
20 unsigned int pc_trace[5][4], pc_trace_p[5] = { 0, };
21 struct addrinfo *ai, *ais, hints;
22 int sock = -1, sock1, sock2;
23 struct sockaddr_in6 sa;
24 packet_t packet1, packet2;
25 int i, ret, cnt, cpuid;
26 int check_len_override = 0;
30 check_len_override = atoi(argv[1]);
32 memset(&hints, 0, sizeof(hints));
33 hints.ai_flags = AI_CANONNAME;
34 hints.ai_family = PF_UNSPEC;
35 hints.ai_socktype = SOCK_STREAM;
37 ret = getaddrinfo("::", "1234", &hints, &ais);
41 for (ai = ais; ai != NULL; ai = ai->ai_next) {
42 sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
46 ret = bind(sock, ai->ai_addr, ai->ai_addrlen);
57 perror("failed to bind");
61 ret = listen(sock, SOMAXCONN);
63 perror("failed to listen");
68 sock1 = accept(sock, (struct sockaddr *)&sa, &sal);
70 perror("failed to accept");
73 printf("client1 connected\n");
76 sock2 = accept(sock, (struct sockaddr *)&sa, &sal);
78 perror("failed to accept");
81 printf("client2 connected\n");
83 for (cnt = 0; ; cnt++)
86 #define tmp_size (4+4 + 24*4 + 2*4)
87 ret = recv(sock1, &packet1, tmp_size, MSG_WAITALL);
88 if (ret != tmp_size) {
92 printf("recv1 %d\n", ret);
95 ret = recv(sock2, &packet2, tmp_size, MSG_WAITALL);
96 if (ret != tmp_size) {
100 printf("recv2 %d\n", ret);
104 cpuid = packet1.header.cpuid;
105 len = sizeof(packet1.header) + packet1.header.len;
106 if (check_len_override > 0)
107 len = check_len_override;
109 if (memcmp(&packet1, &packet2, len) == 0) {
110 pc_trace[cpuid][pc_trace_p[cpuid]++ & 3] = packet1.regs[0];
114 if (packet1.header.cpuid != packet2.header.cpuid)
115 printf("%d: CPU %d %d\n", packet1.header.cpuid & 0xff, packet2.header.cpuid & 0xff);
116 else if (*(int *)&packet1.header != *(int *)&packet2.header)
117 printf("%d: header\n", cnt);
119 // check regs (and stuff)
120 for (i = 0; i < 1+24+2; i++)
121 if (packet1.regs[i] != packet2.regs[i])
122 printf("%d: %3s: %08x %08x\n", cnt, regnames[i], packet1.regs[i], packet2.regs[i]);
127 printf("--\nCPU %d\n", cpuid);
128 for (cpuid = 0; cpuid < 2; cpuid++) {
129 printf("trace%d: ", cpuid);
130 for (i = 0; i < 4; i++)
131 printf(" %08x", pc_trace[cpuid][pc_trace_p[cpuid]++ & 3]);
133 if (packet1.header.cpuid == cpuid)
134 printf(" %08x", packet1.regs[0]);
135 else if (packet2.header.cpuid == cpuid)
136 printf(" %08x", packet2.regs[0]);
140 for (i = 0; i < 24+1; i++)
141 printf("%3s: %08x %08x\n", regnames[i], packet1.regs[i], packet2.regs[i]);