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