monitor.c revision 1.1 1 1.1 sakamoto /* $Id: monitor.c,v 1.1 1998/01/16 04:17:56 sakamoto Exp $ */
2 1.1 sakamoto
3 1.1 sakamoto /*-
4 1.1 sakamoto * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
5 1.1 sakamoto * All rights reserved.
6 1.1 sakamoto *
7 1.1 sakamoto * This code is derived from software contributed to The NetBSD Foundation
8 1.1 sakamoto * by Kazuki Sakamoto.
9 1.1 sakamoto *
10 1.1 sakamoto * Redistribution and use in source and binary forms, with or without
11 1.1 sakamoto * modification, are permitted provided that the following conditions
12 1.1 sakamoto * are met:
13 1.1 sakamoto * 1. Redistributions of source code must retain the above copyright
14 1.1 sakamoto * notice, this list of conditions and the following disclaimer.
15 1.1 sakamoto * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 sakamoto * notice, this list of conditions and the following disclaimer in the
17 1.1 sakamoto * documentation and/or other materials provided with the distribution.
18 1.1 sakamoto * 3. All advertising materials mentioning features or use of this software
19 1.1 sakamoto * must display the following acknowledgement:
20 1.1 sakamoto * This product includes software developed by the NetBSD
21 1.1 sakamoto * Foundation, Inc. and its contributors.
22 1.1 sakamoto * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.1 sakamoto * contributors may be used to endorse or promote products derived
24 1.1 sakamoto * from this software without specific prior written permission.
25 1.1 sakamoto *
26 1.1 sakamoto * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.1 sakamoto * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.1 sakamoto * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.1 sakamoto * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.1 sakamoto * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.1 sakamoto * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.1 sakamoto * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.1 sakamoto * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.1 sakamoto * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.1 sakamoto * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.1 sakamoto * POSSIBILITY OF SUCH DAMAGE.
37 1.1 sakamoto */
38 1.1 sakamoto
39 1.1 sakamoto #include <stand.h>
40 1.1 sakamoto #define NULL 0
41 1.1 sakamoto
42 1.1 sakamoto extern int errno;
43 1.1 sakamoto extern char *name;
44 1.1 sakamoto
45 1.1 sakamoto void db_cmd_dump(int, char **);
46 1.1 sakamoto void db_cmd_get(int, char **);
47 1.1 sakamoto void db_cmd_load(int, char **);
48 1.1 sakamoto void db_cmd_mf(int, char **);
49 1.1 sakamoto void db_cmd_mt(int, char **);
50 1.1 sakamoto void db_cmd_put(int, char **);
51 1.1 sakamoto void db_cmd_run(int, char **);
52 1.1 sakamoto void db_cmd_help(int, char **);
53 1.1 sakamoto
54 1.1 sakamoto struct {
55 1.1 sakamoto char *name;
56 1.1 sakamoto void (*fcn)(int, char **);
57 1.1 sakamoto } db_cmd[] = {
58 1.1 sakamoto { "dump", db_cmd_dump },
59 1.1 sakamoto { "get", db_cmd_get },
60 1.1 sakamoto { "load", db_cmd_load },
61 1.1 sakamoto { "mf", db_cmd_mf },
62 1.1 sakamoto { "mt", db_cmd_mt },
63 1.1 sakamoto { "put", db_cmd_put },
64 1.1 sakamoto { "run", db_cmd_run },
65 1.1 sakamoto { "help", db_cmd_help },
66 1.1 sakamoto { NULL, NULL },
67 1.1 sakamoto };
68 1.1 sakamoto
69 1.1 sakamoto int
70 1.1 sakamoto db_monitor()
71 1.1 sakamoto {
72 1.1 sakamoto int tmp;
73 1.1 sakamoto int argc, flag;
74 1.1 sakamoto char *p, *argv[16];
75 1.1 sakamoto char line[1024];
76 1.1 sakamoto
77 1.1 sakamoto while(1) {
78 1.1 sakamoto printf("db> ");
79 1.1 sakamoto gets(line);
80 1.1 sakamoto
81 1.1 sakamoto flag = 0;
82 1.1 sakamoto for(p = line, argc = 0; *p != '\0'; p++) {
83 1.1 sakamoto if (*p != ' ' && *p != '\t') {
84 1.1 sakamoto if (!flag) {
85 1.1 sakamoto flag++;
86 1.1 sakamoto argv[argc++] = p;
87 1.1 sakamoto }
88 1.1 sakamoto } else {
89 1.1 sakamoto if (flag) {
90 1.1 sakamoto *p = '\0';
91 1.1 sakamoto flag = 0;
92 1.1 sakamoto }
93 1.1 sakamoto }
94 1.1 sakamoto }
95 1.1 sakamoto
96 1.1 sakamoto if (argc == 0)
97 1.1 sakamoto continue;
98 1.1 sakamoto
99 1.1 sakamoto tmp = 0;
100 1.1 sakamoto while (db_cmd[tmp].name != NULL) {
101 1.1 sakamoto if (!strcmp("continue", argv[0]))
102 1.1 sakamoto return 0;
103 1.1 sakamoto if (!strcmp(db_cmd[tmp].name, argv[0])) {
104 1.1 sakamoto (db_cmd[tmp].fcn)(argc, argv);
105 1.1 sakamoto break;
106 1.1 sakamoto }
107 1.1 sakamoto tmp++;
108 1.1 sakamoto }
109 1.1 sakamoto if (db_cmd[tmp].name == NULL)
110 1.1 sakamoto db_cmd_help(argc, argv);
111 1.1 sakamoto }
112 1.1 sakamoto return 0;
113 1.1 sakamoto }
114 1.1 sakamoto
115 1.1 sakamoto int
116 1.1 sakamoto db_atob(p)
117 1.1 sakamoto char *p;
118 1.1 sakamoto {
119 1.1 sakamoto int b = 0, width, tmp, exp, x = 0;
120 1.1 sakamoto
121 1.1 sakamoto if (p[1] == 'x') {
122 1.1 sakamoto p += 2;
123 1.1 sakamoto x = 1;
124 1.1 sakamoto }
125 1.1 sakamoto width = strlen(p);
126 1.1 sakamoto while(width--) {
127 1.1 sakamoto exp = 1;
128 1.1 sakamoto for (tmp = 1; tmp <= width; tmp++)
129 1.1 sakamoto exp *= (x ? 16 : 10);
130 1.1 sakamoto if (*p >= '0' && *p <= '9') {
131 1.1 sakamoto tmp = *p - '0';
132 1.1 sakamoto } else {
133 1.1 sakamoto tmp = *p - 'a' + 10;
134 1.1 sakamoto }
135 1.1 sakamoto b += tmp * exp;
136 1.1 sakamoto p++;
137 1.1 sakamoto }
138 1.1 sakamoto return b;
139 1.1 sakamoto }
140 1.1 sakamoto
141 1.1 sakamoto void
142 1.1 sakamoto db_cmd_dump(argc, argv)
143 1.1 sakamoto int argc;
144 1.1 sakamoto char **argv;
145 1.1 sakamoto {
146 1.1 sakamoto char *p, *r, *pp;
147 1.1 sakamoto int mode, add, size, i;
148 1.1 sakamoto
149 1.1 sakamoto switch (argc) {
150 1.1 sakamoto case 4:
151 1.1 sakamoto r = argv[1];
152 1.1 sakamoto switch (r[1]) {
153 1.1 sakamoto case 'b':
154 1.1 sakamoto mode = 1;
155 1.1 sakamoto break;
156 1.1 sakamoto case 'h':
157 1.1 sakamoto mode = 2;
158 1.1 sakamoto break;
159 1.1 sakamoto case 'w':
160 1.1 sakamoto mode = 4;
161 1.1 sakamoto break;
162 1.1 sakamoto default:
163 1.1 sakamoto goto out;
164 1.1 sakamoto }
165 1.1 sakamoto p = argv[2];
166 1.1 sakamoto pp = argv[3];
167 1.1 sakamoto break;
168 1.1 sakamoto case 3:
169 1.1 sakamoto mode = 4;
170 1.1 sakamoto p = argv[1];
171 1.1 sakamoto pp = argv[2];
172 1.1 sakamoto break;
173 1.1 sakamoto default:
174 1.1 sakamoto goto out;
175 1.1 sakamoto }
176 1.1 sakamoto
177 1.1 sakamoto add = db_atob(p);
178 1.1 sakamoto size = db_atob(pp);
179 1.1 sakamoto i = 0;
180 1.1 sakamoto for (; size > 0;) {
181 1.1 sakamoto if (!i)
182 1.1 sakamoto printf("\n0x%x:", add);
183 1.1 sakamoto switch (mode) {
184 1.1 sakamoto case 1:
185 1.1 sakamoto printf(" %x", *(unsigned char *)add);
186 1.1 sakamoto add += 1;
187 1.1 sakamoto size -= 1;
188 1.1 sakamoto if (++i == 16)
189 1.1 sakamoto i = 0;
190 1.1 sakamoto break;
191 1.1 sakamoto case 2:
192 1.1 sakamoto printf(" %x", *(unsigned short *)add);
193 1.1 sakamoto add += 2;
194 1.1 sakamoto size -= 2;
195 1.1 sakamoto if (++i == 8)
196 1.1 sakamoto i = 0;
197 1.1 sakamoto break;
198 1.1 sakamoto case 4:
199 1.1 sakamoto printf(" %x", *(unsigned int *)add);
200 1.1 sakamoto add += 4;
201 1.1 sakamoto size -= 4;
202 1.1 sakamoto if (++i == 4)
203 1.1 sakamoto i = 0;
204 1.1 sakamoto break;
205 1.1 sakamoto }
206 1.1 sakamoto }
207 1.1 sakamoto printf("\n");
208 1.1 sakamoto return;
209 1.1 sakamoto
210 1.1 sakamoto out:
211 1.1 sakamoto printf("dump [-b][-h][-w] address size\n");
212 1.1 sakamoto return;
213 1.1 sakamoto }
214 1.1 sakamoto
215 1.1 sakamoto void
216 1.1 sakamoto db_cmd_get(argc, argv)
217 1.1 sakamoto int argc;
218 1.1 sakamoto char **argv;
219 1.1 sakamoto {
220 1.1 sakamoto char *p, *r;
221 1.1 sakamoto int mode, add;
222 1.1 sakamoto
223 1.1 sakamoto switch (argc) {
224 1.1 sakamoto case 3:
225 1.1 sakamoto r = argv[1];
226 1.1 sakamoto switch (r[1]) {
227 1.1 sakamoto case 'b':
228 1.1 sakamoto mode = 1;
229 1.1 sakamoto break;
230 1.1 sakamoto case 'h':
231 1.1 sakamoto mode = 2;
232 1.1 sakamoto break;
233 1.1 sakamoto case 'w':
234 1.1 sakamoto mode = 4;
235 1.1 sakamoto break;
236 1.1 sakamoto default:
237 1.1 sakamoto goto out;
238 1.1 sakamoto }
239 1.1 sakamoto p = argv[2];
240 1.1 sakamoto break;
241 1.1 sakamoto case 2:
242 1.1 sakamoto mode = 4;
243 1.1 sakamoto p = argv[1];
244 1.1 sakamoto break;
245 1.1 sakamoto default:
246 1.1 sakamoto goto out;
247 1.1 sakamoto }
248 1.1 sakamoto
249 1.1 sakamoto add = db_atob(p);
250 1.1 sakamoto printf("0x%x: ", add);
251 1.1 sakamoto switch (mode) {
252 1.1 sakamoto case 1:
253 1.1 sakamoto printf("0x%x", *(char *)add);
254 1.1 sakamoto break;
255 1.1 sakamoto case 2:
256 1.1 sakamoto printf("0x%x", *(short *)add);
257 1.1 sakamoto break;
258 1.1 sakamoto case 4:
259 1.1 sakamoto printf("0x%x", *(int *)add);
260 1.1 sakamoto break;
261 1.1 sakamoto }
262 1.1 sakamoto printf("\n");
263 1.1 sakamoto return;
264 1.1 sakamoto
265 1.1 sakamoto out:
266 1.1 sakamoto printf("get [-b][-h][-w] address\n");
267 1.1 sakamoto return;
268 1.1 sakamoto }
269 1.1 sakamoto
270 1.1 sakamoto void
271 1.1 sakamoto db_cmd_put(argc, argv)
272 1.1 sakamoto int argc;
273 1.1 sakamoto char **argv;
274 1.1 sakamoto {
275 1.1 sakamoto char *p, *r, *pp;
276 1.1 sakamoto int mode, add, data;
277 1.1 sakamoto
278 1.1 sakamoto switch (argc) {
279 1.1 sakamoto case 4:
280 1.1 sakamoto r = argv[1];
281 1.1 sakamoto switch (r[1]) {
282 1.1 sakamoto case 'b':
283 1.1 sakamoto mode = 1;
284 1.1 sakamoto break;
285 1.1 sakamoto case 'h':
286 1.1 sakamoto mode = 2;
287 1.1 sakamoto break;
288 1.1 sakamoto case 'w':
289 1.1 sakamoto mode = 4;
290 1.1 sakamoto break;
291 1.1 sakamoto default:
292 1.1 sakamoto goto out;
293 1.1 sakamoto }
294 1.1 sakamoto p = argv[2];
295 1.1 sakamoto pp = argv[3];
296 1.1 sakamoto break;
297 1.1 sakamoto case 3:
298 1.1 sakamoto mode = 4;
299 1.1 sakamoto p = argv[1];
300 1.1 sakamoto pp = argv[2];
301 1.1 sakamoto break;
302 1.1 sakamoto default:
303 1.1 sakamoto goto out;
304 1.1 sakamoto }
305 1.1 sakamoto
306 1.1 sakamoto add = db_atob(p);
307 1.1 sakamoto data = db_atob(pp);
308 1.1 sakamoto printf("0x%x: 0x%x", add, data);
309 1.1 sakamoto switch (mode) {
310 1.1 sakamoto case 1:
311 1.1 sakamoto *(char *)add = data;
312 1.1 sakamoto break;
313 1.1 sakamoto case 2:
314 1.1 sakamoto *(short *)add = data;
315 1.1 sakamoto break;
316 1.1 sakamoto case 4:
317 1.1 sakamoto *(int *)add = data;
318 1.1 sakamoto break;
319 1.1 sakamoto }
320 1.1 sakamoto printf("\n");
321 1.1 sakamoto return;
322 1.1 sakamoto
323 1.1 sakamoto out:
324 1.1 sakamoto printf("put [-b][-h][-w] address data\n");
325 1.1 sakamoto return;
326 1.1 sakamoto }
327 1.1 sakamoto
328 1.1 sakamoto #define STR(x) #x
329 1.1 sakamoto
330 1.1 sakamoto #define FUNC(x) \
331 1.1 sakamoto unsigned int mf ## x() { \
332 1.1 sakamoto unsigned int tmp; \
333 1.1 sakamoto asm volatile (STR(mf ## x %0) : STR(=r)(tmp)); \
334 1.1 sakamoto return (tmp); \
335 1.1 sakamoto } \
336 1.1 sakamoto void mt ## x(data) \
337 1.1 sakamoto unsigned int data; \
338 1.1 sakamoto { \
339 1.1 sakamoto asm volatile (STR(mt ## x %0) :: STR(r)(data)); \
340 1.1 sakamoto } \
341 1.1 sakamoto
342 1.1 sakamoto #define DEF(x) \
343 1.1 sakamoto { #x, mf ## x, mt ## x }
344 1.1 sakamoto
345 1.1 sakamoto FUNC(msr);
346 1.1 sakamoto
347 1.1 sakamoto struct {
348 1.1 sakamoto char *op;
349 1.1 sakamoto unsigned int (*mf)(void);
350 1.1 sakamoto void (*mt)(unsigned int);
351 1.1 sakamoto } mreg [] = {
352 1.1 sakamoto DEF(msr),
353 1.1 sakamoto { NULL, NULL, NULL },
354 1.1 sakamoto };
355 1.1 sakamoto
356 1.1 sakamoto void
357 1.1 sakamoto db_cmd_mf(argc, argv)
358 1.1 sakamoto int argc;
359 1.1 sakamoto char **argv;
360 1.1 sakamoto {
361 1.1 sakamoto int i = 0;
362 1.1 sakamoto
363 1.1 sakamoto if (argc != 2) {
364 1.1 sakamoto printf("mf register\nregister:");
365 1.1 sakamoto while (mreg[i].op != NULL)
366 1.1 sakamoto printf(" %s", mreg[i++].op);
367 1.1 sakamoto printf("\n");
368 1.1 sakamoto return;
369 1.1 sakamoto }
370 1.1 sakamoto
371 1.1 sakamoto while (mreg[i].op != NULL) {
372 1.1 sakamoto if (!strcmp(mreg[i].op, argv[1])) {
373 1.1 sakamoto printf(" 0x%x\n", (mreg[i].mf)());
374 1.1 sakamoto break;
375 1.1 sakamoto }
376 1.1 sakamoto i++;
377 1.1 sakamoto }
378 1.1 sakamoto }
379 1.1 sakamoto
380 1.1 sakamoto void
381 1.1 sakamoto db_cmd_mt(argc, argv)
382 1.1 sakamoto int argc;
383 1.1 sakamoto char **argv;
384 1.1 sakamoto {
385 1.1 sakamoto int i = 0;
386 1.1 sakamoto
387 1.1 sakamoto if (argc != 3) {
388 1.1 sakamoto printf("mt register data\nregister:");
389 1.1 sakamoto while (mreg[i].op != NULL)
390 1.1 sakamoto printf(" %s", mreg[i++].op);
391 1.1 sakamoto printf("\n");
392 1.1 sakamoto return;
393 1.1 sakamoto }
394 1.1 sakamoto
395 1.1 sakamoto while (mreg[i].op != NULL) {
396 1.1 sakamoto if (!strcmp(mreg[i].op, argv[1])) {
397 1.1 sakamoto (mreg[i].mt)((unsigned int)db_atob(argv[2]));
398 1.1 sakamoto printf(" 0x%x\n", db_atob(argv[2]));
399 1.1 sakamoto break;
400 1.1 sakamoto }
401 1.1 sakamoto i++;
402 1.1 sakamoto }
403 1.1 sakamoto }
404 1.1 sakamoto
405 1.1 sakamoto int load_flag = 0;
406 1.1 sakamoto void
407 1.1 sakamoto db_cmd_load(argc, argv)
408 1.1 sakamoto int argc;
409 1.1 sakamoto char **argv;
410 1.1 sakamoto {
411 1.1 sakamoto int fd;
412 1.1 sakamoto extern int args;
413 1.1 sakamoto
414 1.1 sakamoto load_flag++;
415 1.1 sakamoto args = 0;
416 1.1 sakamoto getbootdev(&args);
417 1.1 sakamoto fd = open(name, 0);
418 1.1 sakamoto if (fd >= 0) {
419 1.1 sakamoto exec_kernel(fd, &args);
420 1.1 sakamoto close(fd);
421 1.1 sakamoto } else {
422 1.1 sakamoto printf("open error:%s\n", strerror(errno));
423 1.1 sakamoto }
424 1.1 sakamoto load_flag--;
425 1.1 sakamoto }
426 1.1 sakamoto
427 1.1 sakamoto void
428 1.1 sakamoto db_cmd_run(argc, argv)
429 1.1 sakamoto int argc;
430 1.1 sakamoto char **argv;
431 1.1 sakamoto {
432 1.1 sakamoto long entry;
433 1.1 sakamoto
434 1.1 sakamoto if (argc != 2) {
435 1.1 sakamoto printf("run address\n");
436 1.1 sakamoto return;
437 1.1 sakamoto }
438 1.1 sakamoto
439 1.1 sakamoto entry = (long)db_atob(argv[1]);
440 1.1 sakamoto printf("Booting: 0x%x\n", entry);
441 1.1 sakamoto
442 1.1 sakamoto *(volatile long *)0x0080 = entry;
443 1.1 sakamoto run((void *)entry);
444 1.1 sakamoto }
445 1.1 sakamoto
446 1.1 sakamoto void
447 1.1 sakamoto db_cmd_help(argc, argv)
448 1.1 sakamoto int argc;
449 1.1 sakamoto char **argv;
450 1.1 sakamoto {
451 1.1 sakamoto int i = 0;
452 1.1 sakamoto
453 1.1 sakamoto while (db_cmd[i].name != NULL)
454 1.1 sakamoto printf("%s, ", db_cmd[i++].name);
455 1.1 sakamoto printf("\n");
456 1.1 sakamoto }
457