|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * This file contains firmware code.
24: *
25: */
26:
27: #include <cpus.h>
28: #include <debug.h>
29: #include <mach_vm_debug.h>
30: #include <db_machine_commands.h>
31:
32: #include <kern/thread.h>
33: #include <mach/vm_attributes.h>
34: #include <mach/vm_param.h>
35: #include <kern/spl.h>
36:
37: #include <kern/misc_protos.h>
38: #include <ppc/misc_protos.h>
39: #include <ppc/proc_reg.h>
40: #include <ppc/mem.h>
41: #include <ppc/pmap.h>
42: #include <ppc/pmap_internals.h>
43: #include <ppc/new_screen.h>
44: #include <ppc/Firmware.h>
45: #include <ppc/mappings.h>
46: #include <pexpert/ppc/powermac.h>
47: #include <ddb/db_output.h>
48:
49: extern Boot_Video boot_video_info;
50: Boot_Video dgVideo;
51: extern GDWorkArea GratefulDebWork[];
52:
53: typedef struct RuptCtr { /* Counts hardware interrupts */
54: struct GDpos { /* Screen position for Grateful Deb display */
55: unsigned short col; /* Column (-1 means no display) */
56: unsigned short row; /* Row */
57: } GDpos;
58: unsigned int count; /* Count of interrupt */
59: unsigned int timed; /* If set, count updates at timed rate */
60: unsigned int lasttime; /* Low of timebase when last updated */
61: } RuptCtr;
62:
63: /* Window layout for Grateful Deb:
64: *
65: * 0 9
66: *
67: * 0 Total Decrimenter
68: * 1 DSI ISI
69: * 2 System call External
70: * 3 SIGP Floating point
71: * 4 Program Alignment
72: */
73:
74:
75:
76:
77:
78: RuptCtr RuptCtrs[96] = {
79: { { 0, 0}, 0, 1 }, /* Total interruptions */
80: { {-1, -1}, 0, 0 }, /* Reset */
81: { {-1, -1}, 0, 0 }, /* Machine check */
82: { { 0, 1}, 0, 1 }, /* DSIs */
83: { { 1, 1}, 0, 1 }, /* ISIs */
84: { { 1, 2}, 0, 1 }, /* Externals */
85: { { 1, 4}, 0, 0 }, /* Alignment */
86: { { 0, 4}, 0, 0 }, /* Program */
87: { { 1, 3}, 0, 0 }, /* Floating point */
88: { { 1, 0}, 0, 1 }, /* Decrementer */
89: { {-1, -1}, 0, 0 }, /* I/O error */
90: { {-1, -1}, 0, 0 }, /* Reserved */
91: { { 0, 2}, 0, 1 }, /* System call */
92: { {-1, -1}, 0, 0 }, /* Trace */
93: { {-1, -1}, 0, 0 }, /* Floating point assist */
94: { {-1, -1}, 0, 0 }, /* Performance monitor */
95: { {-1, -1}, 0, 0 }, /* VMX */
96: { {-1, -1}, 0, 0 }, /* Reserved */
97: { {-1, -1}, 0, 0 }, /* Reserved */
98: { {-1, -1}, 0, 0 }, /* Reserved */
99: { {-1, -1}, 0, 0 }, /* Instruction breakpoint */
100: { {-1, -1}, 0, 0 }, /* System management */
101: { {-1, -1}, 0, 0 }, /* Reserved */
102: { {-1, -1}, 0, 0 }, /* Reserved */
103: { {-1, -1}, 0, 0 }, /* Reserved */
104: { {-1, -1}, 0, 0 }, /* Reserved */
105: { {-1, -1}, 0, 0 }, /* Reserved */
106: { {-1, -1}, 0, 0 }, /* Reserved */
107: { {-1, -1}, 0, 0 }, /* Reserved */
108: { {-1, -1}, 0, 0 }, /* Reserved */
109: { {-1, -1}, 0, 0 }, /* Reserved */
110: { {-1, -1}, 0, 0 }, /* Reserved */
111: { {-1, -1}, 0, 0 }, /* Reserved */
112: { {-1, -1}, 0, 0 }, /* Trace */
113: { { 0, 3}, 0, 0 }, /* SIGP */
114: { {-1, -1}, 0, 0 }, /* Preemption */
115: { {-1, -1}, 0, 0 }, /* Context switch */
116: { {-1, -1}, 0, 0 }, /* Reserved */
117: { {-1, -1}, 0, 0 }, /* Reserved */
118: { {-1, -1}, 0, 0 }, /* Reserved */
119: { {-1, -1}, 0, 0 }, /* Reserved */
120: { {-1, -1}, 0, 0 }, /* Reserved */
121: { {-1, -1}, 0, 0 }, /* Reserved */
122: { {-1, -1}, 0, 0 }, /* Reserved */
123: { {-1, -1}, 0, 0 }, /* Reserved */
124: { {-1, -1}, 0, 0 }, /* Reserved */
125: { {-1, -1}, 0, 0 }, /* Reserved */
126: { {-1, -1}, 0, 0 }, /* Special, update frequency controls */
127:
128: /* Start of second processor counts */
129:
130: { { 0, 0}, 0, 1 }, /* Total interruptions */
131: { {-1, -1}, 0, 0 }, /* Reset */
132: { {-1, -1}, 0, 0 }, /* Machine check */
133: { { 0, 1}, 0, 1 }, /* DSIs */
134: { { 1, 1}, 0, 1 }, /* ISIs */
135: { { 1, 2}, 0, 1 }, /* Externals */
136: { { 1, 4}, 0, 0 }, /* Alignment */
137: { { 0, 4}, 0, 0 }, /* Program */
138: { { 1, 3}, 0, 0 }, /* Floating point */
139: { { 1, 0}, 0, 1 }, /* Decrementer */
140: { {-1, -1}, 0, 0 }, /* I/O error */
141: { {-1, -1}, 0, 0 }, /* Reserved */
142: { { 0, 2}, 0, 1 }, /* System call */
143: { {-1, -1}, 0, 0 }, /* Trace */
144: { {-1, -1}, 0, 0 }, /* Floating point assist */
145: { {-1, -1}, 0, 0 }, /* Performance monitor */
146: { {-1, -1}, 0, 0 }, /* VMX */
147: { {-1, -1}, 0, 0 }, /* Reserved */
148: { {-1, -1}, 0, 0 }, /* Reserved */
149: { {-1, -1}, 0, 0 }, /* Reserved */
150: { {-1, -1}, 0, 0 }, /* Instruction breakpoint */
151: { {-1, -1}, 0, 0 }, /* System management */
152: { {-1, -1}, 0, 0 }, /* Reserved */
153: { {-1, -1}, 0, 0 }, /* Reserved */
154: { {-1, -1}, 0, 0 }, /* Reserved */
155: { {-1, -1}, 0, 0 }, /* Reserved */
156: { {-1, -1}, 0, 0 }, /* Reserved */
157: { {-1, -1}, 0, 0 }, /* Reserved */
158: { {-1, -1}, 0, 0 }, /* Reserved */
159: { {-1, -1}, 0, 0 }, /* Reserved */
160: { {-1, -1}, 0, 0 }, /* Reserved */
161: { {-1, -1}, 0, 0 }, /* Reserved */
162: { {-1, -1}, 0, 0 }, /* Reserved */
163: { {-1, -1}, 0, 0 }, /* Trace */
164: { { 0, 3}, 0, 0 }, /* SIGP */
165: { {-1, -1}, 0, 0 }, /* Preemption */
166: { {-1, -1}, 0, 0 }, /* Context switch */
167: { {-1, -1}, 0, 0 }, /* Reserved */
168: { {-1, -1}, 0, 0 }, /* Reserved */
169: { {-1, -1}, 0, 0 }, /* Reserved */
170: { {-1, -1}, 0, 0 }, /* Reserved */
171: { {-1, -1}, 0, 0 }, /* Reserved */
172: { {-1, -1}, 0, 0 }, /* Reserved */
173: { {-1, -1}, 0, 0 }, /* Reserved */
174: { {-1, -1}, 0, 0 }, /* Reserved */
175: { {-1, -1}, 0, 0 }, /* Reserved */
176: { {-1, -1}, 0, 0 }, /* Reserved */
177: { {-1, -1}, 0, 0 } /* Special, update frequency controls */
178: };
179:
180: void GratefulDebInit(bootBumbleC *boot_video_info) { /* Initialize the video debugger */
181:
182: unsigned int fillframe[256];
183: unsigned int startpos, startbyte, windowleft, newwidth, i, j, startword, oldwidth, nrmlgn;
184: unsigned int nwords, *byteleft, lstlgn, pixlgn, bytelgn;
185:
186: if(!boot_video_info) { /* Are we disabling it?
187: GratefulDebWork[0].GDready = 0; /* Disable output */
188: return;
189: }
190:
191: nrmlgn = (9 * GDfontsize) * (boot_video_info->v_depth / 8); /* Get the normal column size in bytes */
192: lstlgn = (((8 * GDfontsize) + (GDfontsize >> 1)) * boot_video_info->v_depth) / 8; /* Same as normal, but with 1/2 character space */
193: nrmlgn = (nrmlgn + 31) & -32; /* Round to a line */
194:
195: bytelgn = (nrmlgn * (GDdispcols - 1)) + lstlgn; /* Length in bytes */
196: pixlgn = bytelgn / (boot_video_info->v_depth / 8); /* Number of pixels wide */
197:
198: startbyte = (boot_video_info->v_width * (boot_video_info->v_depth / 8)) - bytelgn; /* Get the starting byte unaligned */
199: startpos = boot_video_info->v_width - pixlgn; /* Starting pixel position */
200:
201: startbyte += (unsigned int)boot_video_info->v_baseAddr & 31; /* Add the extra to cache boundary in frame buffer */
202: startbyte &= -32; /* Make sure it's on a cache line for speed */
203: startbyte += (unsigned int)boot_video_info->v_baseAddr & 31; /* Subtract the extra to cache boundary in frame buffer */
204:
205: windowleft = startbyte - (((GDfontsize / 2) * boot_video_info->v_depth) / 8); /* Back up a half character */
206: windowleft &= -4; /* Make sure it is on a word boundary */
207: newwidth = windowleft / (boot_video_info->v_depth / 8); /* Get the new pixel width of screen */
208:
209: oldwidth = boot_video_info->v_width; /* Save the old width */
210: // boot_video_info->v_width = newwidth; /* Set the new width */
211:
212: nwords = oldwidth - newwidth; /* See how much to fill in pixels */
213: nwords = nwords / (32 / boot_video_info->v_depth); /* Get that in bytes */
214:
215: startword = (newwidth + 3) / 4; /* Where does it start? */
216:
217:
218: byteleft = (unsigned int *)(boot_video_info->v_baseAddr + windowleft); /* Starting place */
219: for (i=0; i < nwords; i++) byteleft[i] = 0; /* Set the row to all black */
220:
221: byteleft = (unsigned int *)(boot_video_info->v_baseAddr + windowleft + (boot_video_info->v_rowBytes * 1)); /* Starting place */
222: for (i=0; i < nwords; i++) byteleft[i] = 0; /* Set the row to all black */
223:
224: byteleft = (unsigned int *)(boot_video_info->v_baseAddr + windowleft +
225: (boot_video_info->v_rowBytes * (boot_video_info->v_height - 2))); /* Starting place */
226: for (i=0; i < nwords; i++) byteleft[i] = 0; /* Set the row to all black */
227:
228: byteleft = (unsigned int *)(boot_video_info->v_baseAddr + windowleft +
229: (boot_video_info->v_rowBytes * (boot_video_info->v_height - 1))); /* Starting place */
230: for (i=0; i < nwords; i++) byteleft[i] = 0; /* Set the row to all black */
231:
232: for (i=0; i < nwords; i++) fillframe[i] = 0xFFFFFFFF; /* Set the row to all white */
233:
234: if(boot_video_info->v_depth == 8) { /* See if 8 bits a pixel */
235: fillframe[0] = 0x0000FFFF; /* Make left border */
236: fillframe[nwords - 1] = 0xFFFF0000; /* Make right border */
237: }
238: else if(boot_video_info->v_depth == 16) { /* See if 16 bits a pixel */
239: fillframe[0] = 0x00000000; /* Make left border */
240: fillframe[nwords - 1] = 0x00000000; /* Make right border */
241: }
242: else {
243: fillframe[0] = 0x00000000; /* Make left border */
244: fillframe[1] = 0x00000000; /* Make left border */
245: fillframe[nwords - 1] = 0x00000000; /* Make right border */
246: fillframe[nwords - 2] = 0x00000000; /* Make right border */
247: }
248:
249: byteleft = (unsigned int *)(boot_video_info->v_baseAddr + windowleft + (boot_video_info->v_rowBytes * 2)); /* Place to start filling */
250:
251: for(i=2; i < (boot_video_info->v_height - 2); i++) { /* Fill the rest */
252: for(j=0; j<nwords; j++) byteleft[j] = fillframe[j]; /* Fill the row */
253: byteleft = (unsigned int *)((unsigned int)byteleft + boot_video_info->v_rowBytes); /* Next row */
254: }
255:
256: for(i=0; i<2; i++) { /* Initialize both (for now) processor areas */
257:
258: GratefulDebWork[i].GDtop = 2 + (GDfontsize / 2) + (i * 18 * GDfontsize);
259: GratefulDebWork[i].GDleft = 2 + startpos + (GDfontsize / 2);
260: GratefulDebWork[i].GDtopleft = boot_video_info->v_baseAddr + startbyte +
261: (GratefulDebWork[i].GDtop * boot_video_info->v_rowBytes);
262: GratefulDebWork[i].GDrowbytes = boot_video_info->v_rowBytes;
263: GratefulDebWork[i].GDrowchar = boot_video_info->v_rowBytes * (GDfontsize + (GDfontsize / 4));
264: GratefulDebWork[i].GDdepth = boot_video_info->v_depth;
265: GratefulDebWork[i].GDcollgn = nrmlgn;
266:
267: // RuptCtrs[(48*i)+47].timed = powermac_info.bus_clock_rate_hz >> 6; /* (Update every 16th of a second (16 fps) */
268: RuptCtrs[(48*i)+47].timed = powermac_info.bus_clock_rate_hz >> 5; /* (Update every 8th of a second (8 fps) */
269: // RuptCtrs[(48*i)+47].timed = powermac_info.bus_clock_rate_hz >> 4; /* (Update every 4th of a second (4 fps) */
270: // RuptCtrs[(48*i)+47].timed = powermac_info.bus_clock_rate_hz >> 3; /* (Update every 2th of a second (2 fps) */
271: // RuptCtrs[(48*i)+47].timed = powermac_info.bus_clock_rate_hz >> 2; /* (Update every 1 second (1 fps) */
272:
273: sync();
274:
275: GratefulDebWork[i].GDready = 1; /* This one's all ready */
276: }
277:
278: }
279:
280:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.