Expand PMF_FN_* macros.
[netbsd-mini2440.git] / sys / arch / landisk / stand / boot / monitor.c
blob063eef28b72371b3d1f471ecda916bbdbcc924bb
1 /* $NetBSD: monitor.c,v 1.2 2008/04/28 20:23:26 martin Exp $ */
3 /*-
4 * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
5 * All rights reserved.
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Kazuki Sakamoto.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
32 #if defined(DBMONITOR)
34 #include <lib/libsa/stand.h>
35 #include <lib/libkern/libkern.h>
37 #include "boot.h"
39 #ifndef NULL
40 #define NULL (void *)0
41 #endif
43 static void db_cmd_dump(int, char **);
44 static void db_cmd_get(int, char **);
45 static void db_cmd_put(int, char **);
46 static void db_cmd_help(int, char **);
48 static int db_atob(char *);
50 static const struct db_cmd {
51 char *name;
52 void (*fcn)(int, char **);
53 } db_cmd[] = {
54 { "dump", db_cmd_dump },
55 { "get", db_cmd_get },
56 { "put", db_cmd_put },
57 { "help", db_cmd_help },
58 { NULL, NULL },
61 int
62 db_monitor(void)
64 char line[1024];
65 char *p, *argv[16];
66 int argc, flag;
67 int tmp;
69 for (;;) {
70 printf("db> ");
71 gets(line);
73 flag = 0;
74 argc = 0;
75 for (p = line; *p != '\0'; p++) {
76 if (*p != ' ' && *p != '\t') {
77 if (!flag) {
78 flag++;
79 argv[argc++] = p;
81 } else {
82 if (flag) {
83 *p = '\0';
84 flag = 0;
88 if (argc == 0)
89 continue;
91 tmp = 0;
92 while (db_cmd[tmp].name != NULL) {
93 if (strcmp("continue", argv[0]) == 0)
94 return 0;
95 if (strcmp(db_cmd[tmp].name, argv[0]) == 0) {
96 (db_cmd[tmp].fcn)(argc, argv);
97 break;
99 tmp++;
101 if (db_cmd[tmp].name == NULL)
102 db_cmd_help(argc, argv);
105 return 0;
108 static int
109 db_atob(char *p)
111 int b = 0, width, tmp, exp, x = 0;
113 if (p[1] == 'x') {
114 p += 2;
115 x = 1;
118 width = strlen(p);
119 while (width--) {
120 exp = 1;
121 for (tmp = 1; tmp <= width; tmp++)
122 exp *= (x ? 16 : 10);
123 if (*p >= '0' && *p <= '9') {
124 tmp = *p - '0';
125 } else {
126 tmp = *p - 'a' + 10;
128 b += tmp * exp;
129 p++;
131 return b;
134 static void
135 db_cmd_dump(int argc, char **argv)
137 char *p, *r, *pp;
138 int mode, add, size, i;
140 switch (argc) {
141 case 4:
142 r = argv[1];
143 switch (r[1]) {
144 case 'b':
145 mode = 1;
146 break;
147 case 'h':
148 mode = 2;
149 break;
150 case 'w':
151 mode = 4;
152 break;
153 default:
154 goto out;
156 p = argv[2];
157 pp = argv[3];
158 break;
159 case 3:
160 mode = 4;
161 p = argv[1];
162 pp = argv[2];
163 break;
164 default:
165 goto out;
168 add = db_atob(p);
169 size = db_atob(pp);
170 i = 0;
171 for (; size > 0;) {
172 if (i == 0) {
173 printf("\n0x%x:", add);
175 switch (mode) {
176 case 1:
177 printf(" ");
178 puthex(*(unsigned char *)add, 1);
179 add += 1;
180 size -= 1;
181 if (++i == 16)
182 i = 0;
183 break;
184 case 2:
185 printf(" ");
186 puthex(*(unsigned short *)add, 2);
187 add += 2;
188 size -= 2;
189 if (++i == 8)
190 i = 0;
191 break;
192 case 4:
193 printf(" ");
194 puthex(*(unsigned int *)add, 4);
195 add += 4;
196 size -= 4;
197 if (++i == 4)
198 i = 0;
199 break;
202 printf("\n");
203 return;
205 out:
206 printf("dump [-b][-h][-w] address size\n");
207 return;
210 static void
211 db_cmd_get(int argc, char **argv)
213 char *p, *r;
214 int mode, add;
215 int val;
217 switch (argc) {
218 case 3:
219 r = argv[1];
220 switch (r[1]) {
221 case 'b':
222 mode = 1;
223 break;
224 case 'h':
225 mode = 2;
226 break;
227 case 'w':
228 mode = 4;
229 break;
230 default:
231 goto out;
233 p = argv[2];
234 break;
235 case 2:
236 mode = 4;
237 p = argv[1];
238 break;
239 default:
240 goto out;
243 add = db_atob(p);
244 printf("0x%x: 0x", add);
245 switch (mode) {
246 case 1:
247 val = *(char *)add;
248 break;
249 case 2:
250 val = *(short *)add;
251 break;
252 case 4:
253 val = *(int *)add;
254 break;
255 default:
256 val = 0;
257 break;
259 puthex(val, mode);
260 printf("\n");
261 return;
263 out:
264 printf("get [-b][-h][-w] address\n");
265 return;
268 static void
269 db_cmd_put(int argc, char **argv)
271 char *p, *r, *pp;
272 int mode, add, data;
274 switch (argc) {
275 case 4:
276 r = argv[1];
277 switch (r[1]) {
278 case 'b':
279 mode = 1;
280 break;
281 case 'h':
282 mode = 2;
283 break;
284 case 'w':
285 mode = 4;
286 break;
287 default:
288 goto out;
290 p = argv[2];
291 pp = argv[3];
292 break;
293 case 3:
294 mode = 4;
295 p = argv[1];
296 pp = argv[2];
297 break;
298 default:
299 goto out;
302 add = db_atob(p);
303 data = db_atob(pp);
304 printf("0x%x: 0x", add);
305 puthex(data, mode);
306 switch (mode) {
307 case 1:
308 *(char *)add = data;
309 break;
310 case 2:
311 *(short *)add = data;
312 break;
313 case 4:
314 *(int *)add = data;
315 break;
317 printf("\n");
318 return;
320 out:
321 printf("put [-b][-h][-w] address data\n");
322 return;
325 static void
326 db_cmd_help(int argc, char **argv)
328 int i = 0;
330 while (db_cmd[i].name != NULL)
331 printf("%s, ", db_cmd[i++].name);
332 printf("continue\n");
335 #endif /* DBMONITOR */