0305a1a73ef8255378fe1a99e1285e2be8fb78c7
[picodrive.git] / cpu / debug_net.c
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
8 #include "debug_net.h"
9
10 static const char * const regnames[] = {
11   "PC",
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
16 };
17
18 int main(int argc, char *argv[])
19 {
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   socklen_t sal;
27
28   memset(&hints, 0, sizeof(hints));
29   hints.ai_flags = AI_CANONNAME;
30   hints.ai_family = PF_UNSPEC;
31   hints.ai_socktype = SOCK_STREAM;
32
33   ret = getaddrinfo("::", "1234", &hints, &ais);
34   if (ret != 0)
35     return -1;
36
37   for (ai = ais; ai != NULL; ai = ai->ai_next) {
38     sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
39     if (sock == -1)
40       continue;
41
42     ret = bind(sock, ai->ai_addr, ai->ai_addrlen);
43     if (ret != 0) {
44       close(sock);
45       sock = -1;
46       continue;
47     }
48     break;
49   }
50   freeaddrinfo(ais);
51
52   if (sock == -1) {
53     perror("failed to bind");
54     return -1;
55   }
56  
57   ret = listen(sock, SOMAXCONN);
58   if (ret != 0) {
59     perror("failed to listen");
60     return -1;
61   }
62
63   sal = sizeof(sa);
64   sock1 = accept(sock, (struct sockaddr *)&sa, &sal);
65   if (sock1 == -1) {
66     perror("failed to accept");
67     return -1;
68   }
69   printf("client1 connected\n");
70
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
79   for (cnt = 0; ; cnt++)
80   {
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
99     cpuid = packet1.header.cpuid;
100     if (memcmp(&packet1, &packet2, sizeof(packet1.header) + packet1.header.len) == 0) {
101       pc_trace[cpuid][pc_trace_p[cpuid]++ & 3] = packet1.regs[0];
102       continue;
103     }
104
105     if (*(int *)&packet1.header != *(int *)&packet2.header)
106       printf("%d: header\n", cnt);
107
108     // check regs (and stuff)
109     for (i = 0; i < 1+24+2; i++)
110       if (packet1.regs[i] != packet2.regs[i])
111         printf("%d: %3s: %08x %08x\n", cnt, regnames[i], packet1.regs[i], packet2.regs[i]);
112
113     break;
114   }
115
116   printf("--\nCPU %d, trace:", cpuid);
117   for (i = 0; i < 4; i++)
118     printf(" %08x", pc_trace[cpuid][pc_trace_p[cpuid]++ & 3]);
119   printf(" %08x\n", packet1.regs[0]);
120
121   for (i = 0; i < 24+1; i++)
122     printf("%3s: %08x %08x\n", regnames[i], packet1.regs[i], packet2.regs[i]);
123
124   return 0;
125 }
126