|
|
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: * @OSF_FREE_COPYRIGHT@
24: */
25: /*
26: * @APPLE_FREE_COPYRIGHT@
27: */
28:
29: /*
30: Firmware.s
31:
32: Handle things that should be treated as an extension of the hardware
33:
34: Lovingly crafted by Bill Angell using traditional methods and only natural or recycled materials.
35: No animal products are used other than rendered otter bile and deep fried pork lard.
36:
37: */
38:
39: #include <cpus.h>
40: #include <ppc/asm.h>
41: #include <ppc/proc_reg.h>
42: #include <ppc/POWERMAC/mp/MPPlugIn.h>
43: #include <ppc/exception.h>
44: #include <mach/machine/vm_param.h>
45: #include <assym.s>
46:
47:
48: /*
49: * Here we generate the table of supported firmware calls
50: */
51:
52:
53:
54: #ifdef __ELF__
55: .section ".data"
56: #else
57: .data
58: #endif
59: .align 5 /* Line up on cache line */
60:
61: .globl EXT(FWtable)
62:
63: #ifdef __ELF__
64: .type EXT(FWtable),@object
65: #endif
66: EXT(FWtable):
67:
68: .globl CutTrace /* Let everyone know 'bout it */
69: .set CutTrace,(.-EXT(FWtable))/4|0x80000000 /* Call number for CutTrace */
70: .long callUnimp /* This was already handled in lowmem_vectors */
71:
72: #include <ppc/FirmwareCalls.h>
73:
74: .set EXT(FirmwareCnt), (.-EXT(FWtable))/4 /* Get the top number */
75:
76: .text
77:
78: #define SIMPLESCC 1
79: #define NOTQUITEASSIMPLE 1
80: /*
81: * This routine handles the firmware call routine. It must be entered with IR and DR off,
82: * interruptions disabled, and in supervisor state.
83: *
84: * When we enter, we expect R0 to have call number, and LR
85: * to point to the return. Also, all registers saved in savearea in R13.
86: * R3 is as passed in by the user. All others must be gotten from the save area
87: */
88:
89: ENTRY(FirmwareCall, TAG_NO_FRAME_USED)
90:
91: rlwinm r1,r0,2,1,29 /* Clear out bit 0 and multiply by 4 */
92: lis r12,HIGH_ADDR(EXT(FWtable)) /* Get the high part of the firmware call table */
93: cmplwi r1,EXT(FirmwareCnt)*4 /* Is it a valid firmware call number */
94: mflr r11 /* Save the return */
95: ori r12,r12,LOW_ADDR(EXT(FWtable)) /* Now the low part */
96: ble+ goodCall /* Yeah, it is... */
97:
98: li r3,T_SYSTEM_CALL /* Tell the vector handler that we know nothing */
99: blr /* Return for errors... */
100:
101: goodCall: mfsprg r10,0 /* Make sure about the per_proc block */
102: lwzx r1,r1,r12 /* Pick up the address of the routine */
103: lwz r4,saver4(r13) /* Pass in caller's R4 */
104: lwz r5,saver5(r13) /* Pass in caller's R5 */
105: rlwinm. r1,r1,0,0,29 /* Make sure the flag bits are clear */
106: stw r11,PP_TEMPWORK1(r10) /* Save our return point */
107:
108: mtlr r1 /* Put it in the LR */
109: beq- callUnimp /* This one was unimplimented... */
110:
111: blrl /* Call the routine... */
112:
113: mfsprg r10,0 /* Make sure about the per_proc again */
114: stw r3,saver3(r13) /* Pass back the return code to caller */
115: lwz r11,PP_TEMPWORK1(r10) /* Get our return point */
116: li r3,T_IN_VAIN /* Tell the vector handler that we took care of it */
117: mtlr r11 /* Set the return */
118: blr /* Bye, dudes... */
119:
120: callUnimp: lwz r11,PP_TEMPWORK1(r10) /* Restore the return address */
121: li r3,T_SYSTEM_CALL /* Tell the vector handler that we know nothing */
122: mtlr r11 /* Restore the LR */
123: blr /* Return for errors... */
124:
125: /*
126: * This routine is used to store using a real address. It stores parmeter1 at parameter2.
127: */
128:
129: ENTRY(StoreReal, TAG_NO_FRAME_USED)
130:
131: lis r0,HIGH_ADDR(StoreRealCall) /* Get the top part of the SC number */
132: ori r0,r0,LOW_ADDR(StoreRealCall) /* and the bottom part */
133: sc /* Do it to it */
134: blr /* Bye bye, Birdie... */
135:
136: ENTRY(StoreRealLL, TAG_NO_FRAME_USED)
137:
138: stw r3,0(r4) /* Store the word */
139: blr /* Leave... */
140:
141: /*
142: * This routine is used to clear a range of physical pages.
143: */
144:
145: ENTRY(ClearReal, TAG_NO_FRAME_USED)
146:
147: lis r0,HIGH_ADDR(ClearRealCall) /* Get the top part of the SC number */
148: ori r0,r0,LOW_ADDR(ClearRealCall) /* and the bottom part */
149: sc /* Do it to it */
150: blr /* Bye bye, Birdie... */
151:
152: ENTRY(ClearRealLL, TAG_NO_FRAME_USED)
153:
154: /*
155: * We take the first parameter as a physical address. The second is the length in bytes.
156: * Being crazy, I'll round the address down, and the length up. We could end up clearing
157: * an extra page at the start and one at the end, but we don't really care. If someone
158: * is stupid enough to give me unaligned addresses and lengths, I am just arrogant enough
159: * to take them at their word and to hell with them.
160: */
161:
162: neg r5,r3 /* Negate the address */
163: addi r4,r4,4095 /* Round length up */
164: rlwinm r5,r5,0,20,31 /* Save extra length */
165: rlwinm r3,r3,0,0,19 /* Round the page on down */
166: add r4,r4,r5 /* Add up all extra lengths */
167: li r6,32 /* Get a displacement */
168: rlwinm r4,r4,0,0,19 /* Round the length back down */
169:
170: clrloop: subi r4,r4,32 /* Back off a cache line */
171: dcbz 0,r3 /* Do the even line */
172: sub. r4,r4,r6 /* Back off a second time (we only do this to generate a CR */
173: dcbz r6,r3 /* Clear the even line */
174: addi r3,r3,64 /* Move up to every other line */
175: bgt+ clrloop /* Go until we've done it all... */
176:
177: blr /* Leave... */
178: /*
179: * This routine will read in 32 byte of real storage.
180: */
181:
182: ENTRY(ReadReal, TAG_NO_FRAME_USED)
183:
184: mfmsr r0 /* Get the MSR */
185: rlwinm r5,r0,0,28,26 /* Clear DR bit */
186: rlwinm r5,r5,0,17,15 /* Clear EE bit */
187: mtmsr r5 /* Disable EE and DR */
188: isync /* Just make sure about it */
189:
190: lwz r5,0(r3) /* Get word 0 */
191: lwz r6,4(r3) /* Get word 1 */
192: lwz r7,8(r3) /* Get word 2 */
193: lwz r8,12(r3) /* Get word 3 */
194: lwz r9,16(r3) /* Get word 4 */
195: lwz r10,20(r3) /* Get word 5 */
196: lwz r11,24(r3) /* Get word 6 */
197: lwz r12,28(r3) /* Get word 7 */
198:
199: mtmsr r0 /* Restore original machine state */
200: isync /* Insure goodness */
201:
202: stw r5,0(r4) /* Set word 0 */
203: stw r6,4(r4) /* Set word 1 */
204: stw r7,8(r4) /* Set word 2 */
205: stw r8,12(r4) /* Set word 3 */
206: stw r9,16(r4) /* Set word 4 */
207: stw r10,20(r4) /* Set word 5 */
208: stw r11,24(r4) /* Set word 6 */
209: stw r12,28(r4) /* Set word 7 */
210:
211: blr
212:
213:
214: /*
215: * This routine is used to load all 4 DBATs.
216: */
217:
218: ENTRY(LoadDBATs, TAG_NO_FRAME_USED)
219:
220: lis r0,HIGH_ADDR(LoadDBATsCall) /* Top half of LoadDBATsCall firmware call number */
221: ori r0,r0,LOW_ADDR(LoadDBATsCall) /* Bottom half */
222: sc /* Do it to it */
223:
224: blr /* Bye bye, Birdie... */
225:
226: ENTRY(xLoadDBATsLL, TAG_NO_FRAME_USED)
227:
228: lwz r4,0(r3) /* Get DBAT 0 high */
229: lwz r5,4(r3) /* Get DBAT 0 low */
230: lwz r6,8(r3) /* Get DBAT 1 high */
231: lwz r7,12(r3) /* Get DBAT 1 low */
232: lwz r8,16(r3) /* Get DBAT 2 high */
233: lwz r9,20(r3) /* Get DBAT 2 low */
234: lwz r10,24(r3) /* Get DBAT 3 high */
235: lwz r11,28(r3) /* Get DBAT 3 low */
236:
237: sync /* Common decency and the state law require you to wash your hands */
238: mtdbatu 0,r4 /* Load DBAT 0 high */
239: mtdbatl 0,r5 /* Load DBAT 0 low */
240: mtdbatu 1,r6 /* Load DBAT 1 high */
241: mtdbatl 1,r7 /* Load DBAT 1 low */
242: mtdbatu 2,r8 /* Load DBAT 2 high */
243: mtdbatl 2,r9 /* Load DBAT 2 low */
244: mtdbatu 3,r10 /* Load DBAT 3 high */
245: mtdbatl 3,r11 /* Load DBAT 3 low */
246: sync /* Make sure it's done */
247: isync /* Toss out anything new */
248:
249: blr /* Leave... */
250:
251: /*
252: * This routine is used to load all 4 IBATs.
253: */
254:
255: ENTRY(LoadIBATs, TAG_NO_FRAME_USED)
256:
257: lis r0,HIGH_ADDR(LoadIBATsCall) /* Top half of CreateFakeIO firmware call number */
258: ori r0,r0,LOW_ADDR(LoadIBATsCall) /* Bottom half */
259: sc /* Do it to it */
260: blr /* Bye bye, Birdie... */
261:
262: ENTRY(xLoadIBATsLL, TAG_NO_FRAME_USED)
263:
264: lwz r4,0(r3) /* Get IBAT 0 high */
265: lwz r5,4(r3) /* Get IBAT 0 low */
266: lwz r6,8(r3) /* Get IBAT 1 high */
267: lwz r7,12(r3) /* Get IBAT 1 low */
268: lwz r8,16(r3) /* Get IBAT 2 high */
269: lwz r9,20(r3) /* Get IBAT 2 low */
270: lwz r10,24(r3) /* Get IBAT 3 high */
271: lwz r11,28(r3) /* Get IBAT 3 low */
272:
273: sync /* Common decency and the state law require you to wash your hands */
274: mtibatu 0,r4 /* Load IBAT 0 high */
275: mtibatl 0,r5 /* Load IBAT 0 low */
276: mtibatu 1,r6 /* Load IBAT 1 high */
277: mtibatl 1,r7 /* Load IBAT 1 low */
278: mtibatu 2,r8 /* Load IBAT 2 high */
279: mtibatl 2,r9 /* Load IBAT 2 low */
280: mtibatu 3,r10 /* Load IBAT 3 high */
281: mtibatl 3,r11 /* Load IBAT 3 low */
282: sync /* Make sure it's done */
283: isync /* Toss out anything new */
284:
285: blr /* Leave... */
286:
287:
288: /*
289: * This is the glue to call the CutTrace firmware call
290: */
291:
292: ENTRY(dbgTrace, TAG_NO_FRAME_USED)
293:
294: lis r0,HIGH_ADDR(CutTrace) /* Top half of CreateFakeIO firmware call number */
295: ori r0,r0,LOW_ADDR(CutTrace) /* Bottom half */
296: sc /* Do it to it */
297: blr /* Bye bye, Birdie... */
298:
299:
300:
301: /*
302: * This is the glue to create a fake I/O interruption
303: */
304:
305: ENTRY(CreateFakeIO, TAG_NO_FRAME_USED)
306:
307: lis r0,HIGH_ADDR(CreateFakeIOCall) /* Top half of CreateFakeIO firmware call number */
308: ori r0,r0,LOW_ADDR(CreateFakeIOCall) /* Bottom half */
309: sc /* Do it to it */
310: blr /* Bye bye, Birdie... */
311:
312: /*
313: * Used to initialize the SCC for debugging output
314: */
315:
316:
317: ENTRY(fwSCCinit, TAG_NO_FRAME_USED)
318:
319: mfmsr r8 /* Save the MSR */
320: mr. r3,r3 /* See if printer or modem */
321: rlwinm r12,r8,0,28,25 /* Turn off translation */
322: lis r10,0xF301 /* Set the top part */
323: rlwinm r12,r12,0,17,15 /* Turn off interruptions */
324: #if 0
325: mtmsr r12 /* Smash the MSR */
326: isync /* Make it clean */
327: #endif
328:
329: ori r10,r10,0x2000 /* Assume the printer (this is the normal one) */
330: beq+ fwSCCprnt /* It sure are... */
331: ori r10,r10,0x0002 /* Move it over to the modem port */
332:
333: fwSCCprnt: dcbf 0,r10 /* Insure it is out */
334: sync
335: eieio
336: dcbi 0,r10 /* Toss it */
337: sync
338:
339:
340: li r7,0x09 /* Set the register */
341: stb r7,0(r10) /* Set the register */
342: dcbf 0,r10 /* Force it out */
343: sync /* Make sure it's out there */
344: dcbi 0,r10
345: eieio
346:
347: li r7,0x80 /* Reset channel A */
348: stb r7,0(r10) /* Set the register */
349: dcbf 0,r10 /* Force it out */
350: sync /* Make sure it's out there */
351: dcbi 0,r10
352: eieio
353:
354: li r7,0x04 /* Set the register */
355: stb r7,0(r10) /* Set the register */
356: dcbf 0,r10 /* Force it out */
357: sync /* Make sure it's out there */
358: dcbi 0,r10
359: eieio
360:
361: li r7,0x44 /* x16 clock, 1 stop bit */
362: stb r7,0(r10) /* Set the register */
363: dcbf 0,r10 /* Force it out */
364: sync /* Make sure it's out there */
365: dcbi 0,r10
366: eieio
367:
368: li r7,0x03 /* Set the register */
369: stb r7,0(r10) /* Set the register */
370: dcbf 0,r10 /* Force it out */
371: sync /* Make sure it's out there */
372: dcbi 0,r10
373: eieio
374:
375: li r7,0xC0 /* 8 bits per char */
376: stb r7,0(r10) /* Set the register */
377: dcbf 0,r10 /* Force it out */
378: sync /* Make sure it's out there */
379: dcbi 0,r10
380: eieio
381:
382: li r7,0x05 /* Set the register */
383: stb r7,0(r10) /* Set the register */
384: dcbf 0,r10 /* Force it out */
385: sync /* Make sure it's out there */
386: dcbi 0,r10
387: eieio
388:
389: li r7,0xE2 /* DTR mode, 8bit/char */
390: stb r7,0(r10) /* Set the register */
391: dcbf 0,r10 /* Force it out */
392: sync /* Make sure it's out there */
393: dcbi 0,r10
394: eieio
395:
396: li r7,0x02 /* Set the register */
397: stb r7,0(r10) /* Set the register */
398: dcbf 0,r10 /* Force it out */
399: sync /* Make sure it's out there */
400: dcbi 0,r10
401: eieio
402:
403: li r7,0x00 /* Vector 0 */
404: stb r7,0(r10) /* Set the register */
405: dcbf 0,r10 /* Force it out */
406: sync /* Make sure it's out there */
407: dcbi 0,r10
408: eieio
409:
410: li r7,0x0A /* Set the register */
411: stb r7,0(r10) /* Set the register */
412: dcbf 0,r10 /* Force it out */
413: sync /* Make sure it's out there */
414: dcbi 0,r10
415: eieio
416:
417: li r7,0x00 /* Clear misc controls */
418: stb r7,0(r10) /* Set the register */
419: dcbf 0,r10 /* Force it out */
420: sync /* Make sure it's out there */
421: dcbi 0,r10
422: eieio
423:
424: li r7,0x0B /* Set the register */
425: stb r7,0(r10) /* Set the register */
426: dcbf 0,r10 /* Force it out */
427: sync /* Make sure it's out there */
428: dcbi 0,r10
429: eieio
430:
431: li r7,0x50 /* B/R gen T/R */
432: stb r7,0(r10) /* Set the register */
433: dcbf 0,r10 /* Force it out */
434: sync /* Make sure it's out there */
435: dcbi 0,r10
436: eieio
437:
438: li r7,0x0C /* Set the register */
439: stb r7,0(r10) /* Set the register */
440: dcbf 0,r10 /* Force it out */
441: sync /* Make sure it's out there */
442: dcbi 0,r10
443: eieio
444:
445: li r7,0x0A /* 9600 baud low */
446: stb r7,0(r10) /* Set the register */
447: dcbf 0,r10 /* Force it out */
448: sync /* Make sure it's out there */
449: dcbi 0,r10
450: eieio
451:
452: li r7,0x0D /* Set the register */
453: stb r7,0(r10) /* Set the register */
454: dcbf 0,r10 /* Force it out */
455: sync /* Make sure it's out there */
456: dcbi 0,r10
457: eieio
458:
459: li r7,0x00 /* 9600 baud high */
460: stb r7,0(r10) /* Set the register */
461: dcbf 0,r10 /* Force it out */
462: sync /* Make sure it's out there */
463: dcbi 0,r10
464: eieio
465:
466: li r7,0x03 /* Set the register */
467: stb r7,0(r10) /* Set the register */
468: dcbf 0,r10 /* Force it out */
469: sync /* Make sure it's out there */
470: dcbi 0,r10
471: eieio
472:
473: li r7,0xC1 /* 8 bits/char, Rx enable */
474: stb r7,0(r10) /* Set the register */
475: dcbf 0,r10 /* Force it out */
476: sync /* Make sure it's out there */
477: dcbi 0,r10
478: eieio
479:
480: li r7,0x05 /* Set the register */
481: stb r7,0(r10) /* Set the register */
482: dcbf 0,r10 /* Force it out */
483: sync /* Make sure it's out there */
484: dcbi 0,r10
485: eieio
486:
487: li r7,0xEA /* 8 bits/char, Tx enable */
488: stb r7,0(r10) /* Set the register */
489: dcbf 0,r10 /* Force it out */
490: sync /* Make sure it's out there */
491: dcbi 0,r10
492: eieio
493:
494: li r7,0x0E /* Set the register */
495: stb r7,0(r10) /* Set the register */
496: dcbf 0,r10 /* Force it out */
497: sync /* Make sure it's out there */
498: dcbi 0,r10
499: eieio
500:
501: li r7,0x01 /* BR rate gen enable */
502: stb r7,0(r10) /* Set the register */
503: dcbf 0,r10 /* Force it out */
504: sync /* Make sure it's out there */
505: dcbi 0,r10
506: eieio
507:
508: li r7,0x0F /* Set the register */
509: stb r7,0(r10) /* Set the register */
510: dcbf 0,r10 /* Force it out */
511: sync /* Make sure it's out there */
512: dcbi 0,r10
513: eieio
514:
515: li r7,0x00 /* ints off */
516: stb r7,0(r10) /* Set the register */
517: dcbf 0,r10 /* Force it out */
518: sync /* Make sure it's out there */
519: dcbi 0,r10
520: eieio
521:
522: li r7,0x10 /* Reset ext/stat ints */
523: stb r7,0(r10) /* Set the register */
524: dcbf 0,r10 /* Force it out */
525: sync /* Make sure it's out there */
526: dcbi 0,r10
527: eieio
528:
529: li r7,0x10 /* Reset ext/stat ints */
530: stb r7,0(r10) /* Set the register */
531: dcbf 0,r10 /* Force it out */
532: sync /* Make sure it's out there */
533: dcbi 0,r10
534: eieio
535:
536: li r7,0x01 /* Set the register */
537: stb r7,0(r10) /* Set the register */
538: dcbf 0,r10 /* Force it out */
539: sync /* Make sure it's out there */
540: dcbi 0,r10
541: eieio
542:
543: li r7,0x10 /* int on Rx, no Tx int enable */
544: stb r7,0(r10) /* Set the register */
545: dcbf 0,r10 /* Force it out */
546: sync /* Make sure it's out there */
547: dcbi 0,r10
548: eieio
549:
550: li r7,0x09 /* Set the register */
551: stb r7,0(r10) /* Set the register */
552: dcbf 0,r10 /* Force it out */
553: sync /* Make sure it's out there */
554: dcbi 0,r10
555: eieio
556:
557: li r7,0x0A /* int on Rx, Tx int enable */
558: stb r7,0(r10) /* Set the register */
559: dcbf 0,r10 /* Force it out */
560: sync /* Master enable, no vector */
561: dcbi 0,r10
562: eieio
563:
564: li r7,0x09 /* Set the register */
565: stb r7,0(r10) /* Set the register */
566: dcbf 0,r10 /* Force it out */
567: sync /* Make sure it's out there */
568: dcbi 0,r10
569: eieio
570:
571: li r7,0x02 /* No vector */
572: stb r7,0(r10) /* Set the register */
573: dcbf 0,r10 /* Force it out */
574: sync /* Master enable, no vector */
575: dcbi 0,r10
576: eieio
577:
578: lbz r7,0(r10) /* Clear interrupts */
579: sync /* Master enable, no vector */
580: dcbi 0,r10
581: eieio
582:
583: wSCCrdy: eieio /* Barricade it */
584: lbz r7,0(r10) /* Get current status */
585: dcbi 0,r10
586: sync
587: andi. r7,r7,0x04 /* Is transmitter empty? */
588: beq wSCCrdy /* Nope... */
589:
590: eieio
591:
592: #if 0
593: mtmsr r8 /* Restore 'rupts and TR */
594: isync
595: #endif
596: blr /* Leave... */
597:
598: /*
599: * This routine is used to write debug output to either the modem or printer port.
600: * parm 1 is printer (0) or modem (1); parm 2 is ID (printed directly); parm 3 converted to hex
601: */
602:
603: ENTRY(dbgDisp, TAG_NO_FRAME_USED)
604:
605: mr r12,r0 /* Keep R0 pristene */
606: lis r0,HIGH_ADDR(dbgDispCall) /* Top half of dbgDispCall firmware call number */
607: ori r0,r0,LOW_ADDR(dbgDispCall) /* Bottom half */
608:
609: sc /* Go display the stuff */
610:
611: mr r0,r12 /* Restore R0 */
612: blr /* Return... */
613:
614: /* Here's the low-level part of dbgDisp */
615:
616: ENTRY(dbgDispLL, TAG_NO_FRAME_USED)
617:
618: dbgDispInt: mfmsr r8 /* Save the MSR */
619:
620: #if 0
621: lis r10,0xF301 /* (TEST/DEBUG) */
622: ori r10,r10,0x2002 /* (TEST/DEBUG) */
623: dcbf 0,r10 /* (TEST/DEBUG) */
624: sync /* (TEST/DEBUG) */
625: dcbi 0,r10 /* (TEST/DEBUG) */
626: eieio /* (TEST/DEBUG) */
627: li r7,0x35 /* (TEST/DEBUG) */
628: stb r7,4(r10) /* (TEST/DEBUG) */
629:
630: lis r7,10 /* (TEST/DEBUG) */
631: spw6: addi r7,r7,-1 /* (TEST/DEBUG) */
632: mr. r7,r7 /* (TEST/DEBUG) */
633: bne- spw6 /* (TEST/DEBUG) */
634: dcbf 0,r10 /* (TEST/DEBUG) */
635: sync /* (TEST/DEBUG) */
636: dcbi 0,r10 /* (TEST/DEBUG) */
637: eieio /* (TEST/DEBUG) */
638: #endif
639:
640: rlwinm r12,r8,0,28,25 /* Turn off translation */
641: rlwinm r12,r12,0,17,15 /* Turn off interruptions */
642:
643: mflr r11 /* Save the link register */
644:
645: #if 0
646: mr r7,r12 /* (TEST/DEBUG) */
647: bl dumpr7 /* (TEST/DEBUG) */
648: #endif
649:
650: mr. r3,r3 /* See if printer or modem */
651: lis r10,0xF301 /* Set the top part */
652: mr r3,r4 /* Copy the ID parameter */
653:
654: #if 0
655: mr r9,r12 /* (TEST/DEBUG) */
656:
657: mtmsr r12 /* (TEST/DEBUG) */
658: isync /* (TEST/DEBUG) */
659:
660: #if 0
661: mtmsr r8 /* (TEST/DEBUG) */
662: isync /* (TEST/DEBUG) */
663: #endif
664:
665: lis r12,0xF301 /* (TEST/DEBUG) */
666: ori r12,r12,0x2002 /* (TEST/DEBUG) */
667: #if 1
668: dcbf 0,r12 /* (TEST/DEBUG) */
669: sync /* (TEST/DEBUG) */
670: dcbi 0,r12 /* (TEST/DEBUG) */
671: #endif
672:
673: xqrw1: eieio /* (TEST/DEBUG) */
674: lbz r7,0(r12) /* (TEST/DEBUG) */
675: dcbi 0,r12 /* (TEST/DEBUG) */
676: sync /* (TEST/DEBUG) */
677: andi. r7,r7,0x04 /* (TEST/DEBUG) */
678: beq xqrw1 /* (TEST/DEBUG) */
679:
680: eieio /* (TEST/DEBUG) */
681: li r7,0x36 /* (TEST/DEBUG) */
682: stb r7,4(r12) /* (TEST/DEBUG) */
683: eieio
684: dcbf 0,r12 /* (TEST/DEBUG) */
685: sync /* (TEST/DEBUG) */
686: dcbi 0,r12 /* (TEST/DEBUG) */
687: eieio /* (TEST/DEBUG) */
688:
689:
690: lis r7,10 /* (TEST/DEBUG) */
691: spw7: addi r7,r7,-1 /* (TEST/DEBUG) */
692: mr. r7,r7 /* (TEST/DEBUG) */
693: bne- spw7 /* (TEST/DEBUG) */
694: dcbf 0,r12 /* (TEST/DEBUG) */
695: sync /* (TEST/DEBUG) */
696: dcbi 0,r12 /* (TEST/DEBUG) */
697: eieio /* (TEST/DEBUG) */
698: mr r12,r9 /* (TEST/DEBUG) */
699: #endif
700:
701: mtmsr r12 /* Smash the MSR */
702: isync /* Make it clean */
703:
704:
705: #if SIMPLESCC && !NOTQUITEASSIMPLE
706: ori r10,r10,0x3010 /* Assume the printer (this is the normal one) */
707: #else
708: ori r10,r10,0x2000 /* Assume the printer (this is the normal one) */
709: #endif
710: beq+ dbgDprintr /* It sure are... */
711: #if SIMPLESCC && !NOTQUITEASSIMPLE
712: ori r10,r10,0x0020 /* Move it over to the modem port */
713: #else
714: ori r10,r10,0x0002 /* Move it over to the modem port */
715:
716: #if !NOTQUITEASSIMPLE
717: lis r7,0xF300 /* Address of SCC rounded to 128k */
718: ori r7,r7,0x0032 /* Make it cache inhibited */
719: mtdbatl 3,r7 /* Load DBAT 3 low */
720: lis r7,0xF300 /* Address of SCC rounded to 128k */
721: ori r7,r7,0x0002 /* Make it supervisor only */
722: mtdbatu 3,r7 /* Load DBAT 3 high */
723: ori r12,r12,0x0010 /* Turn on DR */
724: mtmsr r12 /* Smash the MSR */
725: isync /* Make it clean */
726:
727: #endif
728: #endif
729:
730: dbgDprintr: sync
731: #if 0
732: mr r7,r10 /* (TEST/DEBUG) */
733: bl dumpr7 /* (TEST/DEBUG) */
734: #endif
735:
736: dcbi 0,r10 /* Toss it */
737: eieio
738:
739: #if 0
740: lis r12,0xF301 /* (TEST/DEBUG) */
741: ori r12,r12,0x2002 /* (TEST/DEBUG) */
742: dcbf 0,r12 /* (TEST/DEBUG) */
743: sync /* (TEST/DEBUG) */
744: dcbi 0,r12 /* (TEST/DEBUG) */
745: eieio /* (TEST/DEBUG) */
746: li r7,0x37 /* (TEST/DEBUG) */
747: stb r7,4(r12) /* (TEST/DEBUG) */
748:
749: lis r7,12 /* (TEST/DEBUG) */
750: spw8: addi r7,r7,-1 /* (TEST/DEBUG) */
751: mr. r7,r7 /* (TEST/DEBUG) */
752: bne- spw8 /* (TEST/DEBUG) */
753: dcbf 0,r12 /* (TEST/DEBUG) */
754: sync /* (TEST/DEBUG) */
755: dcbi 0,r12 /* (TEST/DEBUG) */
756: eieio /* (TEST/DEBUG) */
757: #endif
758:
759:
760: /* Print the ID parameter */
761:
762: lis r12,HIGH_ADDR(fwdisplock) /* Get the display locker outer */
763: ori r12,r12,LOW_ADDR(fwdisplock) /* Last part */
764:
765: lwarx r7,0,r12 ; ?
766:
767: ddwait0: lwarx r7,0,r12 /* Get the lock */
768: mr. r7,r7 /* Is it locked? */
769: bne- ddwait0 /* Yup... */
770: stwcx. r12,0,r12 /* Try to get it */
771: bne- ddwait0 /* Nope, start all over... */
772:
773: #if 0
774: dcbf 0,r10 /* (TEST/DEBUG) */
775: sync /* (TEST/DEBUG) */
776: dcbi 0,r10 /* (TEST/DEBUG) */
777: eieio /* (TEST/DEBUG) */
778: li r7,0x38 /* (TEST/DEBUG) */
779: stb r7,6(r10) /* (TEST/DEBUG) */
780:
781: lis r7,10 /* (TEST/DEBUG) */
782: spwa: addi r7,r7,-1 /* (TEST/DEBUG) */
783: mr. r7,r7 /* (TEST/DEBUG) */
784: bne- spwa /* (TEST/DEBUG) */
785: dcbf 0,r10 /* (TEST/DEBUG) */
786: sync /* (TEST/DEBUG) */
787: dcbi 0,r10 /* (TEST/DEBUG) */
788: eieio /* (TEST/DEBUG) */
789: #endif
790:
791: rlwinm r3,r3,8,0,31 /* Get the first character */
792: bl dbgDchar /* Print it */
793: rlwinm r3,r3,8,0,31 /* Get the second character */
794: bl dbgDchar /* Print it */
795: rlwinm r3,r3,8,0,31 /* Get the third character */
796: bl dbgDchar /* Print it */
797: rlwinm r3,r3,8,0,31 /* Get the fourth character */
798: bl dbgDchar /* Print it */
799:
800: li r3,0x20 /* Get a space for a separator */
801: bl dbgDchar /* Print it */
802: bl dbg4byte /* Print register 5 in hex */
803:
804: li r3,0x0A /* Linefeed */
805: bl dbgDchar /* Send it */
806: li r3,0x0D /* Carriage return */
807: bl dbgDchar /* Send it */
808:
809: mtlr r11 /* Get back the return */
810: #if !SIMPLESCC && !NOTQUITEASSIMPLE
811: li r7,0 /* Get a zero */
812: mtdbatu 3,r7 /* Invalidate DBAT 3 upper */
813: mtdbatl 3,r7 /* Invalidate DBAT 3 lower */
814: #endif
815: lis r12,HIGH_ADDR(fwdisplock) /* Get the display locker outer */
816: li r7,0 /* Get a zero */
817: ori r12,r12,LOW_ADDR(fwdisplock) /* Last part */
818: dcbi 0,r10 /* ? */
819: stw r7,0(r12) /* Release the display lock */
820: mtmsr r8 /* Restore the MSR */
821: isync /* Wait for it */
822: blr /* Leave... */
823:
824:
825: dbg4byte: mflr r12 /* Save the return */
826:
827: lis r4,HIGH_ADDR(hexTab) /* Point to the top of table */
828: li r6,8 /* Set number of hex digits to dump */
829: ori r4,r4,LOW_ADDR(hexTab) /* Point to the bottom of table */
830:
831: dbgDnext: rlwinm r5,r5,4,0,31 /* Rotate a nybble */
832: subi r6,r6,1 /* Back down the count */
833: rlwinm r3,r5,0,28,31 /* Isolate the last nybble */
834: lbzx r3,r4,r3 /* Convert to ascii */
835: bl dbgDchar /* Print it */
836: mr. r6,r6 /* Any more? */
837: bne+ dbgDnext /* Convert 'em all... */
838:
839: li r3,0x20 /* Space */
840: bl dbgDchar /* Send it */
841: mtlr r12 /* Restore LR */
842: blr /* Return... */
843:
844: /* Write to whichever serial port. Try to leave it clean, but not too hard (this is a hack) */
845:
846: dbgDchar:
847: #if SIMPLESCC && !NOTQUITEASSIMPLE
848: stb r3,0(r10) /* ? */
849: dcbf 0,r10 /* Force it out */
850: sync /* Make sure it's out there */
851:
852: lis r7,3 /* Get enough for about 1ms */
853:
854: dbgDchar0: addi r7,r7,-1 /* Count down */
855: mr. r7,r7 /* Waited long enough? */
856: bgt+ dbgDchar0 /* Nope... */
857: #endif
858: #if NOTQUITEASSIMPLE
859: #if 0
860: li r7,0x01 /* ? */
861: stb r7,0(r10) /* ? */
862: dcbf 0,r10 /* Force it out */
863: sync /* Make sure it's out there */
864: dcbi 0,r10
865: eieio
866:
867: lbz r7,0(r10) /* ? */
868: dcbi 0,r10 /* Force it out */
869: sync /* kill it off */
870: eieio
871:
872: li r7,0x00 /* ? */
873: stb r7,0(r10) /* ? */
874: dcbf 0,r10 /* Force it out */
875: sync /* Make sure it's out there */
876: dcbi 0,r10
877: eieio
878:
879: lbz r7,0(r10) /* ? */
880: dcbi 0,r10 /* Force it out */
881: sync /* kill it off */
882: eieio
883: #endif
884:
885: qrw1: eieio /* Barricade it */
886: lbz r7,0(r10) /* ? */
887: dcbi 0,r10
888: sync
889: andi. r7,r7,0x04 /* ? */
890: beq qrw1 /* Nope... */
891:
892: eieio
893:
894: stb r3,4(r10) /* ? */
895: dcbf 0,r10 /* Force it out */
896: sync /* Make sure it's out there */
897: dcbi 0,r10
898: eieio
899:
900: qrw2: eieio /* Barricade it */
901: lbz r7,0(r10) /* ? */
902: dcbi 0,r10
903: sync
904: andi. r7,r7,0x04 /* ? */
905: beq qrw2 /* Nope... */
906:
907: #if 0
908: eieio
909: li r7,0x10 /* ? */
910: stb r7,0(r10) /* ? */
911: dcbf 0,r10 /* Force it out */
912: sync /* Make sure it's out there */
913: dcbi 0,r10
914: eieio
915:
916: lbz r7,0(r10) /* ? */
917: dcbi 0,r10 /* Force it out */
918: sync /* kill it off */
919: eieio
920: #endif
921:
922: lis r7,0x0080 /* ? */
923: lis r9,0xF300 /* ? */
924: ori r7,r7,0x010F /* ? */
925: stw r7,0x28(r9) /* ? */
926: dcbf 0,r10 /* Force it out */
927: sync /* Make sure it's out there */
928: dcbi 0,r10
929: eieio
930:
931: #endif
932: #if !SIMPLESCC && !NOTQUITEASSIMPLE
933: rlwinm r9,r10,0,0,29 /* Get channel a */
934: eieio /* Barricade it */
935:
936: li r7,0x03 /* ? */
937: stb r7,0(r9) /* ? */
938: eieio /* Barricade it */
939:
940: lbz r7,0(r9) /* ? */
941:
942: eieio /* Barricade it */
943: lbz r7,0(r9) /* ? */
944:
945: dchrw1: eieio /* Barricade it */
946: lbz r7,0(r10) /* ? */
947: andi. r7,r7,0x04 /* ? */
948: beq dchrw1 /* Nope... */
949:
950: stb r3,4(r10) /* ? */
951: sync /* Make sure it's there */
952: eieio /* Don't get confused */
953:
954: dchrw2: eieio /* Barricade it */
955: lbz r7,0(r10) /* ? */
956: andi. r7,r7,0x04 /* ? */
957: beq dchrw2 /* Nope... */
958:
959: eieio /* Avoid confusion */
960: lbz r7,0(r10) /* ? */
961: andi. r7,r7,0x40 /* ? */
962: beq+ nounder /* Nope... */
963:
964: eieio /* Avoid confusion */
965: li r7,0xC0 /* ? */
966: stb r7,0(r10) /* ? */
967:
968: nounder: eieio /* Avoid confusion */
969: li r7,0x10 /* ? */
970: stb r7,0(r10) /* ? */
971:
972: eieio /* Avoid confusion */
973: li r7,0x38 /* ? */
974: stb r7,0(r9) /* ? */
975:
976: eieio /* Avoid confusion */
977: li r7,0x30 /* ? */
978: stb r7,0(r10) /* ? */
979:
980: eieio /* Avoid confusion */
981: li r7,0x20 /* ? */
982: stb r7,0(r10) /* ? */
983: eieio /* Avoid confusion */
984: sync
985:
986: #endif
987: blr /* Return */
988:
989: .globl hexTab
990:
991: #ifdef __ELF__
992: .type hexTab,@object
993: #endif
994:
995: hexTab: STRINGD "0123456789ABCDEF" /* Convert hex numbers to printable hex */
996:
997:
998: /*
999: * Dumps all the registers in the savearea in R13
1000: */
1001:
1002:
1003: ENTRY(dbgRegsLL, TAG_NO_FRAME_USED)
1004:
1005: li r3,0 /* ? */
1006: bl dbgRegsCm /* Join on up... */
1007:
1008: /*
1009: * Note that we bypass the normal return 'cause we don't wanna mess up R3
1010: */
1011: mfsprg r11,0 /* Get the per_proc */
1012: lwz r11,PP_TEMPWORK1(r11) /* Get our return point */
1013: li r3,T_IN_VAIN /* Tell the vector handler that we took care of it */
1014: mtlr r11 /* Set the return */
1015: blr /* Bye, dudes... */
1016:
1017: ENTRY(dbgRegs, TAG_NO_FRAME_USED)
1018:
1019: dbgRegsCm: mfmsr r8 /* Save the MSR */
1020: mr. r3,r3 /* ? */
1021: rlwinm r12,r8,0,28,25 /* Turn off translation */
1022: lis r10,0xF301 /* Set the top part */
1023: rlwinm r12,r12,0,17,15 /* Turn off interruptions */
1024: mtmsr r12 /* Smash the MSR */
1025: isync /* Make it clean */
1026: #if SIMPLESCC && !NOTQUITEASSIMPLE
1027: ori r10,r10,0x3010 /* ? */
1028: #else
1029: ori r10,r10,0x2000 /* ? */
1030: #endif
1031: mflr r11 /* Save the link register */
1032: beq+ dbgDprints /* It sure are... */
1033: #if SIMPLESCC && !NOTQUITEASSIMPLE
1034: ori r10,r10,0x0020 /* ? */
1035: #else
1036: ori r10,r10,0x0002 /* ? */
1037:
1038: dcbf 0,r10 /* Insure it is out */
1039: sync
1040: dcbi 0,r10 /* Toss it */
1041: #if !NOTQUITEASSIMPLE
1042: lis r7,0xF300 /* ? */
1043: ori r7,r7,0x0032 /* ? */
1044: mtdbatl 3,r7 /* ? */
1045: lis r7,0xF300 /* ? */
1046: ori r7,r7,0x0002 /* ? */
1047: mtdbatu 3,r7 /* ? */
1048: ori r12,r12,0x0010 /* ? */
1049: mtmsr r12 /* ? */
1050: isync /* ? */
1051: #endif
1052: #endif
1053:
1054: dbgDprints:
1055: lis r3,HIGH_ADDR(fwdisplock) /* Get the display locker outer */
1056: ori r3,r3,LOW_ADDR(fwdisplock) /* Last part */
1057:
1058: lwarx r5,0,r3 ; ?
1059: ddwait1: lwarx r5,0,r3 /* Get the lock */
1060: mr. r5,r5 /* Is it locked? */
1061: bne- ddwait1 /* Yup... */
1062: stwcx. r3,0,r3 /* Try to get it */
1063: bne- ddwait1 /* Nope, start all over... */
1064:
1065: li r3,0x52 /* Print eyecatcher */
1066: bl dbgDchar /* Send it */
1067: li r3,0x65 /* Print eyecatcher */
1068: bl dbgDchar /* Send it */
1069: li r3,0x67 /* Print eyecatcher */
1070: bl dbgDchar /* Send it */
1071: li r3,0x73 /* Print eyecatcher */
1072: bl dbgDchar /* Send it */
1073: li r3,0x20 /* Print eyecatcher */
1074: bl dbgDchar /* Send it */
1075:
1076: lwz r5,saver0(r13) /* Do register */
1077: bl dbg4byte /* Print */
1078: lwz r5,saver1(r13) /* Do register */
1079: bl dbg4byte /* Print */
1080: lwz r5,saver2(r13) /* Do register */
1081: bl dbg4byte /* Print */
1082: lwz r5,saver3(r13) /* Do register */
1083: bl dbg4byte /* Print */
1084: li r3,0x0A /* Linefeed */
1085: bl dbgDchar /* Send it */
1086: li r3,0x0D /* Carriage return */
1087: bl dbgDchar /* Send it */
1088:
1089: li r3,0x20 /* Print eyecatcher */
1090: bl dbgDchar /* Send it */
1091: li r3,0x20 /* Print eyecatcher */
1092: bl dbgDchar /* Send it */
1093: li r3,0x20 /* Print eyecatcher */
1094: bl dbgDchar /* Send it */
1095: li r3,0x20 /* Print eyecatcher */
1096: bl dbgDchar /* Send it */
1097: li r3,0x20 /* Print eyecatcher */
1098: bl dbgDchar /* Send it */
1099: lwz r5,saver4(r13) /* Do register */
1100: bl dbg4byte /* Print */
1101: lwz r5,saver5(r13) /* Do register */
1102: bl dbg4byte /* Print */
1103: lwz r5,saver6(r13) /* Do register */
1104: bl dbg4byte /* Print */
1105: lwz r5,saver7(r13) /* Do register */
1106: bl dbg4byte /* Print */
1107: li r3,0x0A /* Linefeed */
1108: bl dbgDchar /* Send it */
1109: li r3,0x0D /* Carriage return */
1110: bl dbgDchar /* Send it */
1111:
1112: li r3,0x20 /* Print eyecatcher */
1113: bl dbgDchar /* Send it */
1114: li r3,0x20 /* Print eyecatcher */
1115: bl dbgDchar /* Send it */
1116: li r3,0x20 /* Print eyecatcher */
1117: bl dbgDchar /* Send it */
1118: li r3,0x20 /* Print eyecatcher */
1119: bl dbgDchar /* Send it */
1120: li r3,0x20 /* Print eyecatcher */
1121: bl dbgDchar /* Send it */
1122: lwz r5,saver8(r13) /* Do register */
1123: bl dbg4byte /* Print */
1124: lwz r5,saver9(r13) /* Do register */
1125: bl dbg4byte /* Print */
1126: lwz r5,saver10(r13) /* Do register */
1127: bl dbg4byte /* Print */
1128: lwz r5,saver11(r13) /* Do register */
1129: bl dbg4byte /* Print */
1130: li r3,0x0A /* Linefeed */
1131: bl dbgDchar /* Send it */
1132: li r3,0x0D /* Carriage return */
1133: bl dbgDchar /* Send it */
1134:
1135: li r3,0x20 /* Print eyecatcher */
1136: bl dbgDchar /* Send it */
1137: li r3,0x20 /* Print eyecatcher */
1138: bl dbgDchar /* Send it */
1139: li r3,0x20 /* Print eyecatcher */
1140: bl dbgDchar /* Send it */
1141: li r3,0x20 /* Print eyecatcher */
1142: bl dbgDchar /* Send it */
1143: li r3,0x20 /* Print eyecatcher */
1144: bl dbgDchar /* Send it */
1145: lwz r5,saver12(r13) /* Do register */
1146: bl dbg4byte /* Print */
1147: lwz r5,saver13(r13) /* Do register */
1148: bl dbg4byte /* Print */
1149: lwz r5,saver14(r13) /* Do register */
1150: bl dbg4byte /* Print */
1151: lwz r5,saver15(r13) /* Do register */
1152: bl dbg4byte /* Print */
1153: li r3,0x0A /* Linefeed */
1154: bl dbgDchar /* Send it */
1155: li r3,0x0D /* Carriage return */
1156: bl dbgDchar /* Send it */
1157:
1158: li r3,0x20 /* Print eyecatcher */
1159: bl dbgDchar /* Send it */
1160: li r3,0x20 /* Print eyecatcher */
1161: bl dbgDchar /* Send it */
1162: li r3,0x20 /* Print eyecatcher */
1163: bl dbgDchar /* Send it */
1164: li r3,0x20 /* Print eyecatcher */
1165: bl dbgDchar /* Send it */
1166: li r3,0x20 /* Print eyecatcher */
1167: bl dbgDchar /* Send it */
1168: lwz r5,saver16(r13) /* Do register */
1169: bl dbg4byte /* Print */
1170: lwz r5,saver17(r13) /* Do register */
1171: bl dbg4byte /* Print */
1172: lwz r5,saver18(r13) /* Do register */
1173: bl dbg4byte /* Print */
1174: lwz r5,saver19(r13) /* Do register */
1175: bl dbg4byte /* Print */
1176: li r3,0x0A /* Linefeed */
1177: bl dbgDchar /* Send it */
1178: li r3,0x0D /* Carriage return */
1179: bl dbgDchar /* Send it */
1180:
1181: li r3,0x20 /* Print eyecatcher */
1182: bl dbgDchar /* Send it */
1183: li r3,0x20 /* Print eyecatcher */
1184: bl dbgDchar /* Send it */
1185: li r3,0x20 /* Print eyecatcher */
1186: bl dbgDchar /* Send it */
1187: li r3,0x20 /* Print eyecatcher */
1188: bl dbgDchar /* Send it */
1189: li r3,0x20 /* Print eyecatcher */
1190: bl dbgDchar /* Send it */
1191: lwz r5,saver20(r13) /* Do register */
1192: bl dbg4byte /* Print */
1193: lwz r5,saver21(r13) /* Do register */
1194: bl dbg4byte /* Print */
1195: lwz r5,saver22(r13) /* Do register */
1196: bl dbg4byte /* Print */
1197: lwz r5,saver23(r13) /* Do register */
1198: bl dbg4byte /* Print */
1199: li r3,0x0A /* Linefeed */
1200: bl dbgDchar /* Send it */
1201: li r3,0x0D /* Carriage return */
1202: bl dbgDchar /* Send it */
1203:
1204: li r3,0x20 /* Print eyecatcher */
1205: bl dbgDchar /* Send it */
1206: li r3,0x20 /* Print eyecatcher */
1207: bl dbgDchar /* Send it */
1208: li r3,0x20 /* Print eyecatcher */
1209: bl dbgDchar /* Send it */
1210: li r3,0x20 /* Print eyecatcher */
1211: bl dbgDchar /* Send it */
1212: li r3,0x20 /* Print eyecatcher */
1213: bl dbgDchar /* Send it */
1214: lwz r5,saver24(r13) /* Do register */
1215: bl dbg4byte /* Print */
1216: lwz r5,saver25(r13) /* Do register */
1217: bl dbg4byte /* Print */
1218: lwz r5,saver26(r13) /* Do register */
1219: bl dbg4byte /* Print */
1220: lwz r5,saver27(r13) /* Do register */
1221: bl dbg4byte /* Print */
1222: li r3,0x0A /* Linefeed */
1223: bl dbgDchar /* Send it */
1224: li r3,0x0D /* Carriage return */
1225: bl dbgDchar /* Send it */
1226:
1227: li r3,0x20 /* Print eyecatcher */
1228: bl dbgDchar /* Send it */
1229: li r3,0x20 /* Print eyecatcher */
1230: bl dbgDchar /* Send it */
1231: li r3,0x20 /* Print eyecatcher */
1232: bl dbgDchar /* Send it */
1233: li r3,0x20 /* Print eyecatcher */
1234: bl dbgDchar /* Send it */
1235: li r3,0x20 /* Print eyecatcher */
1236: bl dbgDchar /* Send it */
1237: lwz r5,saver28(r13) /* Do register */
1238: bl dbg4byte /* Print */
1239: lwz r5,saver29(r13) /* Do register */
1240: bl dbg4byte /* Print */
1241: lwz r5,saver30(r13) /* Do register */
1242: bl dbg4byte /* Print */
1243: lwz r5,saver31(r13) /* Do register */
1244: bl dbg4byte /* Print */
1245: li r3,0x0A /* Linefeed */
1246: bl dbgDchar /* Send it */
1247: li r3,0x0D /* Carriage return */
1248: bl dbgDchar /* Send it */
1249:
1250: /* Segment registers */
1251:
1252: li r3,0x53 /* Print eyecatcher */
1253: bl dbgDchar /* Send it */
1254: li r3,0x65 /* Print eyecatcher */
1255: bl dbgDchar /* Send it */
1256: li r3,0x67 /* Print eyecatcher */
1257: bl dbgDchar /* Send it */
1258: li r3,0x73 /* Print eyecatcher */
1259: bl dbgDchar /* Send it */
1260: li r3,0x20 /* Print eyecatcher */
1261: bl dbgDchar /* Send it */
1262:
1263: lwz r5,savesr0(r13) /* Do register */
1264: bl dbg4byte /* Print */
1265: lwz r5,savesr1(r13) /* Do register */
1266: bl dbg4byte /* Print */
1267: lwz r5,savesr2(r13) /* Do register */
1268: bl dbg4byte /* Print */
1269: lwz r5,savesr3(r13) /* Do register */
1270: bl dbg4byte /* Print */
1271: li r3,0x0A /* Linefeed */
1272: bl dbgDchar /* Send it */
1273: li r3,0x0D /* Carriage return */
1274: bl dbgDchar /* Send it */
1275:
1276: li r3,0x20 /* Print eyecatcher */
1277: bl dbgDchar /* Send it */
1278: li r3,0x20 /* Print eyecatcher */
1279: bl dbgDchar /* Send it */
1280: li r3,0x20 /* Print eyecatcher */
1281: bl dbgDchar /* Send it */
1282: li r3,0x20 /* Print eyecatcher */
1283: bl dbgDchar /* Send it */
1284: li r3,0x20 /* Print eyecatcher */
1285: bl dbgDchar /* Send it */
1286: lwz r5,savesr4(r13) /* Do register */
1287: bl dbg4byte /* Print */
1288: lwz r5,savesr5(r13) /* Do register */
1289: bl dbg4byte /* Print */
1290: lwz r5,savesr6(r13) /* Do register */
1291: bl dbg4byte /* Print */
1292: lwz r5,savesr7(r13) /* Do register */
1293: bl dbg4byte /* Print */
1294: li r3,0x0A /* Linefeed */
1295: bl dbgDchar /* Send it */
1296: li r3,0x0D /* Carriage return */
1297: bl dbgDchar /* Send it */
1298:
1299: li r3,0x20 /* Print eyecatcher */
1300: bl dbgDchar /* Send it */
1301: li r3,0x20 /* Print eyecatcher */
1302: bl dbgDchar /* Send it */
1303: li r3,0x20 /* Print eyecatcher */
1304: bl dbgDchar /* Send it */
1305: li r3,0x20 /* Print eyecatcher */
1306: bl dbgDchar /* Send it */
1307: li r3,0x20 /* Print eyecatcher */
1308: bl dbgDchar /* Send it */
1309: lwz r5,savesr8(r13) /* Do register */
1310: bl dbg4byte /* Print */
1311: lwz r5,savesr9(r13) /* Do register */
1312: bl dbg4byte /* Print */
1313: lwz r5,savesr10(r13) /* Do register */
1314: bl dbg4byte /* Print */
1315: lwz r5,savesr11(r13) /* Do register */
1316: bl dbg4byte /* Print */
1317: li r3,0x0A /* Linefeed */
1318: bl dbgDchar /* Send it */
1319: li r3,0x0D /* Carriage return */
1320: bl dbgDchar /* Send it */
1321:
1322: li r3,0x20 /* Print eyecatcher */
1323: bl dbgDchar /* Send it */
1324: li r3,0x20 /* Print eyecatcher */
1325: bl dbgDchar /* Send it */
1326: li r3,0x20 /* Print eyecatcher */
1327: bl dbgDchar /* Send it */
1328: li r3,0x20 /* Print eyecatcher */
1329: bl dbgDchar /* Send it */
1330: li r3,0x20 /* Print eyecatcher */
1331: bl dbgDchar /* Send it */
1332: lwz r5,savesr12(r13) /* Do register */
1333: bl dbg4byte /* Print */
1334: lwz r5,savesr13(r13) /* Do register */
1335: bl dbg4byte /* Print */
1336: lwz r5,savesr14(r13) /* Do register */
1337: bl dbg4byte /* Print */
1338: lwz r5,savesr15(r13) /* Do register */
1339: bl dbg4byte /* Print */
1340: li r3,0x0A /* Linefeed */
1341: bl dbgDchar /* Send it */
1342: li r3,0x0D /* Carriage return */
1343: bl dbgDchar /* Send it */
1344:
1345: li r3,0x30 /* Print eyecatcher */
1346: bl dbgDchar /* Send it */
1347: li r3,0x31 /* Print eyecatcher */
1348: bl dbgDchar /* Send it */
1349: li r3,0x64 /* Print eyecatcher */
1350: bl dbgDchar /* Send it */
1351: li r3,0x64 /* Print eyecatcher */
1352: bl dbgDchar /* Send it */
1353: li r3,0x20 /* Print eyecatcher */
1354: bl dbgDchar /* Send it */
1355: lwz r5,savesrr0(r13) /* Do register */
1356: bl dbg4byte /* Print */
1357: lwz r5,savesrr1(r13) /* Do register */
1358: bl dbg4byte /* Print */
1359: lwz r5,savedar(r13) /* Do register */
1360: bl dbg4byte /* Print */
1361: lwz r5,savedsisr(r13) /* Do register */
1362: bl dbg4byte /* Print */
1363: li r3,0x0A /* Linefeed */
1364: bl dbgDchar /* Send it */
1365: li r3,0x0D /* Carriage return */
1366: bl dbgDchar /* Send it */
1367:
1368: li r3,0x20 /* Print eyecatcher */
1369: bl dbgDchar /* Send it */
1370: li r3,0x6C /* Print eyecatcher */
1371: bl dbgDchar /* Send it */
1372: li r3,0x63 /* Print eyecatcher */
1373: bl dbgDchar /* Send it */
1374: li r3,0x63 /* Print eyecatcher */
1375: bl dbgDchar /* Send it */
1376: li r3,0x20 /* Print eyecatcher */
1377: bl dbgDchar /* Send it */
1378: lwz r5,savelr(r13) /* Do register */
1379: bl dbg4byte /* Print */
1380: lwz r5,savecr(r13) /* Do register */
1381: bl dbg4byte /* Print */
1382: lwz r5,savectr(r13) /* Do register */
1383: bl dbg4byte /* Print */
1384: li r3,0x0A /* Linefeed */
1385: bl dbgDchar /* Send it */
1386: li r3,0x0D /* Carriage return */
1387: bl dbgDchar /* Send it */
1388: mtlr r11 /* Get back the return */
1389: dcbi 0,r10 /* ? */
1390: #if !SIMPLESCC && !NOTQUITEASSIMPLE
1391: li r7,0 /* Get a zero */
1392: mtdbatu 3,r7 /* Invalidate DBAT 3 upper */
1393: mtdbatl 3,r7 /* Invalidate DBAT 3 lower */
1394: #endif
1395: lis r3,HIGH_ADDR(fwdisplock) /* Get the display locker outer */
1396: li r7,0 /* Get a zero */
1397: ori r3,r3,LOW_ADDR(fwdisplock) /* Last part */
1398: stw r7,0(r3) /* Clear display lock */
1399: mtmsr r8 /* Restore the MSR */
1400: isync /* Wait for it */
1401: blr /* Leave... */
1402:
1403:
1404: /*
1405: * Used for debugging to leave stuff in 0x380-0x3FF (128 bytes).
1406: * Mapping is V=R. Stores and loads are real.
1407: */
1408:
1409: ENTRY(dbgCkpt, TAG_NO_FRAME_USED)
1410:
1411: mr r12,r0 /* Keep R0 pristene */
1412: lis r0,HIGH_ADDR(dbgCkptCall) /* Top half of dbgCkptCall firmware call number */
1413: ori r0,r0,LOW_ADDR(dbgCkptCall) /* Bottom half */
1414:
1415: sc /* Go stash the stuff */
1416:
1417: mr r0,r12 /* Restore R0 */
1418: blr /* Return... */
1419:
1420: /* Here's the low-level part of dbgCkpt */
1421:
1422: ENTRY(dbgCkptLL, TAG_NO_FRAME_USED)
1423:
1424: li r12,0x380 /* Point to output area */
1425: li r1,32 /* Get line size */
1426: dcbz 0,r12 /* Make sure we don't fetch a cache line */
1427:
1428: lwz r4,0x00(r3) /* Load up storage to checkpoint */
1429:
1430: dcbt r1,r3 /* Start in the next line */
1431:
1432: lwz r5,0x04(r3) /* Load up storage to checkpoint */
1433: lwz r6,0x08(r3) /* Load up storage to checkpoint */
1434: lwz r7,0x0C(r3) /* Load up storage to checkpoint */
1435: lwz r8,0x10(r3) /* Load up storage to checkpoint */
1436: lwz r9,0x14(r3) /* Load up storage to checkpoint */
1437: lwz r10,0x18(r3) /* Load up storage to checkpoint */
1438: lwz r11,0x1C(r3) /* Load up storage to checkpoint */
1439:
1440: add r3,r3,r1 /* Bump input */
1441:
1442: stw r4,0x00(r12) /* Store it */
1443: stw r5,0x04(r12) /* Store it */
1444: stw r6,0x08(r12) /* Store it */
1445: stw r7,0x0C(r12) /* Store it */
1446: stw r8,0x10(r12) /* Store it */
1447: stw r9,0x14(r12) /* Store it */
1448: stw r10,0x18(r12) /* Store it */
1449: stw r11,0x1C(r12) /* Store it */
1450:
1451: dcbz r1,r12 /* Clear the next line */
1452: add r12,r12,r1 /* Point to next output line */
1453:
1454: lwz r4,0x00(r3) /* Load up storage to checkpoint */
1455: lwz r5,0x04(r3) /* Load up storage to checkpoint */
1456: lwz r6,0x08(r3) /* Load up storage to checkpoint */
1457: lwz r7,0x0C(r3) /* Load up storage to checkpoint */
1458: lwz r8,0x10(r3) /* Load up storage to checkpoint */
1459: lwz r9,0x14(r3) /* Load up storage to checkpoint */
1460: lwz r10,0x18(r3) /* Load up storage to checkpoint */
1461: lwz r11,0x1C(r3) /* Load up storage to checkpoint */
1462:
1463: dcbt r1,r3 /* Touch the next line */
1464: add r3,r3,r1 /* Point to next input line */
1465:
1466: stw r4,0x00(r12) /* Store it */
1467: stw r5,0x04(r12) /* Store it */
1468: stw r6,0x08(r12) /* Store it */
1469: stw r7,0x0C(r12) /* Store it */
1470: stw r8,0x10(r12) /* Store it */
1471: stw r9,0x14(r12) /* Store it */
1472: stw r10,0x18(r12) /* Store it */
1473: stw r11,0x1C(r12) /* Store it */
1474:
1475: dcbz r1,r12 /* Clear the next line */
1476: add r12,r12,r1 /* Point to next output line */
1477:
1478: lwz r4,0x00(r3) /* Load up storage to checkpoint */
1479: lwz r5,0x04(r3) /* Load up storage to checkpoint */
1480: lwz r6,0x08(r3) /* Load up storage to checkpoint */
1481: lwz r7,0x0C(r3) /* Load up storage to checkpoint */
1482: lwz r8,0x10(r3) /* Load up storage to checkpoint */
1483: lwz r9,0x14(r3) /* Load up storage to checkpoint */
1484: lwz r10,0x18(r3) /* Load up storage to checkpoint */
1485: lwz r11,0x1C(r3) /* Load up storage to checkpoint */
1486:
1487: dcbt r1,r3 /* Touch the next line */
1488: add r3,r3,r1 /* Point to next input line */
1489:
1490: stw r4,0x00(r12) /* Store it */
1491: stw r5,0x04(r12) /* Store it */
1492: stw r6,0x08(r12) /* Store it */
1493: stw r7,0x0C(r12) /* Store it */
1494: stw r8,0x10(r12) /* Store it */
1495: stw r9,0x14(r12) /* Store it */
1496: stw r10,0x18(r12) /* Store it */
1497: stw r11,0x1C(r12) /* Store it */
1498:
1499: dcbz r1,r12 /* Clear the next line */
1500: add r12,r12,r1 /* Point to next output line */
1501:
1502: lwz r4,0x00(r3) /* Load up storage to checkpoint */
1503: lwz r5,0x04(r3) /* Load up storage to checkpoint */
1504: lwz r6,0x08(r3) /* Load up storage to checkpoint */
1505: lwz r7,0x0C(r3) /* Load up storage to checkpoint */
1506: lwz r8,0x10(r3) /* Load up storage to checkpoint */
1507: lwz r9,0x14(r3) /* Load up storage to checkpoint */
1508: lwz r10,0x18(r3) /* Load up storage to checkpoint */
1509: lwz r11,0x1C(r3) /* Load up storage to checkpoint */
1510:
1511: stw r4,0x00(r12) /* Store it */
1512: stw r5,0x04(r12) /* Store it */
1513: stw r6,0x08(r12) /* Store it */
1514: stw r7,0x0C(r12) /* Store it */
1515: stw r8,0x10(r12) /* Store it */
1516: stw r9,0x14(r12) /* Store it */
1517: stw r10,0x18(r12) /* Store it */
1518: stw r11,0x1C(r12) /* Store it */
1519:
1520: blr
1521:
1522:
1523: /*
1524: * Do Preemption. Forces a T_PREEMPT trap to allow a preemption to occur.
1525: */
1526:
1527: ENTRY(DoPreemptLL, TAG_NO_FRAME_USED)
1528:
1529: mfsprg r11,0 /* Get the per_proc address */
1530: lwz r11,PP_TEMPWORK1(r11) /* Restore the return address */
1531: li r3,T_PREEMPT /* Set preemption interrupt value */
1532: mtlr r11 /* Restore the LR */
1533: stw r3,saveexception(r13) /* Modify the exception type to preemption */
1534: blr /* Return to interrupt handler */
1535:
1536:
1537: /*
1538: * Force 'rupt handler to dispatch with new context
1539: * R3 at the call contains the new savearea.
1540: * R4 at the call contains a return code to pass back in R3.
1541: * Forces a T_CSWITCH
1542: */
1543:
1544: ENTRY(SwitchContextLL, TAG_NO_FRAME_USED)
1545:
1546: mfsprg r11,0 /* Get the per_proc address */
1547: lwz r11,PP_TEMPWORK1(r11) /* Restore the return address */
1548: li r3,T_CSWITCH /* Set context switch value */
1549: mtlr r11 /* Restore the LR */
1550: stw r3,saveexception(r13) /* Modify the exception type to switch context */
1551: blr /* Return to interrupt handler */
1552:
1553:
1554: /*
1555: * Create a fake I/O 'rupt.
1556: * Forces a T_INTERRUPT trap to pretend that an actual I/O interrupt occurred.
1557: */
1558:
1559: ENTRY(CreateFakeIOLL, TAG_NO_FRAME_USED)
1560:
1561: mfsprg r11,0 /* Get the per_proc address */
1562: lwz r11,PP_TEMPWORK1(r11) /* Restore the return address */
1563: li r3,T_INTERRUPT /* Set external interrupt value */
1564: mtlr r11 /* Restore the LR */
1565: stw r3,saveexception(r13) /* Modify the exception type to external */
1566: blr /* Return to interrupt handler */
1567:
1568: /*
1569: * Create a fake decrementer 'rupt.
1570: * Forces a T_DECREMENTER trap to pretend that an actual decrementer interrupt occurred.
1571: */
1572:
1573: ENTRY(CreateFakeDECLL, TAG_NO_FRAME_USED)
1574:
1575: mfsprg r11,0 /* Get the per_proc address */
1576: lwz r11,PP_TEMPWORK1(r11) /* Restore the return address */
1577: li r3,T_DECREMENTER /* Set decrementer interrupt value */
1578: mtlr r11 /* Restore the LR */
1579: stw r3,saveexception(r13) /* Modify the exception type to external */
1580: blr /* Return to interrupt handler */
1581:
1582: /*
1583: * Choke the system. This is just a dummy for now,
1584: * but we'll eventually do something.
1585: */
1586:
1587: ENTRY(DoChokeLL, TAG_NO_FRAME_USED)
1588:
1589: BREAKPOINT_TRAP /* Dummy for now */
1590:
1591: /*
1592: * Set the low level trace flags
1593: */
1594:
1595: ENTRY(LLTraceSet, TAG_NO_FRAME_USED)
1596:
1597: mfmsr r12 /* Get the MSR */
1598: mr r4,r3 /* Save the new value */
1599: andi. r11,r12,0x01C0 /* Clear interrupts and translation */
1600: mtmsr r11 /* Set 'em all off */
1601: isync
1602:
1603: lwz r3,0x180(br0) /* Get the old trace flags to pass back */
1604: stw r4,0x180(br0) /* Replace with the new ones */
1605:
1606: mtmsr r12 /* Restore the MSR */
1607: isync
1608:
1609: blr /* Leave... */
1610:
1611: #if 1
1612:
1613: /*
1614: ; ***************************************************************************
1615: ;
1616: ; ----------------- Grateful Deb ----------------
1617: ;
1618: ; Debugging: direct draw into main screen menu bar
1619: ;
1620: ; Takes R4 value, converts it to hex characters and displays it.
1621: ;
1622: ; Gotta make sure the DCBST is done to force the pixels from the cache.
1623: ;
1624: ; Position is taken as column, row (0 based) from R3.
1625: ; Characters are from hexfont, and are 16x16 pixels.
1626: ;
1627: ; Only works with two processors so far
1628: ;
1629: ;
1630: ; ***************************************************************************
1631: */
1632:
1633: #define GDfromright 20
1634: #define GDfontsize 16
1635:
1636: ENTRY(GratefulDeb,TAG_NO_FRAME_USED)
1637: mfspr r6,pir /* Get the PIR */
1638: lis r5,HIGH_ADDR(EXT(GratefulDebWork)) /* Point to our work area */
1639: rlwinm r6,r6,8,23,23 /* Get part of the offset to our processors area */
1640: ori r5,r5,LOW_ADDR(EXT(GratefulDebWork)) /* Start building the address */
1641: rlwimi r6,r6,2,21,21 /* Get the rest of the offset to our processors area */
1642: add r6,r6,r5 /* Point at our CPU's work area */
1643: mfmsr r5 /* Get that MSR */
1644: stmw r0,GDsave(r6) /* Save all registers */
1645: lwz r10,GDready(r6) /* See if we're all ready to go */
1646: ori r0,r5,0x2000 /* Turn on the floating point */
1647: mr r31,r6 /* Get a more sane base register */
1648: mr. r10,r10 /* Are we all set? */
1649: mtmsr r0 /* Enable floating point */
1650: isync
1651:
1652: stfd f0,GDfp0(r31) /* Save FP */
1653: stfd f1,GDfp1(r31) /* Save FP */
1654: stfd f2,GDfp2(r31) /* Save FP */
1655: stfd f3,GDfp3(r31) /* Save FP */
1656:
1657: beq- GDbailout /* Go and bail... */
1658:
1659: rlwinm r25,r3,0,16,31 /* Isolate just the row number */
1660: lwz r28,GDtopleft(r31) /* Get the physical address of our line 0 */
1661: rlwinm r3,r3,16,16,31 /* Isolate the column number */
1662: lwz r27,GDrowbytes(r31) /* Get the number of bytes per row */
1663: lwz r9,GDrowchar(r31) /* Get the number of bytes per row of full leaded charactrers */
1664: lwz r26,GDdepth(r31) /* Get the bit depth */
1665: mullw r25,r25,r9 /* get offset to the row to write in bytes */
1666: lwz r24,GDcollgn(r31) /* Get the size of columns in bytes */
1667: add r25,r28,r25 /* Physical address of row */
1668: mullw r3,r3,r24 /* Get byte offset to first output column */
1669:
1670: li r9,32 /* Get the initial shift calc */
1671:
1672: lis r20,HIGH_ADDR(hexfont) /* Point to the font */
1673:
1674: li r18,GDfontsize /* Get the number of rows in the font */
1675: ori r20,r20,LOW_ADDR(hexfont) /* Point to the low part */
1676: add r21,r25,r3 /* Physical address of top left output pixel */
1677: sub r9,r9,r26 /* Get right shift justifier for pixel size */
1678: li r7,32 /* Number of bits per word */
1679:
1680: startNybble:
1681: la r6,GDrowbuf1(r31) /* Point to the row buffer */
1682: li r19,8 /* Get the number of characters in a row */
1683:
1684: getNybble: rlwinm r10,r4,9,23,26 /* Get the top nybble * 32 */
1685: rlwinm r4,r4,4,0,31 /* Rotate a nybble */
1686: add r10,r20,r10 /* Point to the character in the font */
1687:
1688: rlwinm r16,r26,4,0,27 /* Width of row in actual bits */
1689: lhz r15,0(r10) /* Get the next row of the font */
1690:
1691: rendrow: rlwinm r17,r15,16,0,0 /* Get the next font pixel in the row */
1692: rlwinm r15,r15,1,16,31 /* Move in the next font pixel */
1693: srawi r17,r17,31 /* Fill with 1s if black and 0s if white (reversed) */
1694:
1695: slw r14,r14,r26 /* Make room for our pixel in a register */
1696: srw r17,r17,r9 /* Isolate one pixels worth of black or white */
1697: sub. r7,r7,r26 /* See how may bits are left */
1698: sub r16,r16,r26 /* Count how many bits are left to store for this row */
1699: or r14,r14,r17 /* Put in the pixel */
1700: bne+ notfull /* Finish rendering this word */
1701:
1702: not r14,r14 /* Invert to black on white */
1703: stw r14,0(r6) /* Write out the word */
1704: li r7,32 /* Bit per word count */
1705: addi r6,r6,4 /* Point to the next word */
1706:
1707: notfull: mr. r16,r16 /* Have we finished the whole character row? */
1708: bne+ rendrow /* Finish rendering the row */
1709:
1710: addic. r19,r19,-1 /* Are we finished with a whole display row yet? */
1711: bne+ getNybble /* Not yet... */
1712:
1713: la r6,GDrowbuf1(r31) /* Point to the row buffer */
1714: rlwinm r19,r26,31,0,29 /* Number of cache lines (depth/2) */
1715: mr r14,r21 /* Get the frame buffer address */
1716:
1717: // BREAKPOINT_TRAP
1718:
1719: blitrow: lfd f0,0(r6) /* Load a line */
1720: lfd f1,8(r6)
1721: lfd f2,16(r6)
1722: lfd f3,24(r6)
1723:
1724: stfd f0,0(r14) /* Blit a line */
1725: stfd f1,8(r14)
1726: stfd f2,16(r14)
1727: stfd f3,24(r14)
1728:
1729: addi r6,r6,32 /* Next buffered line */
1730:
1731: dcbst 0,r14 /* Force the line to the screen */
1732: sync /* Make sure the line is on it's way */
1733: eieio /* Make sure we beat the invalidate */
1734: dcbi 0,r14 /* Make sure we leave no paradox */
1735:
1736: addic. r19,r19,-1 /* Done all lines yet? */
1737: addi r14,r14,32 /* Point to the next output */
1738: bne+ blitrow /* Nope, do it some more... */
1739:
1740: addic. r18,r18,-1 /* Have we done all the rows in character yet? */
1741: addi r20,r20,2 /* Offset the font to the next row */
1742: add r21,r21,r27 /* Point to start of next row */
1743: bne+ startNybble /* Nope, go through the word one more time... */
1744:
1745: GDbailout: mr r1,r31 /* Move the workarea base */
1746:
1747: lfd f0,GDfp0(r31) /* Restore FP */
1748: lfd f1,GDfp1(r31) /* Restore FP */
1749: lfd f2,GDfp2(r31) /* Restore FP */
1750: lfd f3,GDfp3(r31) /* Restore FP */
1751:
1752: mtmsr r5 /* Disable floating point */
1753: isync
1754:
1755: lmw r3,GDsave+12(r1) /* Restore most registers */
1756: lwz r0,GDsave(r1) /* Restore R0 */
1757: lwz r1,GDsave+4(r1) /* Finally, R1 */
1758: blr /* Leave... */
1759:
1760:
1761: /*
1762: * void GratefulDebDisp(unsigned int coord, unsigned int data);
1763: */
1764:
1765:
1766: ENTRY(GratefulDebDisp,TAG_NO_FRAME_USED)
1767:
1768: mfmsr r9 /* Save the current MSR */
1769: mflr r7 /* Save the return */
1770: andi. r8,r9,0x7FCF /* Clear interrupt and translation */
1771: mtmsr r8 /* Turn 'em really off */
1772: isync /* Make sure about the translation part */
1773: bl EXT(GratefulDeb) /* Display it */
1774: mtmsr r9 /* Restore interrupt and translation */
1775: mtlr r7 /* Restore return */
1776: isync /* Make sure */
1777: blr
1778:
1779:
1780: #endif
1781:
1782: /*
1783: * void checkNMI(void);
1784: */
1785:
1786:
1787: ENTRY(checkNMI,TAG_NO_FRAME_USED)
1788:
1789: mfmsr r9 /* Save it */
1790: andi. r8,r9,0x7FCF /* Clear it */
1791: mtmsr r8 /* Disable it */
1792: isync /* Fence it */
1793: lis r7,0xF300 /* Find it */
1794: ori r7,r7,0x0020 /* Find it */
1795: dcbi 0,r7 /* Toss it */
1796: sync /* Sync it */
1797: eieio /* Get it */
1798: lwz r6,0x000C(r7) /* Check it */
1799: eieio /* Fence it */
1800: dcbi 0,r7 /* Toss it */
1801: rlwinm. r4,r6,0,19,19 /* Check it */
1802: rlwinm r6,r6,0,20,18 /* Clear it */
1803: sync /* Sync it */
1804: eieio /* Fence it */
1805: beq+ xnonmi /* Branch on it */
1806:
1807: stw r6,0x0008(r7) /* Reset it */
1808: sync /* Sync it */
1809: dcbi 0,r6 /* Toss it */
1810: eieio /* Fence it */
1811:
1812: mtmsr r9 /* Restore it */
1813: isync /* Hold it */
1814:
1815: BREAKPOINT_TRAP /* Kill it */
1816: blr /* Return from it */
1817:
1818: xnonmi: /* Label it */
1819: mtmsr r9 /* Restore it */
1820: isync /* Hold it */
1821: blr /* Return from it */
1822:
1823:
1824: /*
1825: * Early debug code
1826: */
1827:
1828: dumpr7: lis r9,HIGH_ADDR(hexTab) /* (TEST/DEBUG) */
1829: li r5,8 /* (TEST/DEBUG) */
1830: ori r9,r9,LOW_ADDR(hexTab) /* (TEST/DEBUG) */
1831:
1832: dumpr7n: rlwinm r7,r7,4,0,31 /* (TEST/DEBUG) */
1833: mr r6,r7 /* (TEST/DEBUG) */
1834: andi. r6,r6,15 /* (TEST/DEBUG) */
1835: lbzx r6,r9,r6 /* (TEST/DEBUG) */
1836: lis r10,0xF301 /* (TEST/DEBUG) */
1837: ori r10,r10,0x2000 /* (TEST/DEBUG) */
1838:
1839: #if 0
1840: xqrw2: eieio /* (TEST/DEBUG) */
1841: lbz r7,0(r10) /* (TEST/DEBUG) */
1842: dcbi 0,r10 /* (TEST/DEBUG) */
1843: sync /* (TEST/DEBUG) */
1844: andi. r7,r7,0x04 /* (TEST/DEBUG) */
1845: beq xqrw2 /* (TEST/DEBUG) */
1846: #endif
1847:
1848: dcbf 0,r10 /* (TEST/DEBUG) */
1849: sync /* (TEST/DEBUG) */
1850: dcbi 0,r10 /* (TEST/DEBUG) */
1851: eieio /* (TEST/DEBUG) */
1852: stb r6,4(r10) /* (TEST/DEBUG) */
1853:
1854: lis r6,10 /* (TEST/DEBUG) */
1855: dumpr7d: addi r6,r6,-1 /* (TEST/DEBUG) */
1856: mr. r6,r6 /* (TEST/DEBUG) */
1857: bne- dumpr7d /* (TEST/DEBUG) */
1858: dcbf 0,r10 /* (TEST/DEBUG) */
1859: sync /* (TEST/DEBUG) */
1860: dcbi 0,r10 /* (TEST/DEBUG) */
1861: eieio /* (TEST/DEBUG) */
1862:
1863: addic. r5,r5,-1 /* (TEST/DEBUG) */
1864: bne+ dumpr7n /* (TEST/DEBUG) */
1865:
1866: blr /* (TEST/DEBUG) */
1867:
1868: ;
1869: ; Log a special entry in physical memory.
1870: ; This assumes that memory size has been significantly lowered using
1871: ; the maxmem boot option. The buffer starts just after the end of mem_size.
1872: ;
1873: ; This is absolutely for special tracing cases. Do not ever leave in...
1874: ;
1875:
1876: ENTRY(dbgLog,TAG_NO_FRAME_USED)
1877:
1878: li r11,0 ; Clear callers callers callers return
1879: li r10,0 ; Clear callers callers callers callers return
1880: li r9,0 ; Clear callers callers callers callers callers return
1881: lwz r2,0(r1) ; Get callers callers stack frame
1882: lis r0,0x4000 ; First invalid address
1883: lwz r12,8(r2) ; Get our callers return
1884: lwz r2,0(r2) ; Back chain
1885:
1886: mr. r2,r2 ; End of chain?
1887: cmplw cr1,r2,r0 ; Valid kernel address?
1888: beq- nosavehere ; Yes, end of chain...
1889: bge- cr1,nosavehere ; No...
1890: lwz r11,8(r2) ; Get our callers return
1891: lwz r2,0(r2) ; Back chain
1892:
1893: mr. r2,r2 ; End of chain?
1894: cmplw cr1,r2,r0 ; Valid kernel address?
1895: beq- nosavehere ; Yes, end of chain...
1896: bge- cr1,nosavehere ; No...
1897: lwz r10,8(r2) ; Get our callers return
1898: lwz r2,0(r2) ; Back chain
1899:
1900: mr. r2,r2 ; End of chain?
1901: cmplw cr1,r2,r0 ; Valid kernel address?
1902: beq- nosavehere ; Yes, end of chain...
1903: bge- cr1,nosavehere ; No...
1904: lwz r9,8(r2) ; Get our callers return
1905:
1906: nosavehere: mfmsr r8 ; Get the MSR
1907: lis r2,hi16(EXT(DebugWork)) ; High part of area
1908: lis r7,hi16(EXT(mem_actual)) ; High part of actual
1909: andi. r0,r8,0x7FCF ; Interrupts and translation off
1910: ori r2,r2,lo16(EXT(DebugWork)) ; Get the entry
1911: mtmsr r0 ; Turn stuff off
1912: ori r7,r7,lo16(EXT(mem_actual)) ; Get the actual
1913: isync
1914:
1915: lwz r0,4(r2) ; Get the flag
1916: mr. r0,r0 ; Should we log?
1917: lwz r0,0(r7) ; Get the end of memory
1918: lwz r7,0(r2) ; Get the position
1919: bne- waytoofar ; No logging...
1920: mr. r7,r7 ; Is this the first?
1921: bne+ gotspot ; Nope...
1922:
1923: lis r7,hi16(EXT(mem_size)) ; High part of defined memory
1924: ori r7,r7,lo16(EXT(mem_size)) ; Low part of defined memory
1925: lwz r7,0(r7) ; Make it end of defined
1926:
1927: gotspot: cmplw r7,r0 ; Do we fit in memory
1928: addi r0,r7,0x0020 ; Next slot
1929: bge- waytoofar ; No fit...
1930:
1931: stw r0,0(r2) ; Set next time slot
1932: dcbz 0,r7 ; Zap it
1933:
1934: stw r3,0(r7) ; First data
1935: li r3,32 ; Disp to next line
1936: stw r4,4(r7) ; Second data
1937: dcbz r3,r7 ; Zap it
1938: stw r5,8(r7) ; Third data
1939: stw r6,12(r7) ; Fourth data
1940:
1941: stw r12,16(r7) ; Callers callers
1942: stw r11,20(r7) ; Callers callers caller
1943: stw r10,24(r7) ; Callers callers callers caller
1944: stw r9,28(r7) ; Callers callers callers callers caller
1945:
1946: waytoofar: mtmsr r8 ; Back to normal
1947: isync
1948: blr
1949:
1950: ;
1951: ; Same as the other, but no traceback and 16 byte entry
1952: ; Trashes R0, R2, R10, R12
1953: ;
1954:
1955: .align 5
1956: .globl EXT(dbgLog2)
1957:
1958: LEXT(dbgLog2)
1959:
1960:
1961: mfmsr r10 ; Get the MSR
1962: lis r2,hi16(EXT(DebugWork)) ; High part of area
1963: lis r12,hi16(EXT(mem_actual)) ; High part of actual
1964: andi. r0,r10,0x7FCF ; Interrupts and translation off
1965: ori r2,r2,lo16(EXT(DebugWork)) ; Get the entry
1966: mtmsr r0 ; Turn stuff off
1967: ori r12,r12,lo16(EXT(mem_actual)) ; Get the actual
1968: isync
1969:
1970: lwz r0,4(r2) ; Get the flag
1971: mr. r0,r0 ; Should we log?
1972: lwz r0,0(r12) ; Get the end of memory
1973: lwz r12,0(r2) ; Get the position
1974: bne- waytoofar2 ; No logging...
1975: mr. r12,r12 ; Is this the first?
1976: bne+ gotspot2 ; Nope...
1977:
1978: lis r12,hi16(EXT(mem_size)) ; High part of defined memory
1979: ori r12,r12,lo16(EXT(mem_size)) ; Low part of defined memory
1980: lwz r12,0(r12) ; Make it end of defined
1981:
1982: gotspot2: cmplw cr1,r12,r0 ; Do we fit in memory
1983: rlwinm. r0,r12,0,27,27 ; Are we on a new line?
1984: bge- cr1,waytoofar2 ; No fit...
1985: addi r0,r12,0x0010 ; Next slot
1986:
1987: bne+ nonewline ; Not on a new line...
1988: dcbz br0,r12 ; Clear it so we do not fetch it
1989:
1990: nonewline: cmplwi r3,68 ; Special place for time stamp?
1991:
1992: stw r0,0(r2) ; Set next time slot
1993: bne+ nospcts ; Nope...
1994:
1995: lwz r0,0x17C(br0) ; Get special saved time stamp
1996: b nospctt ; Skip...
1997:
1998: nospcts: mftb r0 ; Get the current time
1999:
2000: nospctt: stw r3,4(r12) ; First data
2001: stw r4,8(r12) ; Second data
2002: stw r5,12(r12) ; Third data
2003: stw r0,0(r12) ; Time stamp
2004:
2005: waytoofar2: mtmsr r10 ; Back to normal
2006: isync
2007: blr
2008:
2009:
2010: ;
2011: ; Saves floating point registers
2012: ;
2013:
2014: .align 5
2015: .globl EXT(stFloat)
2016:
2017: LEXT(stFloat)
2018:
2019: mfmsr r0 ; Save the MSR
2020: rlwinm r4,r0,0,MSR_EE_BIT,MSR_EE_BIT ; Turn off interruptions
2021: ori r4,r4,lo16(MASK(MSR_FP)) ; Enable floating point
2022: mtmsr r4
2023: isync
2024:
2025: stfd f0,0x00(r3)
2026: stfd f1,0x08(r3)
2027: stfd f2,0x10(r3)
2028: stfd f3,0x18(r3)
2029: stfd f4,0x20(r3)
2030: stfd f5,0x28(r3)
2031: stfd f6,0x30(r3)
2032: stfd f7,0x38(r3)
2033: stfd f8,0x40(r3)
2034: stfd f9,0x48(r3)
2035: stfd f10,0x50(r3)
2036: stfd f11,0x58(r3)
2037: stfd f12,0x60(r3)
2038: stfd f13,0x68(r3)
2039: stfd f14,0x70(r3)
2040: stfd f15,0x78(r3)
2041: stfd f16,0x80(r3)
2042: stfd f17,0x88(r3)
2043: stfd f18,0x90(r3)
2044: stfd f19,0x98(r3)
2045: stfd f20,0xA0(r3)
2046: stfd f21,0xA8(r3)
2047: stfd f22,0xB0(r3)
2048: stfd f23,0xB8(r3)
2049: stfd f24,0xC0(r3)
2050: stfd f25,0xC8(r3)
2051: stfd f26,0xD0(r3)
2052: stfd f27,0xD8(r3)
2053: stfd f28,0xE0(r3)
2054: stfd f29,0xE8(r3)
2055: stfd f30,0xF0(r3)
2056: stfd f31,0xF8(r3)
2057: mffs f0
2058: stfd f0,0x100(r3)
2059: lfd f0,0x00(r3)
2060: mtmsr r0
2061: isync
2062: blr
2063:
2064:
2065: ;
2066: ; Saves vector registers. Returns 0 if non-Altivec machine.
2067: ;
2068:
2069: .align 5
2070: .globl EXT(stVectors)
2071:
2072: LEXT(stVectors)
2073:
2074: mfpvr r6 ; Get machine type
2075: mr r5,r3 ; Save area address
2076: rlwinm r6,r6,16,16,31 ; Rotate on it
2077: li r3,0 ; Assume failure
2078: cmplwi r6,PROCESSOR_VERSION_Max ; Do we have Altivec?
2079: bltlr+ ; No...
2080:
2081: mfmsr r0 ; Save the MSR
2082: rlwinm r4,r0,0,MSR_EE_BIT,MSR_EE_BIT ; Turn off interruptions
2083: oris r4,r4,hi16(MASK(MSR_VEC)) ; Enable vectors
2084: mtmsr r4
2085: isync
2086:
2087: stvxl v0,0,r5
2088: addi r5,r5,16
2089: stvxl v1,0,r5
2090: addi r5,r5,16
2091: stvxl v2,0,r5
2092: addi r5,r5,16
2093: stvxl v3,0,r5
2094: addi r5,r5,16
2095: stvxl v4,0,r5
2096: addi r5,r5,16
2097: stvxl v5,0,r5
2098: addi r5,r5,16
2099: stvxl v6,0,r5
2100: addi r5,r5,16
2101: stvxl v7,0,r5
2102: addi r5,r5,16
2103: stvxl v8,0,r5
2104: addi r5,r5,16
2105: stvxl v9,0,r5
2106: addi r5,r5,16
2107: stvxl v10,0,r5
2108: addi r5,r5,16
2109: stvxl v11,0,r5
2110: addi r5,r5,16
2111: stvxl v12,0,r5
2112: addi r5,r5,16
2113: stvxl v13,0,r5
2114: addi r5,r5,16
2115: stvxl v14,0,r5
2116: addi r5,r5,16
2117: stvxl v15,0,r5
2118: addi r5,r5,16
2119: stvxl v16,0,r5
2120: addi r5,r5,16
2121: stvxl v17,0,r5
2122: addi r5,r5,16
2123: stvxl v18,0,r5
2124: addi r5,r5,16
2125: stvxl v19,0,r5
2126: addi r5,r5,16
2127: stvxl v20,0,r5
2128: addi r5,r5,16
2129: stvxl v21,0,r5
2130: addi r5,r5,16
2131: stvxl v22,0,r5
2132: addi r5,r5,16
2133: stvxl v23,0,r5
2134: addi r5,r5,16
2135: stvxl v24,0,r5
2136: addi r5,r5,16
2137: stvxl v25,0,r5
2138: addi r5,r5,16
2139: stvxl v26,0,r5
2140: addi r5,r5,16
2141: stvxl v27,0,r5
2142: addi r5,r5,16
2143: stvxl v28,0,r5
2144: addi r5,r5,16
2145: stvxl v29,0,r5
2146: addi r5,r5,16
2147: stvxl v30,0,r5
2148: addi r5,r5,16
2149: stvxl v31,0,r5
2150: mfvscr v31
2151: addi r6,r5,16
2152: stvxl v31,0,r6
2153: li r3,1
2154: lvxl v31,0,r5
2155: mtmsr r0
2156: isync
2157: blr
2158:
2159:
2160: ;
2161: ; Saves yet more registers
2162: ;
2163:
2164: .align 5
2165: .globl EXT(stSpecrs)
2166:
2167: LEXT(stSpecrs)
2168:
2169: mfmsr r0 ; Save the MSR
2170: rlwinm r4,r0,0,MSR_EE_BIT,MSR_EE_BIT ; Turn off interruptions
2171: mtmsr r4
2172: isync
2173:
2174: mfspr r4,pir
2175: stw r4,0(r3)
2176:
2177: mfpvr r4
2178: stw r4,4(r3)
2179:
2180: mfdbatu r4,0
2181: mfdbatl r5,0
2182: mfdbatu r6,1
2183: mfdbatl r7,1
2184: mfdbatu r8,2
2185: mfdbatl r9,2
2186: mfdbatu r10,3
2187: mfdbatl r11,3
2188: stw r4,8(r3)
2189: stw r5,12(r3)
2190: stw r6,16(r3)
2191: stw r7,20(r3)
2192: stw r8,24(r3)
2193: stw r9,28(r3)
2194: stw r10,32(r3)
2195: stw r11,36(r3)
2196:
2197: mfibatu r4,0
2198: mfibatl r5,0
2199: mfibatu r6,1
2200: mfibatl r7,1
2201: mfibatu r8,2
2202: mfibatl r9,2
2203: mfibatu r10,3
2204: mfibatl r11,3
2205: stw r4,40(r3)
2206: stw r5,44(r3)
2207: stw r6,48(r3)
2208: stw r7,52(r3)
2209: stw r8,56(r3)
2210: stw r9,60(r3)
2211: stw r10,64(r3)
2212: stw r11,68(r3)
2213:
2214: mfsprg r4,0
2215: mfsprg r5,1
2216: mfsprg r6,2
2217: mfsprg r7,3
2218: stw r4,72(r3)
2219: stw r5,76(r3)
2220: stw r6,80(r3)
2221: stw r7,84(r3)
2222:
2223: mfsdr1 r4
2224: stw r4,88(r3)
2225:
2226: la r4,92(r3)
2227: li r5,0
2228:
2229: stSnsr: mfsrin r6,r5
2230: addis r5,r5,0x1000
2231: stw r6,0(r4)
2232: mr. r5,r5
2233: addi r4,r4,4
2234: bne+ stSnsr
2235:
2236: mtmsr r0
2237: isync
2238: blr
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.