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