32x: drc: new debug facility (pdb). Few fixes thanks to it.
[picodrive.git] / cpu / debug_net.c
CommitLineData
5686d931 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
10static 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
18int 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