32x and sms savestates. Core-independent z80 state. SS bugfixing/refactoring.
[picodrive.git] / cpu / debug_net.c
CommitLineData
5686d931 1#include <stdio.h>
04092e32 2#include <stdlib.h>
5686d931 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
11static 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
19int 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;
a2b8c5a5 27 int check_len_override = 0;
5686d931 28 socklen_t sal;
29
a2b8c5a5 30 if (argv[1] != NULL)
31 check_len_override = atoi(argv[1]);
32
5686d931 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 {
a2b8c5a5 86 int len;
5686d931 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;
a2b8c5a5 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) {
5686d931 111 pc_trace[cpuid][pc_trace_p[cpuid]++ & 3] = packet1.regs[0];
112 continue;
113 }
114
a2b8c5a5 115 if (packet1.header.cpuid != packet2.header.cpuid)
04092e32 116 printf("%d: CPU %d %d\n", cnt, packet1.header.cpuid & 0xff, packet2.header.cpuid & 0xff);
a2b8c5a5 117 else if (*(int *)&packet1.header != *(int *)&packet2.header)
5686d931 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
a2b8c5a5 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 }
5686d931 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