xref: /plan9-contrib/sys/src/cmd/jtagfs/mpssetest.c (revision dedb130315e7b691e306ee069395ee1f0b18e4d4)
1 #include <u.h>
2 #include <libc.h>
3 #include <regexp.h>
4 #include <bio.h>
5 #include "debug.h"
6 #include "tap.h"
7 #include "chain.h"
8 #include "jtag.h"
9 #include "icert.h"
10 #include "mmu.h"
11 #include "mpsse.h"
12 
13 static Biobuf bin;
14 
15 static void
testsh(JMedium * jmed)16 testsh(JMedium *jmed)
17 {
18 	char *ln;
19 	while(ln = Brdstr(&bin, '\n', 1)){
20 		if(ln == nil)
21 			break;
22 		fprint(2, "[%s]\n", ln);
23 		if(strcmp(ln, "") == 0 || ln[0] == '#'){
24 			free(ln);
25 			continue;
26 		}
27 		if(pushcmd(jmed->mdata, ln) < 0)
28 			fprint(2, "error: %r\n");
29 		free(ln);
30 	}
31 }
32 
33 static void
hwreset(JMedium * jmed)34 hwreset(JMedium *jmed)
35 {
36 	/* BUG make this medium independant... */
37 	if(pushcmd(jmed->mdata, "TmsCsOut EdgeDown LSB B0x7 0x7f") < 0)
38 		sysfatal("resetting %r");
39 	if(jmed->flush(jmed->mdata))
40 		sysfatal("resetting %r");
41 	sleep(1000);
42 	jmed->resets(jmed->mdata, 1, 0);
43 	sleep(200);
44 	jmed->resets(jmed->mdata, 1, 1);
45 	sleep(200);
46 	jmed->resets(jmed->mdata, 0, 1);
47 	sleep(200);
48 	jmed->resets(jmed->mdata, 0, 0);
49 	sleep(200);
50 }
51 
52 static void
usage(void)53 usage(void)
54 {
55 	fprint(2, "Usage: %s [-t] [-r] [-d 'a'...] jtagfile\n", argv0);
56 	exits("usage");
57 }
58 
59 static Chain ch;
60 static EiceChain1 ec1;
61 static EiceChain2 ec2;
62 static char dbgstr[256];
63 
64 static ArmCtxt ctxt;
65 static u32int regs[16];
66 
67 static void
testice(JMedium * jmed)68 testice(JMedium *jmed)
69 {
70 	int res, i;
71 	u32int cpuid, data;
72 	debug[Dctxt] = 1;
73 
74 	cpuid = armidentify(jmed);
75 	fprint(2, "---- Cpuid --- %8.8ux\n", cpuid);
76 	if(cpuid == ~0)
77 		sysfatal("not feroceon or WFI bug...");
78 
79 	fprint(2, "---- Bypass probe --- \n");
80 	if(armbpasstest(jmed) < 0)
81 		sysfatal("bypass test");
82 
83 	fprint(2, "---- Check state --- \n");
84 	res = setchain(jmed, ChCommit, 2);
85 	if(res < 0)
86 		sysfatal("setchain %r");
87 
88 	icegetreg(jmed, DebStsReg);
89 
90 	fprint(2, "---- Freeze  --- \n");
91 	res = iceenterdebug(jmed, &ctxt);
92 	if(res < 0)
93 		sysfatal("could not enter debug");
94 	fprint(2, "\n\n\tIn debug state for 1 sec\n\n");
95 	sleep(1000);
96 	fprint(2, "---- MMU test  --- \n");
97 	res = mmurdregs(jmed, &ctxt);
98 	if(res < 0)
99 		sysfatal("mmurdregs %r");
100 
101 	printmmuregs(&ctxt, dbgstr, sizeof dbgstr);
102 	fprint(2, "MMU state:\n%s\n", dbgstr);
103 
104 	fprint(2, "---- Read mem  --- \n");
105 	for(i = 0; i < 10; i++){
106 		res = armrdmemwd(jmed, ctxt.r[15]+4*i, &data, 4);
107 		if(res < 0){
108 			fprint(2, "Error reading %#8.8ux pc[%d]\n", ctxt.r[15]+4*i, i);
109 			break;
110 		}
111 		fprint(2, "Read data %#8.8ux addr %#8.8ux pc[%d]\n",
112 				data, ctxt.r[15]+4*i, i);
113 	}
114 
115 	fprint(2, "---- Write mem (dangerous test) --- \n");
116 
117 	if(0)
118 		for(i = 0; i < 10; i++){
119 			data = 0;
120 			fprint(2, "Write data %#8.8ux addr %#8.8ux pc[%d]\n", data, ctxt.r[15]+4*i, i);
121 			res = armwrmemwd(jmed, ctxt.r[15]+4*i, data, 4);
122 			if(res < 0){
123 				fprint(2, "Error reading %#8.8ux pc[%d]\n", ctxt.r[15]+4*i, i);
124 				break;
125 			}
126 		}
127 
128 	fprint(2, "---- Unfreeze  --- \n");
129 	res = iceexitdebug(jmed, &ctxt);
130 	if(res < 0)
131 		sysfatal("could not exit debug");
132 }
133 
134 
135 void
main(int argc,char * argv[])136 main(int argc, char *argv[])
137 {
138 	JMedium *jmed;
139 	int tsh, rsh, i, jtagfd;
140 	char *deb;
141 
142 	deb = nil;
143 	argv0 = "mpssetest";
144 	tsh = rsh = 0;
145 
146 	ARGBEGIN{
147 	case 't':
148 		tsh = 1;
149 		break;
150 	case 'r':
151 		rsh = 1;
152 		break;
153 	case 'd':
154 		deb = EARGF(usage());
155 		break;
156 	default:
157 		usage();
158 	} ARGEND
159 
160 	if(argc != 1)
161 		usage();
162 
163 	jtagfd = open(argv[0], ORDWR);
164 	if(jtagfd < 0)
165 		sysfatal("cannot open jtag file");
166 
167 	if(deb  != nil)
168 		for(i = 0; i < strlen(deb); i++)
169 			debug[deb[i]]++;
170 	Binit(&bin, 0, OREAD);
171 
172 	if(tsh){
173 		 jmed = newmpsse(jtagfd, Sheeva);
174 		if(jmed == nil)
175 			sysfatal("newmpsse %r");
176 		testsh(jmed);
177 	}
178 	else if(rsh){
179 		jmed = initmpsse(jtagfd, Sheeva);
180 		if(jmed == nil)
181 			sysfatal("initialization %r");
182 		hwreset(jmed);
183 	}
184 	else {
185 		jmed = initmpsse(jtagfd, Sheeva);
186 		if(jmed == nil)
187 			sysfatal("initialization %r");
188 
189 		testice(jmed);
190 	}
191 	Bterm(&bin);
192 	jmed->term(jmed);
193 }
194