|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Copyright (c) 1997 Apple Computer, Inc. All rights reserved.
27: * Copyright (c) 1994 NeXT Computer, Inc. All rights reserved.
28: *
29: * machdep/ppc/miniMonMachdep.c
30: *
31: * Machine-dependent code for Remote Debugging Protocol
32: *
33: * March, 1997 Created. Umesh Vaishampayan [[email protected]]
34: *
35: */
36:
37: #include <sys/reboot.h>
38: #include <kern/miniMonPrivate.h>
39:
40:
41: static boolean_t ishex(char c)
42: {
43: if ((c >= '0' && c <= '9') ||
44: (c >= 'a' && c <= 'f') ||
45: (c >= 'A' && c <= 'F'))
46: return TRUE;
47: return FALSE;
48: }
49:
50: static int xx(char c)
51: {
52: if (c >= '0' && c <= '9')
53: return c - '0';
54: if (c >= 'a' && c <= 'f')
55: return c - 'a' + 10;
56: if (c >= 'A' && c <= 'F')
57: return c - 'A' + 10;
58: return 0;
59: }
60:
61: static unsigned int
62: xtoi(char *str)
63: {
64: unsigned int num = 0;
65:
66: while (*str && ishex(*str)) {
67: num = (16 * num) + xx(*str);
68: str++;
69: }
70: return num;
71: }
72:
73: static boolean_t
74: miniMonDump(char *line)
75: {
76: int addr, count;
77: static unsigned int *ptr = 0x10000;
78: static unsigned int old_count = 8;
79: int text;
80:
81: text = ((*line) == 't');
82:
83: /* Skip command name */
84: while (*line && (*line != ' ' && *line != '\t'))
85: line++;
86: /* Skip whitespace */
87: while (*line && (*line == ' ' || *line == '\t'))
88: line++;
89: addr = xtoi(line);
90: if (addr != 0)
91: ptr = (unsigned int *)addr;
92: /* Skip address */
93: while (*line && (*line != ' ' && *line != '\t'))
94: line++;
95: /* Skip whitespace */
96: while (*line && (*line == ' ' || *line == '\t'))
97: line++;
98: if (*line == 's') {
99: safe_prf(ptr);
100: return TRUE;
101: }
102: count = xtoi(line);
103: if (count == 0)
104: count = old_count;
105: else
106: old_count = count;
107: if (count > 1024) count = 1024;
108: safe_prf("%08x : ", ptr);
109: while (count > 0)
110: if( text) {
111: miniMonPutchar(*((char *)ptr)++);
112: count--;
113: } else {
114: safe_prf("%08x ",*ptr++);
115: count -= 4;
116: }
117: safe_prf("\n");
118: return TRUE;
119: }
120:
121: miniMonCommand_t miniMonMDCommands[] =
122: {
123: {"dump", miniMonDump, "Dump memory"},
124: {"text", miniMonDump, "Dump text"},
125: {0,0,0}
126: };
127:
128:
129: /*
130: * Reboot without sync.
131: */
132: boolean_t
133: miniMonReboot(char *line)
134: {
135: boot(RB_BOOT, RB_AUTOBOOT|RB_NOSYNC, "");
136: return FALSE;
137: }
138:
139: /*
140: * Halt with sync.
141: */
142: boolean_t
143: miniMonHalt(char *line)
144: {
145: reboot_mach(RB_HALT);
146: return FALSE;
147: }
148:
149: boolean_t
150: miniMonGdb(char *line)
151: {
152: call_kdp();
153: return FALSE;
154: }
155:
156: int
157: miniMonTryGetchar(void)
158: {
159: return kmtrygetc();
160: }
161:
162: int
163: miniMonGetchar(void)
164: {
165: register int c;
166: do {
167: c = kmtrygetc();
168: } while (c == NO_CHAR);
169: switch (c) {
170: case '\177':
171: c = '\b';
172: break;
173: case '\r':
174: kmputc(0,'\r');
175: c = '\n';
176: break;
177: case 'u'&037:
178: c = '\025';
179: break;
180: default:
181: break;
182: }
183: kmputc(0,c);
184: return c;
185: }
186:
187: void
188: miniMonPutchar(int ch)
189: {
190: kmputc(0,ch);
191: };
192:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.