2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
23 * @APPLE_LICENSE_HEADER_END@
26 * This file contains firmware code.
32 #include <mach_vm_debug.h>
33 #include <db_machine_commands.h>
35 #include <kern/thread.h>
36 #include <mach/vm_attributes.h>
37 #include <mach/vm_param.h>
40 #include <kern/misc_protos.h>
41 #include <ppc/misc_protos.h>
42 #include <ppc/proc_reg.h>
45 #include <ppc/pmap_internals.h>
46 #include <ppc/new_screen.h>
47 #include <ppc/Firmware.h>
48 #include <ppc/mappings.h>
49 //#include <pexpert/ppc/powermac.h>
50 #include <pexpert/pexpert.h>
51 #include <ddb/db_output.h>
53 extern Boot_Video boot_video_info
;
55 extern GDWorkArea GratefulDebWork
[];
57 typedef struct RuptCtr
{ /* Counts hardware interrupts */
58 struct GDpos
{ /* Screen position for Grateful Deb display */
59 unsigned short col
; /* Column (-1 means no display) */
60 unsigned short row
; /* Row */
62 unsigned int count
; /* Count of interrupt */
63 unsigned int timed
; /* If set, count updates at timed rate */
64 unsigned int lasttime
; /* Low of timebase when last updated */
67 /* Window layout for Grateful Deb:
73 * 2 System call External
74 * 3 SIGP Floating point
82 RuptCtr RuptCtrs
[96] = {
83 { { 0, 0}, 0, 1 }, /* Total interruptions */
84 { {-1, -1}, 0, 0 }, /* Reset */
85 { {-1, -1}, 0, 0 }, /* Machine check */
86 { { 0, 1}, 0, 1 }, /* DSIs */
87 { { 1, 1}, 0, 1 }, /* ISIs */
88 { { 1, 2}, 0, 1 }, /* Externals */
89 { { 1, 4}, 0, 0 }, /* Alignment */
90 { { 0, 4}, 0, 0 }, /* Program */
91 { { 1, 3}, 0, 0 }, /* Floating point */
92 { { 1, 0}, 0, 1 }, /* Decrementer */
93 { {-1, -1}, 0, 0 }, /* I/O error */
94 { {-1, -1}, 0, 0 }, /* Reserved */
95 { { 0, 2}, 0, 1 }, /* System call */
96 { {-1, -1}, 0, 0 }, /* Trace */
97 { {-1, -1}, 0, 0 }, /* Floating point assist */
98 { {-1, -1}, 0, 0 }, /* Performance monitor */
99 { {-1, -1}, 0, 0 }, /* VMX */
100 { {-1, -1}, 0, 0 }, /* Reserved */
101 { {-1, -1}, 0, 0 }, /* Reserved */
102 { {-1, -1}, 0, 0 }, /* Reserved */
103 { {-1, -1}, 0, 0 }, /* Instruction breakpoint */
104 { {-1, -1}, 0, 0 }, /* System management */
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 }, /* Reserved */
113 { {-1, -1}, 0, 0 }, /* Reserved */
114 { {-1, -1}, 0, 0 }, /* Reserved */
115 { {-1, -1}, 0, 0 }, /* Reserved */
116 { {-1, -1}, 0, 0 }, /* Trace */
117 { { 0, 3}, 0, 0 }, /* SIGP */
118 { {-1, -1}, 0, 0 }, /* Preemption */
119 { {-1, -1}, 0, 0 }, /* Context switch */
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 }, /* Reserved */
127 { {-1, -1}, 0, 0 }, /* Reserved */
128 { {-1, -1}, 0, 0 }, /* Reserved */
129 { {-1, -1}, 0, 0 }, /* Reserved */
130 { {-1, -1}, 0, 0 }, /* Special, update frequency controls */
132 /* Start of second processor counts */
134 { { 0, 0}, 0, 1 }, /* Total interruptions */
135 { {-1, -1}, 0, 0 }, /* Reset */
136 { {-1, -1}, 0, 0 }, /* Machine check */
137 { { 0, 1}, 0, 1 }, /* DSIs */
138 { { 1, 1}, 0, 1 }, /* ISIs */
139 { { 1, 2}, 0, 1 }, /* Externals */
140 { { 1, 4}, 0, 0 }, /* Alignment */
141 { { 0, 4}, 0, 0 }, /* Program */
142 { { 1, 3}, 0, 0 }, /* Floating point */
143 { { 1, 0}, 0, 1 }, /* Decrementer */
144 { {-1, -1}, 0, 0 }, /* I/O error */
145 { {-1, -1}, 0, 0 }, /* Reserved */
146 { { 0, 2}, 0, 1 }, /* System call */
147 { {-1, -1}, 0, 0 }, /* Trace */
148 { {-1, -1}, 0, 0 }, /* Floating point assist */
149 { {-1, -1}, 0, 0 }, /* Performance monitor */
150 { {-1, -1}, 0, 0 }, /* VMX */
151 { {-1, -1}, 0, 0 }, /* Reserved */
152 { {-1, -1}, 0, 0 }, /* Reserved */
153 { {-1, -1}, 0, 0 }, /* Reserved */
154 { {-1, -1}, 0, 0 }, /* Instruction breakpoint */
155 { {-1, -1}, 0, 0 }, /* System management */
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 }, /* Reserved */
164 { {-1, -1}, 0, 0 }, /* Reserved */
165 { {-1, -1}, 0, 0 }, /* Reserved */
166 { {-1, -1}, 0, 0 }, /* Reserved */
167 { {-1, -1}, 0, 0 }, /* Trace */
168 { { 0, 3}, 0, 0 }, /* SIGP */
169 { {-1, -1}, 0, 0 }, /* Preemption */
170 { {-1, -1}, 0, 0 }, /* Context switch */
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 }, /* Reserved */
178 { {-1, -1}, 0, 0 }, /* Reserved */
179 { {-1, -1}, 0, 0 }, /* Reserved */
180 { {-1, -1}, 0, 0 }, /* Reserved */
181 { {-1, -1}, 0, 0 } /* Special, update frequency controls */
184 void GratefulDebInit(bootBumbleC
*boot_video_info
) { /* Initialize the video debugger */
186 unsigned int fillframe
[256];
187 unsigned int startpos
, startbyte
, windowleft
, newwidth
, i
, j
, startword
, oldwidth
, nrmlgn
;
188 unsigned int nwords
, *byteleft
, lstlgn
, pixlgn
, bytelgn
;
190 if(!boot_video_info
) { /* Are we disabling it?
191 GratefulDebWork[0].GDready = 0; /* Disable output */
195 nrmlgn
= (9 * GDfontsize
) * (boot_video_info
->v_depth
/ 8); /* Get the normal column size in bytes */
196 lstlgn
= (((8 * GDfontsize
) + (GDfontsize
>> 1)) * boot_video_info
->v_depth
) / 8; /* Same as normal, but with 1/2 character space */
197 nrmlgn
= (nrmlgn
+ 31) & -32; /* Round to a line */
199 bytelgn
= (nrmlgn
* (GDdispcols
- 1)) + lstlgn
; /* Length in bytes */
200 pixlgn
= bytelgn
/ (boot_video_info
->v_depth
/ 8); /* Number of pixels wide */
202 startbyte
= (boot_video_info
->v_width
* (boot_video_info
->v_depth
/ 8)) - bytelgn
; /* Get the starting byte unaligned */
203 startpos
= boot_video_info
->v_width
- pixlgn
; /* Starting pixel position */
205 startbyte
+= (unsigned int)boot_video_info
->v_baseAddr
& 31; /* Add the extra to cache boundary in frame buffer */
206 startbyte
&= -32; /* Make sure it's on a cache line for speed */
207 startbyte
+= (unsigned int)boot_video_info
->v_baseAddr
& 31; /* Subtract the extra to cache boundary in frame buffer */
209 windowleft
= startbyte
- (((GDfontsize
/ 2) * boot_video_info
->v_depth
) / 8); /* Back up a half character */
210 windowleft
&= -4; /* Make sure it is on a word boundary */
211 newwidth
= windowleft
/ (boot_video_info
->v_depth
/ 8); /* Get the new pixel width of screen */
213 oldwidth
= boot_video_info
->v_width
; /* Save the old width */
214 // boot_video_info->v_width = newwidth; /* Set the new width */
216 nwords
= oldwidth
- newwidth
; /* See how much to fill in pixels */
217 nwords
= nwords
/ (32 / boot_video_info
->v_depth
); /* Get that in bytes */
219 startword
= (newwidth
+ 3) / 4; /* Where does it start? */
222 byteleft
= (unsigned int *)(boot_video_info
->v_baseAddr
+ windowleft
); /* Starting place */
223 for (i
=0; i
< nwords
; i
++) byteleft
[i
] = 0; /* Set the row to all black */
225 byteleft
= (unsigned int *)(boot_video_info
->v_baseAddr
+ windowleft
+ (boot_video_info
->v_rowBytes
* 1)); /* Starting place */
226 for (i
=0; i
< nwords
; i
++) byteleft
[i
] = 0; /* Set the row to all black */
228 byteleft
= (unsigned int *)(boot_video_info
->v_baseAddr
+ windowleft
+
229 (boot_video_info
->v_rowBytes
* (boot_video_info
->v_height
- 2))); /* Starting place */
230 for (i
=0; i
< nwords
; i
++) byteleft
[i
] = 0; /* Set the row to all black */
232 byteleft
= (unsigned int *)(boot_video_info
->v_baseAddr
+ windowleft
+
233 (boot_video_info
->v_rowBytes
* (boot_video_info
->v_height
- 1))); /* Starting place */
234 for (i
=0; i
< nwords
; i
++) byteleft
[i
] = 0; /* Set the row to all black */
236 for (i
=0; i
< nwords
; i
++) fillframe
[i
] = 0xFFFFFFFF; /* Set the row to all white */
238 if(boot_video_info
->v_depth
== 8) { /* See if 8 bits a pixel */
239 fillframe
[0] = 0x0000FFFF; /* Make left border */
240 fillframe
[nwords
- 1] = 0xFFFF0000; /* Make right border */
242 else if(boot_video_info
->v_depth
== 16) { /* See if 16 bits a pixel */
243 fillframe
[0] = 0x00000000; /* Make left border */
244 fillframe
[nwords
- 1] = 0x00000000; /* Make right border */
247 fillframe
[0] = 0x00000000; /* Make left border */
248 fillframe
[1] = 0x00000000; /* Make left border */
249 fillframe
[nwords
- 1] = 0x00000000; /* Make right border */
250 fillframe
[nwords
- 2] = 0x00000000; /* Make right border */
253 byteleft
= (unsigned int *)(boot_video_info
->v_baseAddr
+ windowleft
+ (boot_video_info
->v_rowBytes
* 2)); /* Place to start filling */
255 for(i
=2; i
< (boot_video_info
->v_height
- 2); i
++) { /* Fill the rest */
256 for(j
=0; j
<nwords
; j
++) byteleft
[j
] = fillframe
[j
]; /* Fill the row */
257 byteleft
= (unsigned int *)((unsigned int)byteleft
+ boot_video_info
->v_rowBytes
); /* Next row */
260 for(i
=0; i
<2; i
++) { /* Initialize both (for now) processor areas */
262 GratefulDebWork
[i
].GDtop
= 2 + (GDfontsize
/ 2) + (i
* 18 * GDfontsize
);
263 GratefulDebWork
[i
].GDleft
= 2 + startpos
+ (GDfontsize
/ 2);
264 GratefulDebWork
[i
].GDtopleft
= boot_video_info
->v_baseAddr
+ startbyte
+
265 (GratefulDebWork
[i
].GDtop
* boot_video_info
->v_rowBytes
);
266 GratefulDebWork
[i
].GDrowbytes
= boot_video_info
->v_rowBytes
;
267 GratefulDebWork
[i
].GDrowchar
= boot_video_info
->v_rowBytes
* (GDfontsize
+ (GDfontsize
/ 4));
268 GratefulDebWork
[i
].GDdepth
= boot_video_info
->v_depth
;
269 GratefulDebWork
[i
].GDcollgn
= nrmlgn
;
271 // RuptCtrs[(48*i)+47].timed = gPEClockFrequencyInfo.timebase_frequency_hz >> 4; /* (Update every 16th of a second (16 fps) */
272 RuptCtrs
[(48*i
)+47].timed
= gPEClockFrequencyInfo
.timebase_frequency_hz
>> 3; /* (Update every 8th of a second (8 fps) */
273 // RuptCtrs[(48*i)+47].timed = gPEClockFrequencyInfo.timebase_frequency_hz >> 2; /* (Update every 4th of a second (4 fps) */
274 // RuptCtrs[(48*i)+47].timed = gPEClockFrequencyInfo.timebase_frequency_hz >> 1; /* (Update every 2th of a second (2 fps) */
275 // RuptCtrs[(48*i)+47].timed = gPEClockFrequencyInfo.timebase_frequency_hz >> 0; /* (Update every 1 second (1 fps) */
279 GratefulDebWork
[i
].GDready
= 1; /* This one's all ready */