Annotation of XNU/osfmk/ppc/lowmem_vectors.s, revision 1.1

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_COPYRIGHT@
        !            24:  */
        !            25: 
        !            26: /*
        !            27:  * Low-memory exception vector code for PowerPC MACH
        !            28:  *
        !            29:  * These are the only routines that are ever run with
        !            30:  * VM instruction translation switched off.
        !            31:  *
        !            32:  * The PowerPC is quite strange in that rather than having a set
        !            33:  * of exception vectors, the exception handlers are installed
        !            34:  * in well-known addresses in low memory. This code must be loaded
        !            35:  * at ZERO in physical memory. The simplest way of doing this is
        !            36:  * to load the kernel at zero, and specify this as the first file
        !            37:  * on the linker command line.
        !            38:  *
        !            39:  * When this code is loaded into place, it is loaded at virtual
        !            40:  * address KERNELBASE, which is mapped to zero (physical).
        !            41:  *
        !            42:  * This code handles all powerpc exceptions and is always entered
        !            43:  * in supervisor mode with translation off. It saves the minimum
        !            44:  * processor state before switching back on translation and
        !            45:  * jumping to the approprate routine.
        !            46:  *
        !            47:  * Vectors from 0x100 to 0x3fff occupy 0x100 bytes each (64 instructions)
        !            48:  *
        !            49:  * We use some of this space to decide which stack to use, and where to
        !            50:  * save the context etc, before        jumping to a generic handler.
        !            51:  */
        !            52: 
        !            53: #include <assym.s>
        !            54: #include <debug.h>
        !            55: #include <cpus.h>
        !            56: #include <db_machine_commands.h>
        !            57: #include <mach_rt.h>
        !            58:        
        !            59: #include <mach_debug.h>
        !            60: #include <ppc/asm.h>
        !            61: #include <ppc/proc_reg.h>
        !            62: #include <ppc/exception.h>
        !            63: #include <ppc/Performance.h>
        !            64: #include <mach/ppc/vm_param.h>
        !            65: #include <ppc/POWERMAC/mp/MPPlugIn.h>
        !            66: 
        !            67: #define RUPTTRC 0
        !            68: #define CHECKSAVE 0
        !            69: #define PERFTIMES 0
        !            70: #define ESPDEBUG 0
        !            71: 
        !            72: #define        VECTOR_SEGMENT  .section __VECTORS, __interrupts
        !            73: 
        !            74:                        VECTOR_SEGMENT
        !            75: 
        !            76: 
        !            77:                        .globl EXT(ExceptionVectorsStart)
        !            78: 
        !            79: EXT(ExceptionVectorsStart):                                                    /* Used if relocating the exception vectors */
        !            80: baseR:                                                                                         /* Used so we have more readable code */
        !            81: 
        !            82: /* 
        !            83:  * System reset - call debugger
        !            84:  */
        !            85:                        . = 0xf0
        !            86:                        .globl  EXT(ResetHandler)
        !            87: EXT(ResetHandler):
        !            88:                        .long   0x0
        !            89:                        .long   0x0
        !            90:                        .long   0x0
        !            91: 
        !            92:                        . = 0x100
        !            93: .L_handler100:
        !            94:                        mtsprg  2,r13                   /* Save R13 */
        !            95:                        mtsprg  3,r11                   /* Save R11 */
        !            96:                        lwz             r13,lo16(EXT(ResetHandler)-EXT(ExceptionVectorsStart)+RESETHANDLER_TYPE)(br0)   ; Get reset type
        !            97:                        mfcr    r11
        !            98:                        cmpi    cr0,r13,RESET_HANDLER_START
        !            99:                        bne             resetexc
        !           100: 
        !           101:                        li              r11,RESET_HANDLER_NULL
        !           102:                        stw             r11,lo16(EXT(ResetHandler)-EXT(ExceptionVectorsStart)+RESETHANDLER_TYPE)(br0)   ; Clear reset type
        !           103: 
        !           104:                        lwz             r4,lo16(EXT(ResetHandler)-EXT(ExceptionVectorsStart)+RESETHANDLER_CALL)(br0)
        !           105:                        lwz             r3,lo16(EXT(ResetHandler)-EXT(ExceptionVectorsStart)+RESETHANDLER_ARG)(br0)
        !           106:                        mtlr    r4
        !           107:                        blr
        !           108: 
        !           109: resetexc:
        !           110:                        mtcr    r11
        !           111:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           112:                        li              r11,T_RESET                                             /* Set 'rupt code */
        !           113:                        b               .L_exception_entry                              /* Join common... */
        !           114: 
        !           115: /*
        !           116:  *                     This is the data used by the exception trace code
        !           117:  */
        !           118: 
        !           119:                        . = 0x180
        !           120: .L_TraceData:
        !           121: 
        !           122:                        .globl traceMask
        !           123: traceMask:                                                                     /* Allowable trace types indexed by  vector >> 8 */
        !           124: #if DEBUG
        !           125: /*                     .long   0x02000000      */                      /* Only alignment exceptions enabled */
        !           126:                        .long   0xFFFFFFFF                              /* All enabled */
        !           127: /*                     .long   0xFBBFFFFF      */                      /* EXT and DEC disabled */
        !           128: /*                     .long   0xFFBFFFFF      */                      /* DEC disabled */
        !           129: #else
        !           130:                        .long   0x00000000                              ; All disabled on non-debug systems
        !           131: #endif
        !           132: 
        !           133:                        .globl EXT(traceCurr)
        !           134: EXT(traceCurr):        .long   traceTableBeg-EXT(ExceptionVectorsStart)        /* The next trace entry to use */
        !           135: 
        !           136:                        .globl EXT(traceStart)
        !           137: EXT(traceStart):       .long   traceTableBeg-EXT(ExceptionVectorsStart)        /* Start of the trace table */
        !           138: 
        !           139:                        .globl EXT(traceEnd)
        !           140: EXT(traceEnd): 
        !           141:                        .long   traceTableEnd-EXT(ExceptionVectorsStart)        /* End (wrap point) of the trace */
        !           142: 
        !           143:                        .globl traceMsnd
        !           144: 
        !           145: traceMsnd:     .long   0                                                                               /* Saved mask while in debugger */
        !           146: 
        !           147: /*
        !           148:  *                     Machine check (physical bus error) - call debugger
        !           149:  */
        !           150: 
        !           151:                        . = 0x200
        !           152: .L_handler200:
        !           153:                        mtsprg  2,r13                                                   /* Save R13 */
        !           154:                        mtsprg  3,r11                                                   /* Save R11 */
        !           155:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           156:                        li              r11,T_MACHINE_CHECK                             /* Set 'rupt code */
        !           157:                        b               .L_exception_entry                              /* Join common... */
        !           158: 
        !           159: /*
        !           160:  *                     Data access - page fault, invalid memory rights for operation
        !           161:  */
        !           162: 
        !           163:                        . = 0x300
        !           164: .L_handler300:
        !           165:                        mtsprg  2,r13                                                   /* Save R13 */
        !           166:                        mtsprg  3,r11                                                   /* Save R11 */
        !           167:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           168:                        li              r11,T_DATA_ACCESS                               /* Set 'rupt code */
        !           169:                        b               .L_exception_entry                              /* Join common... */
        !           170: 
        !           171: /*
        !           172:  *                     Instruction access - as for data access
        !           173:  */
        !           174: 
        !           175:                        . = 0x400
        !           176: .L_handler400:
        !           177:                        mtsprg  2,r13                                                   /* Save R13 */
        !           178:                        mtsprg  3,r11                                                   /* Save R11 */
        !           179:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           180:                        li              r11,T_INSTRUCTION_ACCESS                /* Set 'rupt code */
        !           181:                        b               .L_exception_entry                              /* Join common... */
        !           182: 
        !           183: /*
        !           184:  *                     External interrupt
        !           185:  */
        !           186: 
        !           187:                        . = 0x500
        !           188: .L_handler500:
        !           189:                        mtsprg  2,r13                                                   /* Save R13 */
        !           190:                        mtsprg  3,r11                                                   /* Save R11 */
        !           191:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           192:                        li              r11,T_INTERRUPT                                 /* Set 'rupt code */
        !           193:                        b               .L_exception_entry                              /* Join common... */
        !           194: 
        !           195: /*
        !           196:  *                     Alignment - many reasons
        !           197:  */
        !           198: 
        !           199:                        . = 0x600
        !           200: .L_handler600:
        !           201:                        mtsprg  2,r13                                                   /* Save R13 */
        !           202:                        mtsprg  3,r11                                                   /* Save R11 */
        !           203:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           204:                        li              r11,T_ALIGNMENT                                 /* Set 'rupt code */
        !           205:                        b               .L_exception_entry                              /* Join common... */
        !           206: 
        !           207: /*
        !           208:  *                     Program - floating point exception, illegal inst, priv inst, user trap
        !           209:  */
        !           210: 
        !           211:                        . = 0x700
        !           212: .L_handler700:
        !           213:                        mtsprg  2,r13                                                   /* Save R13 */
        !           214:                        mtsprg  3,r11                                                   /* Save R11 */
        !           215:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           216:                        li              r11,T_PROGRAM                                   /* Set 'rupt code */
        !           217:                        b               .L_exception_entry                              /* Join common... */
        !           218: 
        !           219: /*
        !           220:  *                     Floating point disabled
        !           221:  */
        !           222: 
        !           223:                        . = 0x800
        !           224: .L_handler800:
        !           225:                        mtsprg  2,r13                                                   /* Save R13 */
        !           226:                        mtsprg  3,r11                                                   /* Save R11 */
        !           227:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           228:                        li              r11,T_FP_UNAVAILABLE                    /* Set 'rupt code */
        !           229:                        b               .L_exception_entry                              /* Join common... */
        !           230: 
        !           231: 
        !           232: /*
        !           233:  *                     Decrementer - DEC register has passed zero.
        !           234:  */
        !           235: 
        !           236:                        . = 0x900
        !           237: .L_handler900:
        !           238:                        mtsprg  2,r13                                                   /* Save R13 */
        !           239:                        mtsprg  3,r11                                                   /* Save R11 */
        !           240:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           241:                        li              r11,T_DECREMENTER                               /* Set 'rupt code */
        !           242:                        b               .L_exception_entry                              /* Join common... */
        !           243: 
        !           244: /*
        !           245:  *                     I/O controller interface error - MACH does not use this
        !           246:  */
        !           247: 
        !           248:                        . = 0xA00
        !           249: .L_handlerA00:
        !           250:                        mtsprg  2,r13                                                   /* Save R13 */
        !           251:                        mtsprg  3,r11                                                   /* Save R11 */
        !           252:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           253:                        li              r11,T_IO_ERROR                                  /* Set 'rupt code */
        !           254:                        b               .L_exception_entry                              /* Join common... */
        !           255: 
        !           256: /*
        !           257:  *                     Reserved
        !           258:  */
        !           259: 
        !           260:                        . = 0xB00
        !           261: .L_handlerB00:
        !           262:                        mtsprg  2,r13                                                   /* Save R13 */
        !           263:                        mtsprg  3,r11                                                   /* Save R11 */
        !           264:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           265:                        li              r11,T_RESERVED                                  /* Set 'rupt code */
        !           266:                        b               .L_exception_entry                              /* Join common... */
        !           267: 
        !           268: /*
        !           269:  *                     System call - generated by the sc instruction
        !           270:  */
        !           271: 
        !           272:                        . = 0xC00
        !           273: .L_handlerC00:
        !           274:                        cmplwi  r0,0x7FF2                                               ; Ultra fast path cthread info call?
        !           275:                        blt+    notufp                                                  ; Not ultra fast...
        !           276:                        cmplwi  r0,0x7FF3                                               ; Ultra fast path fp/vec facility state?
        !           277:                        bgt+    notufp                                                  ; Not ultra fast...
        !           278:                        mfsprg  r3,0                                                    ; Get the per_proc_area
        !           279:                        beq-    isvecfp                                                 ; This is the facility stat call
        !           280:                        lwz             r3,UAW(r3)                                              ; Get the assist word
        !           281:                        rfi                                                                             ; All done, scream back... (no need to restore CR or R11, they are volatile)
        !           282: ;
        !           283: isvecfp:       lwz             r3,spcFlags(r3)                                 ; Get the facility status
        !           284:                        rfi                                                                             ; Bail back...
        !           285: ;
        !           286:                        .align  5
        !           287: notufp:                mtsprg  3,r11                                                   /* Save R11 */
        !           288:                        mtsprg  2,r13                                                   /* Save R13 */
        !           289:                        li              r11,T_SYSTEM_CALL                               /* Set 'rupt code */
        !           290:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           291:                        b               .L_exception_entry                              /* Join common... */
        !           292: 
        !           293: /*
        !           294:  *                     Trace - generated by single stepping
        !           295:  */
        !           296: 
        !           297:                        . = 0xD00
        !           298: .L_handlerD00:
        !           299:                        mtsprg  2,r13                                                   /* Save R13 */
        !           300:                        mtsprg  3,r11                                                   /* Save R11 */
        !           301:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           302:                        li              r11,T_TRACE                                             /* Set 'rupt code */
        !           303:                        b               .L_exception_entry                              /* Join common... */
        !           304: 
        !           305: /*
        !           306:  *                     Floating point assist
        !           307:  */
        !           308: 
        !           309:                        . = 0xe00
        !           310: .L_handlerE00:
        !           311:                        mtsprg  2,r13                                                   /* Save R13 */
        !           312:                        mtsprg  3,r11                                                   /* Save R11 */
        !           313:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           314:                        li              r11,T_FP_ASSIST                                 /* Set 'rupt code */
        !           315:                        b               .L_exception_entry                              /* Join common... */
        !           316: 
        !           317: 
        !           318: /*
        !           319:  *                     Performance monitor interruption
        !           320:  */
        !           321: 
        !           322:                        . = 0xF00
        !           323: PMIhandler:
        !           324:                        mtsprg  2,r13                                                   /* Save R13 */
        !           325:                        mtsprg  3,r11                                                   /* Save R11 */
        !           326:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           327:                        li              r11,T_PERF_MON                                  /* Set 'rupt code */
        !           328:                        b               .L_exception_entry                              /* Join common... */
        !           329:        
        !           330: 
        !           331: /*
        !           332:  *                     VMX exception
        !           333:  */
        !           334: 
        !           335:                        . = 0xF20
        !           336: VMXhandler:
        !           337:                        mtsprg  2,r13                                                   /* Save R13 */
        !           338:                        mtsprg  3,r11                                                   /* Save R11 */
        !           339:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           340:                        li              r11,T_VMX                                               /* Set 'rupt code */
        !           341:                        b               .L_exception_entry                              /* Join common... */
        !           342: 
        !           343:        
        !           344: 
        !           345: /*
        !           346:  * Instruction translation miss - we inline this code.
        !           347:  * Upon entry (done for us by the machine):
        !           348:  *     srr0 :   addr of instruction that missed
        !           349:  *     srr1 :   bits 0-3   = saved CR0
        !           350:  *                    4     = lru way bit
        !           351:  *                    16-31 = saved msr
        !           352:  *     msr[tgpr] = 1  (so gpr0-3 become our temporary variables)
        !           353:  *     imiss:   ea that missed
        !           354:  *     icmp :   the compare value for the va that missed
        !           355:  *     hash1:   pointer to first hash pteg
        !           356:  *     hash2:   pointer to 2nd hash pteg
        !           357:  *
        !           358:  * Register usage:
        !           359:  *     tmp0:    saved counter
        !           360:  *     tmp1:    junk
        !           361:  *     tmp2:    pointer to pteg
        !           362:  *     tmp3:    current compare value
        !           363:  *
        !           364:  * This code is taken from the 603e User's Manual with
        !           365:  * some bugfixes and minor improvements to save bytes and cycles
        !           366:  */
        !           367: 
        !           368:        . = 0x1000
        !           369: .L_handler1000:
        !           370:        mfspr   tmp2,   hash1
        !           371:        mfctr   tmp0                            /* use tmp0 to save ctr */
        !           372:        mfspr   tmp3,   icmp
        !           373: 
        !           374: .L_imiss_find_pte_in_pteg:
        !           375:        li      tmp1,   8                       /* count */
        !           376:        subi    tmp2,   tmp2,   8               /* offset for lwzu */
        !           377:        mtctr   tmp1                            /* count... */
        !           378:        
        !           379: .L_imiss_pteg_loop:
        !           380:        lwz     tmp1,   8(tmp2)                 /* check pte0 for match... */
        !           381:        addi    tmp2,   tmp2,   8
        !           382:        cmpw    cr0,    tmp1,   tmp3
        !           383: #if 0  
        !           384:        bdnzf+  cr0,    .L_imiss_pteg_loop
        !           385: #else  
        !           386:        bc      0,2,    .L_imiss_pteg_loop
        !           387: #endif 
        !           388:        beq+    cr0,    .L_imiss_found_pte
        !           389: 
        !           390:        /* Not found in PTEG, we must scan 2nd then give up */
        !           391: 
        !           392:        andi.   tmp1,   tmp3,   MASK(PTE0_HASH_ID)
        !           393:        bne-    .L_imiss_do_no_hash_exception           /* give up */
        !           394: 
        !           395:        mfspr   tmp2,   hash2
        !           396:        ori     tmp3,   tmp3,   MASK(PTE0_HASH_ID)
        !           397:        b       .L_imiss_find_pte_in_pteg
        !           398: 
        !           399: .L_imiss_found_pte:
        !           400: 
        !           401:        lwz     tmp1,   4(tmp2)                         /* get pte1_t */
        !           402:        andi.   tmp3,   tmp1,   MASK(PTE1_WIMG_GUARD)   /* Fault? */
        !           403:        bne-    .L_imiss_do_prot_exception              /* Guarded - illegal */
        !           404: 
        !           405:        /* Ok, we've found what we need to, restore and rfi! */
        !           406: 
        !           407:        mtctr   tmp0                                    /* restore ctr */
        !           408:        mfsrr1  tmp3
        !           409:        mfspr   tmp0,   imiss
        !           410:        mtcrf   0x80,   tmp3                            /* Restore CR0 */
        !           411:        mtspr   rpa,    tmp1                            /* set the pte */
        !           412:        ori     tmp1,   tmp1,   MASK(PTE1_REFERENCED)   /* set referenced */
        !           413:        tlbli   tmp0
        !           414:        sth     tmp1,   6(tmp2)
        !           415:        rfi
        !           416:        
        !           417: .L_imiss_do_prot_exception:
        !           418:        /* set up srr1 to indicate protection exception... */
        !           419:        mfsrr1  tmp3
        !           420:        andi.   tmp2,   tmp3,   0xffff
        !           421:        addis   tmp2,   tmp2,   MASK(SRR1_TRANS_PROT) >> 16
        !           422:        b       .L_imiss_do_exception
        !           423:        
        !           424: .L_imiss_do_no_hash_exception:
        !           425:        /* clean up registers for protection exception... */
        !           426:        mfsrr1  tmp3
        !           427:        andi.   tmp2,   tmp3,   0xffff
        !           428:        addis   tmp2,   tmp2,   MASK(SRR1_TRANS_HASH) >> 16
        !           429:        
        !           430:        /* And the entry into the usual instruction fault handler ... */
        !           431: .L_imiss_do_exception:
        !           432: 
        !           433:        mtctr   tmp0                                    /* Restore ctr */
        !           434:        mtsrr1  tmp2                                    /* Set up srr1 */
        !           435:        mfmsr   tmp0                                    
        !           436:        xoris   tmp0,   tmp0,   MASK(MSR_TGPR)>>16      /* no TGPR */
        !           437:        mtcrf   0x80,   tmp3                            /* Restore CR0 */
        !           438:        mtmsr   tmp0                                    /* reset MSR[TGPR] */
        !           439:        b       .L_handler400                           /* Instr Access */
        !           440:        
        !           441: /*
        !           442:  * Data load translation miss
        !           443:  *
        !           444:  * Upon entry (done for us by the machine):
        !           445:  *     srr0 :   addr of instruction that missed
        !           446:  *     srr1 :   bits 0-3   = saved CR0
        !           447:  *                    4     = lru way bit
        !           448:  *                    5     = 1 if store
        !           449:  *                    16-31 = saved msr
        !           450:  *     msr[tgpr] = 1  (so gpr0-3 become our temporary variables)
        !           451:  *     dmiss:   ea that missed
        !           452:  *     dcmp :   the compare value for the va that missed
        !           453:  *     hash1:   pointer to first hash pteg
        !           454:  *     hash2:   pointer to 2nd hash pteg
        !           455:  *
        !           456:  * Register usage:
        !           457:  *     tmp0:    saved counter
        !           458:  *     tmp1:    junk
        !           459:  *     tmp2:    pointer to pteg
        !           460:  *     tmp3:    current compare value
        !           461:  *
        !           462:  * This code is taken from the 603e User's Manual with
        !           463:  * some bugfixes and minor improvements to save bytes and cycles
        !           464:  */
        !           465: 
        !           466:        . = 0x1100
        !           467: .L_handler1100:
        !           468:        mfspr   tmp2,   hash1
        !           469:        mfctr   tmp0                            /* use tmp0 to save ctr */
        !           470:        mfspr   tmp3,   dcmp
        !           471: 
        !           472: .L_dlmiss_find_pte_in_pteg:
        !           473:        li      tmp1,   8                       /* count */
        !           474:        subi    tmp2,   tmp2,   8               /* offset for lwzu */
        !           475:        mtctr   tmp1                            /* count... */
        !           476:        
        !           477: .L_dlmiss_pteg_loop:
        !           478:        lwz     tmp1,   8(tmp2)                 /* check pte0 for match... */
        !           479:        addi    tmp2,   tmp2,   8
        !           480:        cmpw    cr0,    tmp1,   tmp3
        !           481: #if 0 /* How to write this correctly? */       
        !           482:        bdnzf+  cr0,    .L_dlmiss_pteg_loop
        !           483: #else  
        !           484:        bc      0,2,    .L_dlmiss_pteg_loop
        !           485: #endif 
        !           486:        beq+    cr0,    .L_dmiss_found_pte
        !           487: 
        !           488:        /* Not found in PTEG, we must scan 2nd then give up */
        !           489: 
        !           490:        andi.   tmp1,   tmp3,   MASK(PTE0_HASH_ID)      /* already at 2nd? */
        !           491:        bne-    .L_dmiss_do_no_hash_exception           /* give up */
        !           492: 
        !           493:        mfspr   tmp2,   hash2
        !           494:        ori     tmp3,   tmp3,   MASK(PTE0_HASH_ID)
        !           495:        b       .L_dlmiss_find_pte_in_pteg
        !           496: 
        !           497: .L_dmiss_found_pte:
        !           498: 
        !           499:        lwz     tmp1,   4(tmp2)                         /* get pte1_t */
        !           500: 
        !           501:        /* Ok, we've found what we need to, restore and rfi! */
        !           502: 
        !           503:        mtctr   tmp0                                    /* restore ctr */
        !           504:        mfsrr1  tmp3
        !           505:        mfspr   tmp0,   dmiss
        !           506:        mtcrf   0x80,   tmp3                            /* Restore CR0 */
        !           507:        mtspr   rpa,    tmp1                            /* set the pte */
        !           508:        ori     tmp1,   tmp1,   MASK(PTE1_REFERENCED)   /* set referenced */
        !           509:        tlbld   tmp0                                    /* load up tlb */
        !           510:        sth     tmp1,   6(tmp2)                         /* sth is faster? */
        !           511:        rfi
        !           512:        
        !           513:        /* This code is shared with data store translation miss */
        !           514:        
        !           515: .L_dmiss_do_no_hash_exception:
        !           516:        /* clean up registers for protection exception... */
        !           517:        mfsrr1  tmp3
        !           518:        /* prepare to set DSISR_WRITE_BIT correctly from srr1 info */
        !           519:        rlwinm  tmp1,   tmp3,   9,      6,      6
        !           520:        addis   tmp1,   tmp1,   MASK(DSISR_HASH) >> 16
        !           521: 
        !           522:        /* And the entry into the usual data fault handler ... */
        !           523: 
        !           524:        mtctr   tmp0                                    /* Restore ctr */
        !           525:        andi.   tmp2,   tmp3,   0xffff                  /* Clean up srr1 */
        !           526:        mtsrr1  tmp2                                    /* Set srr1 */
        !           527:        mtdsisr tmp1
        !           528:        mfspr   tmp2,   dmiss
        !           529:        mtdar   tmp2
        !           530:        mfmsr   tmp0
        !           531:        xoris   tmp0,   tmp0,   MASK(MSR_TGPR)>>16      /* no TGPR */
        !           532:        mtcrf   0x80,   tmp3                            /* Restore CR0 */
        !           533:        sync                                            /* Needed on some */
        !           534:        mtmsr   tmp0                                    /* reset MSR[TGPR] */
        !           535:        b       .L_handler300                           /* Data Access */
        !           536:        
        !           537: /*
        !           538:  * Data store translation miss (similar to data load)
        !           539:  *
        !           540:  * Upon entry (done for us by the machine):
        !           541:  *     srr0 :   addr of instruction that missed
        !           542:  *     srr1 :   bits 0-3   = saved CR0
        !           543:  *                    4     = lru way bit
        !           544:  *                    5     = 1 if store
        !           545:  *                    16-31 = saved msr
        !           546:  *     msr[tgpr] = 1  (so gpr0-3 become our temporary variables)
        !           547:  *     dmiss:   ea that missed
        !           548:  *     dcmp :   the compare value for the va that missed
        !           549:  *     hash1:   pointer to first hash pteg
        !           550:  *     hash2:   pointer to 2nd hash pteg
        !           551:  *
        !           552:  * Register usage:
        !           553:  *     tmp0:    saved counter
        !           554:  *     tmp1:    junk
        !           555:  *     tmp2:    pointer to pteg
        !           556:  *     tmp3:    current compare value
        !           557:  *
        !           558:  * This code is taken from the 603e User's Manual with
        !           559:  * some bugfixes and minor improvements to save bytes and cycles
        !           560:  */
        !           561: 
        !           562:        . = 0x1200
        !           563: .L_handler1200:
        !           564:        mfspr   tmp2,   hash1
        !           565:        mfctr   tmp0                            /* use tmp0 to save ctr */
        !           566:        mfspr   tmp3,   dcmp
        !           567: 
        !           568: .L_dsmiss_find_pte_in_pteg:
        !           569:        li      tmp1,   8                       /* count */
        !           570:        subi    tmp2,   tmp2,   8               /* offset for lwzu */
        !           571:        mtctr   tmp1                            /* count... */
        !           572:        
        !           573: .L_dsmiss_pteg_loop:
        !           574:        lwz     tmp1,   8(tmp2)                 /* check pte0 for match... */
        !           575:        addi    tmp2,   tmp2,   8
        !           576: 
        !           577:                cmpw    cr0,    tmp1,   tmp3
        !           578: #if 0 /* I don't know how to write this properly */    
        !           579:        bdnzf+  cr0,    .L_dsmiss_pteg_loop
        !           580: #else  
        !           581:        bc      0,2,    .L_dsmiss_pteg_loop
        !           582: #endif 
        !           583:        beq+    cr0,    .L_dsmiss_found_pte
        !           584: 
        !           585:        /* Not found in PTEG, we must scan 2nd then give up */
        !           586: 
        !           587:        andi.   tmp1,   tmp3,   MASK(PTE0_HASH_ID)      /* already at 2nd? */
        !           588:        bne-    .L_dmiss_do_no_hash_exception           /* give up */
        !           589: 
        !           590:        mfspr   tmp2,   hash2
        !           591:        ori     tmp3,   tmp3,   MASK(PTE0_HASH_ID)
        !           592:        b       .L_dsmiss_find_pte_in_pteg
        !           593: 
        !           594: .L_dsmiss_found_pte:
        !           595: 
        !           596:        lwz     tmp1,   4(tmp2)                         /* get pte1_t */
        !           597:        andi.   tmp3,   tmp1,   MASK(PTE1_CHANGED)      /* unchanged, check? */
        !           598:        beq-    .L_dsmiss_check_prot                    /* yes, check prot */
        !           599: 
        !           600: .L_dsmiss_resolved:
        !           601:        /* Ok, we've found what we need to, restore and rfi! */
        !           602: 
        !           603:        mtctr   tmp0                                    /* restore ctr */
        !           604:        mfsrr1  tmp3
        !           605:        mfspr   tmp0,   dmiss
        !           606:        mtcrf   0x80,   tmp3                            /* Restore CR0 */
        !           607:        mtspr   rpa,    tmp1                            /* set the pte */
        !           608:        tlbld   tmp0                                    /* load up tlb */
        !           609:        rfi
        !           610:        
        !           611: .L_dsmiss_check_prot:
        !           612:        /* PTE is unchanged, we must check that we can write */
        !           613:        rlwinm. tmp3,   tmp1,   30,     0,      1       /* check PP[1] */
        !           614:        bge-    .L_dsmiss_check_prot_user_kern
        !           615:        andi.   tmp3,   tmp1,   1                       /* check PP[0] */
        !           616:        beq+    .L_dsmiss_check_prot_ok
        !           617:        
        !           618: .L_dmiss_do_prot_exception:
        !           619:        /* clean up registers for protection exception... */
        !           620:        mfsrr1  tmp3
        !           621:        /* prepare to set DSISR_WRITE_BIT correctly from srr1 info */
        !           622:        rlwinm  tmp1,   tmp3,   9,      6,      6
        !           623:        addis   tmp1,   tmp1,   MASK(DSISR_PROT) >> 16
        !           624: 
        !           625:        /* And the entry into the usual data fault handler ... */
        !           626: 
        !           627:        mtctr   tmp0                                    /* Restore ctr */
        !           628:        andi.   tmp2,   tmp3,   0xffff                  /* Clean up srr1 */
        !           629:        mtsrr1  tmp2                                    /* Set srr1 */
        !           630:        mtdsisr tmp1
        !           631:        mfspr   tmp2,   dmiss
        !           632:        mtdar   tmp2
        !           633:        mfmsr   tmp0
        !           634:        xoris   tmp0,   tmp0,   MASK(MSR_TGPR)>>16      /* no TGPR */
        !           635:        mtcrf   0x80,   tmp3                            /* Restore CR0 */
        !           636:        sync                                            /* Needed on some */
        !           637:        mtmsr   tmp0                                    /* reset MSR[TGPR] */
        !           638:        b       .L_handler300                           /* Data Access */
        !           639:        
        !           640: /* NB - if we knew we were on a 603e we could test just the MSR_KEY bit */
        !           641: .L_dsmiss_check_prot_user_kern:
        !           642:        mfsrr1  tmp3
        !           643:        andi.   tmp3,   tmp3,   MASK(MSR_PR)
        !           644:        beq+    .L_dsmiss_check_prot_kern
        !           645:        mfspr   tmp3,   dmiss                           /* check user privs */
        !           646:        mfsrin  tmp3,   tmp3                            /* get excepting SR */
        !           647:        andis.  tmp3,   tmp3,   0x2000                  /* Test SR ku bit */
        !           648:        beq+    .L_dsmiss_check_prot_ok
        !           649:        b       .L_dmiss_do_prot_exception
        !           650: 
        !           651: .L_dsmiss_check_prot_kern:
        !           652:        mfspr   tmp3,   dmiss                           /* check kern privs */
        !           653:        mfsrin  tmp3,   tmp3
        !           654:        andis.  tmp3,   tmp3,   0x4000                  /* Test SR Ks bit */
        !           655:        bne-    .L_dmiss_do_prot_exception
        !           656: 
        !           657: .L_dsmiss_check_prot_ok:
        !           658:        /* Ok, mark as referenced and changed before resolving the fault */
        !           659:        ori     tmp1,   tmp1,   (MASK(PTE1_REFERENCED)|MASK(PTE1_CHANGED))
        !           660:        sth     tmp1,   6(tmp2)
        !           661:        b       .L_dsmiss_resolved
        !           662:        
        !           663: /*
        !           664:  *                     Instruction address breakpoint
        !           665:  */
        !           666: 
        !           667:                        . = 0x1300
        !           668: .L_handler1300:
        !           669:                        mtsprg  2,r13                                                   /* Save R13 */
        !           670:                        mtsprg  3,r11                                                   /* Save R11 */
        !           671:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           672:                        li              r11,T_INSTRUCTION_BKPT                  /* Set 'rupt code */
        !           673:                        b               .L_exception_entry                              /* Join common... */
        !           674: 
        !           675: /*
        !           676:  *                     System management interrupt
        !           677:  */
        !           678: 
        !           679:                        . = 0x1400
        !           680: .L_handler1400:
        !           681:                        mtsprg  2,r13                                                   /* Save R13 */
        !           682:                        mtsprg  3,r11                                                   /* Save R11 */
        !           683:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           684:                        li              r11,T_SYSTEM_MANAGEMENT                 /* Set 'rupt code */
        !           685:                        b               .L_exception_entry                              /* Join common... */
        !           686: 
        !           687: ;
        !           688: ;                      Altivec Java Mode Assist interrupt
        !           689: ;
        !           690: 
        !           691:                        . = 0x1600
        !           692: .L_handler1600:
        !           693:                        mtsprg  2,r13                                                   /* Save R13 */
        !           694:                        mtsprg  3,r11                                                   /* Save R11 */
        !           695:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           696:                        li              r11,T_ALTIVEC_ASSIST                    /* Set 'rupt code */
        !           697:                        b               .L_exception_entry                              /* Join common... */
        !           698: 
        !           699: /*
        !           700:  * There is now a large gap of reserved traps
        !           701:  */
        !           702: 
        !           703: /*
        !           704:  *                     Run mode/ trace exception - single stepping on 601 processors
        !           705:  */
        !           706: 
        !           707:                        . = 0x2000
        !           708: .L_handler2000:
        !           709:                        mtsprg  2,r13                                                   /* Save R13 */
        !           710:                        mtsprg  3,r11                                                   /* Save R11 */
        !           711:                        mfsprg  r13,1                                                   /* Get the exception save area */
        !           712:                        li              r11,T_RUNMODE_TRACE                             /* Set 'rupt code */
        !           713:                        b               .L_exception_entry                              /* Join common... */
        !           714: 
        !           715: /*
        !           716:  * .L_exception_entry(type)
        !           717:  *
        !           718:  * This is the common exception handling routine called by any
        !           719:  * type of system exception.
        !           720:  *
        !           721:  * ENTRY:      via a system exception handler, thus interrupts off, VM off.
        !           722:  *              r3 has been saved in sprg3 and now contains a number
        !           723:  *              representing the exception's origins
        !           724:  *
        !           725:  */
        !           726:        
        !           727:                        .data
        !           728:                        .align  ALIGN
        !           729: #ifdef __ELF__
        !           730:                        .type   EXT(exception_entry),@object
        !           731:                        .size   EXT(exception_entry), 4
        !           732: #endif
        !           733:                        .globl  EXT(exception_entry)
        !           734: EXT(exception_entry):
        !           735:                        .long   .L_exception_entry-EXT(ExceptionVectorsStart) /* phys addr of fn */
        !           736:                                
        !           737:                        VECTOR_SEGMENT
        !           738:                        .align  2
        !           739: 
        !           740: .L_exception_entry:
        !           741:                        
        !           742: /*
        !           743:  *
        !           744:  *     Here we will save off a mess of registers, the special ones and R0-R12.  We use the DCBZ
        !           745:  *     instruction to clear and allcoate a line in the cache.  This way we won't take any cache
        !           746:  *     misses, so these stores won't take all that long.
        !           747:  *
        !           748:  *
        !           749:  */
        !           750: 
        !           751:                        dcbz    0,r13                                                   /* Allocate the first line of the savearea in the cache */                      
        !           752:                        
        !           753:                        stw             r1,saver1(r13)                                  /* Save this one */
        !           754:                        li              r1,32                                                   /* Point to the second line */
        !           755:                        stw             r0,saver0(r13)                                  /* Save this one */
        !           756:                        dcbz    r1,r13                                                  /* Reserve our line in cache */
        !           757:                        
        !           758: #if PERFTIMES && DEBUG
        !           759:                        mftb    r1                                                              ; Get the time of interruption
        !           760:                        stw             r1,0x17C(br0)                                   ; Save the time of interruption
        !           761: #endif
        !           762:                        
        !           763:                        stw             r2,saver2(r13)                                  /* Save this one */
        !           764:                        stw             r3,saver3(r13)                                  /* Save this one */
        !           765:                        stw             r6,saver6(r13)                                  /* Save this one */
        !           766:                        stw             r4,saver4(r13)                                  /* Save this one */
        !           767: 
        !           768:                        stw             r8,saver8(r13)                                  /* Save this one */
        !           769:                        mfsrr0  r6                                                              /* Get the interruption SRR0 */
        !           770:                        stw             r7,saver7(r13)                                  /* Save this one */
        !           771:                        mfsrr1  r7                                                              /* Get the interrupt SRR1 */
        !           772:                        stw             r6,savesrr0(r13)                                /* Save the SRR0 */
        !           773:                        stw             r5,saver5(r13)                                  /* Save this one */
        !           774:                        mfsprg  r6,2                                                    /* Get interrupt time R13 */
        !           775:                        stw             r7,savesrr1(r13)                                /* Save SRR1 */
        !           776:                        mfsprg  r8,3                                                    /* Get 'rupt time R11 */
        !           777:                        stw             r6,saver13(r13)                                 /* Save 'rupt R1 */
        !           778:                        la              r6,saver14(r13)                                 /* Point to the next cache line */
        !           779:                        stw             r8,saver11(r13)                                 /* Save 'rupt time R11 */
        !           780: 
        !           781:                        dcbz    0,r6                                                    /* Allocate in cache */
        !           782:                        
        !           783:                        stw             r9,saver9(r13)                                  /* Save this one */
        !           784:                        mfcr    r7                                                              /* Get the CR */
        !           785: #if 0
        !           786:                        cmplwi  r13,0x1000                                              ; (TEST/DEBUG)
        !           787:                        bgt+    notpage0yy                                              ; (TEST/DEBUG)
        !           788:                        li              r9,1                                                    ; (TEST/DEBUG)
        !           789:                        lwz             r9,0(br0)                                               ; (TEST/DEBUG)
        !           790:                        dcbst   br0,r9                                                  ; (TEST/DEBUG)
        !           791: notpage0aa:    b               notpage0aa                                              ; (TEST/DEBUG)
        !           792: 
        !           793: notpage0yy:    lwz             r9,0(br0)                                               ; (TEST/DEBUG)
        !           794:                        mr.             r9,r9                                                   ; (TEST/DEBUG)
        !           795: notpage0bb:    bne-    notpage0bb                                              ; (TEST/DEBUG)
        !           796: #endif
        !           797: 
        !           798:                        la              r9,saver30(r13)                                 /* Point to the trailing end */
        !           799:                        stw             r10,saver10(r13)                                /* Save this one */
        !           800:                        mflr    r8                                                              /* Get the LR */
        !           801:                        stw             r12,saver12(r13)                                /* Save this one */
        !           802:                        
        !           803:                        dcbz    0,r9                                                    /* Allocate the last in the area */
        !           804:                        
        !           805:                        stw             r14,saver14(r13)                                /* Save this one */
        !           806:                        la              r10,saver22(r13)                                /* Point to the next block to save into */
        !           807:                        stw             r15,saver15(r13)                                /* Save this one */
        !           808:                        stw             r7,savecr(r13)                                  /* Save 'rupt CR */
        !           809:                        mfctr   r6                                                              /* Get the CTR */
        !           810:                        stw             r16,saver16(r13)                                /* Save this one */
        !           811:                        stw             r8,savelr(r13)                                  /* Save 'rupt LR */
        !           812:                
        !           813:                        dcbz    0,r10                                                   /* Allocate next save area line */
        !           814:                        
        !           815:                        stw             r17,saver17(r13)                                /* Save this one */
        !           816:                        stw             r18,saver18(r13)                                /* Save this one */
        !           817:                        stw             r6,savectr(r13)                                 /* Save 'rupt CTR */
        !           818:                        mfxer   r7                                                              /* Get the XER */
        !           819:                        stw             r19,saver19(r13)                                /* Save this one */
        !           820:                        lis             r12,HIGH_ADDR(KERNEL_SEG_REG0_VALUE)    /* Get the high half of the kernel SR0 value */
        !           821:                        mfdar   r6                                                              /* Get the 'rupt DAR */
        !           822:                        stw             r20,saver20(r13)                                /* Save this one */
        !           823: #if 0
        !           824:                        mfsr    r10,sr0                                                 ; (TEST/DEBUG)
        !           825:                        mfsr    r20,sr1                                                 ; (TEST/DEBUG)
        !           826:                        stw             r10,savesr0(r13)                                ; (TEST/DEBUG)
        !           827:                        mfsr    r10,sr2                                                 ; (TEST/DEBUG)
        !           828:                        mfsr    r19,sr3                                                 ; (TEST/DEBUG)
        !           829:                        stw             r20,savesr1(r13)                                ; (TEST/DEBUG)
        !           830:                        mfsr    r14,sr4                                                 ; (TEST/DEBUG)
        !           831:                        mfsr    r15,sr5                                                 ; (TEST/DEBUG)
        !           832:                        stw             r10,savesr2(r13)                                ; (TEST/DEBUG)
        !           833:                        mfsr    r16,sr6                                                 ; (TEST/DEBUG)
        !           834:                        mfsr    r17,sr7                                                 ; (TEST/DEBUG)
        !           835:                        stw             r19,savesr3(r13)                                ; (TEST/DEBUG)                  
        !           836:                        mfsr    r10,sr8                                                 ; (TEST/DEBUG)
        !           837:                        mfsr    r20,sr9                                                 ; (TEST/DEBUG)
        !           838:                        stw             r14,savesr4(r13)                                ; (TEST/DEBUG)
        !           839:                        mfsr    r14,sr10                                                ; (TEST/DEBUG)
        !           840:                        mfsr    r19,sr11                                                ; (TEST/DEBUG)
        !           841:                        stw             r15,savesr5(r13)                                ; (TEST/DEBUG)
        !           842:                        mfsr    r15,sr13                                                ; (TEST/DEBUG)
        !           843:                        stw             r16,savesr6(r13)                                ; (TEST/DEBUG)
        !           844:                        mfsr    r16,sr14                                                ; (TEST/DEBUG)
        !           845:                        stw             r17,savesr7(r13)                                ; (TEST/DEBUG)
        !           846:                        mfsr    r17,sr15                                                ; (TEST/DEBUG)
        !           847:                        
        !           848:                        stw             r10,savesr8(r13)                                ; (TEST/DEBUG)
        !           849:                        stw             r20,savesr9(r13)                                ; (TEST/DEBUG)
        !           850:                        stw             r14,savesr10(r13)                               ; (TEST/DEBUG)
        !           851:                        stw             r19,savesr11(r13)                               ; (TEST/DEBUG)
        !           852:                        stw             r15,savesr13(r13)                               ; (TEST/DEBUG)
        !           853:                        stw             r16,savesr14(r13)                               ; (TEST/DEBUG)
        !           854:                        stw             r17,savesr15(r13)                               ; (TEST/DEBUG)
        !           855: #endif
        !           856: 
        !           857:                        mtsr    sr0,r12                                                 /* Set the kernel SR0 */
        !           858:                        stw             r21,saver21(r13)                                /* Save this one */
        !           859:                        addis   r12,r12,0x0010                                  ; Point to the second segment of kernel
        !           860:                        stw             r7,savexer(r13)                                 /* Save the 'rupt XER */
        !           861:                        mtsr    sr1,r12                                                 /* Set the kernel SR1 */
        !           862:                        stw             r30,saver30(r13)                                /* Save this one */
        !           863:                        addis   r12,r12,0x0010                                  ; Point to the third segment of kernel
        !           864:                        stw             r31,saver31(r13)                                /* Save this one */
        !           865:                        mtsr    sr2,r12                                                 /* Set the kernel SR2 */
        !           866:                        stw             r22,saver22(r13)                                /* Save this one */
        !           867:                        addis   r12,r12,0x0010                                  ; Point to the third segment of kernel
        !           868:                        la              r10,savedar(r13)                                /* Point to exception info block */
        !           869:                        stw             r23,saver23(r13)                                /* Save this one */
        !           870:                        mtsr    sr3,r12                                                 /* Set the kernel SR3 */
        !           871:                        stw             r24,saver24(r13)                                /* Save this one */
        !           872:                        stw             r25,saver25(r13)                                /* Save this one */
        !           873:                        mfdsisr r7                                                              /* Get the 'rupt DSISR */
        !           874:                        stw             r26,saver26(r13)                                /* Save this one */
        !           875:                        
        !           876:                        dcbz    0,r10                                                   /* Allocate exception info line */
        !           877:                
        !           878:                        stw             r27,saver27(r13)                                /* Save this one */
        !           879:                        stw             r28,saver28(r13)                                /* Save this one */
        !           880:                        stw             r29,saver29(r13)                                /* Save this one */
        !           881:                        mfsr    r14,sr14                                                ; Get the copyin/out segment register
        !           882:                        stw             r6,savedar(r13)                                 /* Save the 'rupt DAR */
        !           883:                        stw             r7,savedsisr(r13)                               /* Save the 'rupt code DSISR */
        !           884:                        stw             r11,saveexception(r13)                  /* Save the exception code */
        !           885:                        stw             r14,savesr14(r13)                               ; Save copyin/copyout
        !           886: 
        !           887:                        lis             r8,HIGH_ADDR(EXT(saveanchor))   /* Get the high part of the anchor */
        !           888:                        mfpvr   r20                                                             /* Get the PVR */
        !           889:                        ori             r8,r8,LOW_ADDR(EXT(saveanchor)) /* Bottom half of the anchor */
        !           890:                        li              r21,0x3612                                              /* Mask of processors with a PIR */
        !           891:                        rlwinm  r20,r20,16,16,31                                /* Isolate the CPU type */
        !           892:                        srw             r21,r21,r20                                             /* Isolate the PIR valid bit */
        !           893:                        cmplwi  cr1,r20,PROCESSOR_VERSION_Max   ; Do we have Altivec?
        !           894:                        rlwinm  r21,r21,0,31,31                                 /* Isolate the PIR valid */
        !           895:                        
        !           896:                        li              r19,0                                                   ; Assume no Altivec
        !           897:                        blt             cr1,noavec                                              ; No possible AltiVec here...
        !           898:                        mfspr   r19,vrsave                                              ; Get the VRSAVE register
        !           899: 
        !           900: noavec:                cmplwi  cr6,r21,1                                               /* Check if PIR is valid */
        !           901:                        stw             r19,savevrsave(r13)                             ; Save the vector register usage flags
        !           902: 
        !           903: #if 0
        !           904:                        lwz             r14,savesrr0(r13)                               /* (TEST/DEBUG) */
        !           905:                        cmplw   cr7,r5,r5                                               /* (TEST/DEBUG) */
        !           906:                        rlwinm. r14,r14,0,0,15                                  /* (TEST/DEBUG) */
        !           907:                        cmplwi  cr2,r11,T_INTERRUPT                             /* (TEST/DEBUG) */
        !           908:                        beq-    noeattrace2                                             /* (TEST/DEBUG) */
        !           909:                        cmplwi  r11,T_SYSTEM_CALL                               /* (TEST/DEBUG) */
        !           910:                        rlwinm  r14,r0,1,0,31                                   /* (TEST/DEBUG) */
        !           911:                        beq             cr2,eatatjoes                                   /* (TEST/DEBUG) */
        !           912:                        bne+    noeattrace2                                             /* (TEST/DEBUG) */
        !           913:                        cmplwi  r14,0x001B                                              /* (TEST/DEBUG) */
        !           914:                        bne+    noeattrace2                                             /* (TEST/DEBUG) */
        !           915: 
        !           916: eatatjoes:     cmplwi  cr7,r13,0                                               /* (TEST/DEBUG) */
        !           917: 
        !           918: noeattrace2:
        !           919: #else
        !           920:                        cmplw   cr7,r13,r13                                             /* (TEST/DEBUG) */
        !           921: #endif
        !           922: #if RUPTTRC
        !           923:                        lwz             r9,0(br0)                                               /* (TEST/DEBUG) */
        !           924:                        lis             r14,0x7FFF                                              /* (TEST/DEBUG) */
        !           925:                        mr.             r9,r9                                                   /* (TEST/DEBUG) */
        !           926:                        beq+    nono1                                                   /* (TEST/DEBUG) */
        !           927:                        bne             cr7,nono1                                               /* (TEST/DEBUG) */
        !           928:                        
        !           929:                        mfdec   r9                                                              /* (TEST/DEBUG) */
        !           930:                        or              r14,r14,r9                                              /* (TEST/DEBUG) */
        !           931:                        mtdec   r14                                                             /* (TEST/DEBUG) */
        !           932:                        li              r14,0x20                                                /* (TEST/DEBUG) */
        !           933:                
        !           934:                        lwarx   r15,0,r14                                               ; ?
        !           935: 
        !           936: mpwait0:       lwarx   r15,0,r14                                               /* (TEST/DEBUG) */
        !           937:                        mr.             r15,r15                                                 /* (TEST/DEBUG) */
        !           938:                        bne-    mpwait0                                                 /* (TEST/DEBUG) */
        !           939:                        stwcx.  r14,0,r14                                               /* (TEST/DEBUG) */
        !           940:                        bne-    mpwait0                                                 /* (TEST/DEBUG) */
        !           941: 
        !           942:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !           943:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !           944:                        bne             cr6,nopir0                                              /* (TEST/DEBUG) */
        !           945:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !           946:                        b               gotpir0                                                 /* (TEST/DEBUG) */
        !           947: nopir0:                li              r4,0                                                    /* (TEST/DEBUG) */
        !           948: gotpir0:                                                                                       /* (TEST/DEBUG) */
        !           949:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !           950:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !           951:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !           952:                        rlwimi  r4,r11,30,8,31                                  /* (TEST/DEBUG) */
        !           953:                        mfsrr0  r5                                                              /* (TEST/DEBUG) */
        !           954:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !           955:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !           956:                        ori             r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !           957:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !           958:                        blrl                                                                    /* (TEST/DEBUG) */
        !           959:                        
        !           960:                        bne             cr6,nopir1                                              /* (TEST/DEBUG) */
        !           961:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !           962:                        b               gotpir1                                                 /* (TEST/DEBUG) */
        !           963: nopir1:                li              r4,0                                                    /* (TEST/DEBUG) */
        !           964: gotpir1:                                                                                       /* (TEST/DEBUG) */
        !           965:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !           966:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !           967:                        lwz             r5,savelr(r13)                                  /* (TEST/DEBUG) */
        !           968:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !           969:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !           970:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !           971:                        ori             r4,r4,0x3130                                    /* (TEST/DEBUG) */
        !           972:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !           973:                        blrl                                                                    /* (TEST/DEBUG) */
        !           974:                
        !           975:                        bne             cr6,nopir2                                              /* (TEST/DEBUG) */
        !           976:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !           977:                        b               gotpir2                                                 /* (TEST/DEBUG) */
        !           978: nopir2:                li              r4,0                                                    /* (TEST/DEBUG) */
        !           979: gotpir2:                                                                                       /* (TEST/DEBUG) */
        !           980:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !           981:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !           982:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !           983:                        mr              r5,r13                                                  /* (TEST/DEBUG) */
        !           984:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !           985:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !           986:                        ori             r4,r4,0x3131                                    /* (TEST/DEBUG) */
        !           987:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !           988:                        blrl                                                                    /* (TEST/DEBUG) */
        !           989:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !           990:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !           991:                        
        !           992:                        li              r15,0                                                   /* (TEST/DEBUG) */
        !           993:                        stw             r15,0x20(br0)                                   /* (TEST/DEBUG) */
        !           994:                        mtdec   r9                                                              /* (TEST/DEBUG) */
        !           995: nono1:
        !           996: #endif
        !           997: 
        !           998: 
        !           999: /* 
        !          1000:  *                     Everything is saved at this point, except for FPRs, and VMX registers
        !          1001:  *
        !          1002:  *                     Time for a new save area.  Allocate the trace table entry now also
        !          1003:  *                     Note that we haven't touched R0-R5 yet.  Except for R1, that's in the save
        !          1004:  */
        !          1005: 
        !          1006: #if 0
        !          1007:                        mfsrr1  r20                                                             ; (TEST/DEBUG)
        !          1008:                        mfsrr0  r7                                                              ; (TEST/DEBUG)
        !          1009:                        lis             r9,0x8000                                               ; (TEST/DEBUG) 
        !          1010:                        mfmsr   r25                                                             ; (TEST/DEBUG)
        !          1011:                        ori             r15,r25,0x10                                    ; (TEST/DEBUG)
        !          1012:                        mtmsr   r15                                                             ; (TEST/DEBUG)
        !          1013:                        isync                                                                   ; (TEST/DEBUG)
        !          1014:                        ori             r9,r9,lo16(0x870C)                              ; (TEST/DEBUG) 
        !          1015:                        stw             r11,0(r9)                                               ; (TEST/DEBUG)
        !          1016:                        stw             r7,0(r9)                                                ; (TEST/DEBUG)
        !          1017:                        mtmsr   r25                                                             ; (TEST/DEBUG)
        !          1018:                        isync                                                                   ; (TEST/DEBUG)
        !          1019:                        mtsrr1  r20                                                             ; (TEST/DEBUG)
        !          1020:                        mtsrr0  r7                                                              ; (TEST/DEBUG)
        !          1021: #endif
        !          1022: 
        !          1023: 
        !          1024:                        lwarx   r9,0,r8                                                 ; ?
        !          1025: 
        !          1026: lllck:         lwarx   r9,0,r8                                                 /* Grab the lock value */
        !          1027:                        li              r7,1                                                    /* Use part of the delay time */
        !          1028:                        mr.             r9,r9                                                   /* Is it locked? */
        !          1029:                        bne-    lllcks                                                  /* Yeah, wait for it to clear... */
        !          1030:                        stwcx.  r7,0,r8                                                 /* Try to seize that there durn lock */
        !          1031:                        beq+    lllckd                                                  /* Got it... */
        !          1032:                        b               lllck                                                   /* Collision, try again... */
        !          1033:                        
        !          1034: lllcks:                lwz             r9,SVlock(r8)                                   /* Get that lock in here */
        !          1035:                        mr.             r9,r9                                                   /* Is it free yet? */
        !          1036:                        beq+    lllck                                                   /* Yeah, try for it again... */
        !          1037:                        b               lllcks                                                  /* Sniff away... */
        !          1038:                        
        !          1039: lllckd:                isync                                                                   /* Purge any speculative executions here */
        !          1040:                        rlwinm  r7,r11,30,0,31                                  /* Save 'rupt code shifted right 2 */
        !          1041: #if 1
        !          1042:                        lwz             r14,LOW_ADDR(traceMask-EXT(ExceptionVectorsStart))(br0) /* Get the trace mask */
        !          1043: #else
        !          1044:                        li              r14,-1                                                  /* (TEST/DEBUG) */
        !          1045: #endif
        !          1046:                        addi    r7,r7,10                                                /* Adjust for CR5_EQ position */        
        !          1047:                        lwz             r15,SVfree(r8)                                  /* Get the head of the save area list */                        
        !          1048:                        lwz             r25,SVinuse(r8)                                 /* Get the in use count */                      
        !          1049:                        rlwnm   r7,r14,r7,22,22                                 /* Set CR5_EQ bit position to 0 if tracing allowed */
        !          1050:                        lwz             r20,LOW_ADDR(EXT(traceCurr)-EXT(ExceptionVectorsStart))(br0)    /* Pick up the current trace entry */
        !          1051:                        mtcrf   0x04,r7                                                 /* Set CR5 to show trace or not */
        !          1052: 
        !          1053:                        lwz             r14,SACalloc(r15)                               /* Pick up the allocation bits */
        !          1054:                        addi    r25,r25,1                                               /* Bump up the in use count for the new savearea */
        !          1055:                        lwz             r21,LOW_ADDR(EXT(traceEnd)-EXT(ExceptionVectorsStart))(br0)     /* Grab up the end of it all */
        !          1056:                        mr.             r14,r14                                                 /* Can we use the first one? */
        !          1057:                        blt             use1st                                                  /* Yeah... */
        !          1058:                        
        !          1059:                        andis.  r14,r14,0x8000                                  /* Show we used the second and remember if it was the last */
        !          1060:                        addi    r10,r15,0x0800                                  /* Point to the first one */
        !          1061:                        b               gotsave                                                 /* We have the area now... */
        !          1062: 
        !          1063: use1st:                andis.  r14,r14,0x4000                                  /* Mark first gone and remember if empty */
        !          1064:                        mr              r10,r15                                                 /* Set the save area */
        !          1065:                        
        !          1066: gotsave:       stw             r14,SACalloc(r15)                               /* Put back the allocation bits */
        !          1067:                        bne             nodqsave                                                /* There's still an empty slot, don't dequeue... */
        !          1068: 
        !          1069:                        lwz             r16,SACnext(r15)                                /* Get the next in line */
        !          1070:                        stw             r16,SVfree(r8)                                  /* Dequeue our now empty save area block */
        !          1071: 
        !          1072: nodqsave:      addi    r22,r20,LTR_size                                /* Point to the next trace entry */
        !          1073:                        stw             r25,SVinuse(r8)                                 /* Set the in use count */                      
        !          1074:                        li              r17,0                                                   /* Clear this for the lock */
        !          1075:                        cmplw   r22,r21                                                 /* Do we need to wrap the trace table? */
        !          1076:                        stw             r17,SAVprev(r10)                                /* Clear back pointer for the newly allocated guy */
        !          1077:                        mtsprg  1,r10                                                   /* Get set for the next 'rupt */
        !          1078:                        bne+    gotTrcEnt                                               /* We got a trace entry... */
        !          1079:                        
        !          1080:                        lwz             r22,LOW_ADDR(EXT(traceStart)-EXT(ExceptionVectorsStart))(br0)   /* Wrap back to the top */
        !          1081: 
        !          1082: gotTrcEnt:     bne-    cr5,skipTrace1                                  /* Don't want to trace this kind... */
        !          1083:        
        !          1084:                        stw             r22,LOW_ADDR(EXT(traceCurr)-EXT(ExceptionVectorsStart))(br0)    /* Set the next entry for the next guy */
        !          1085:                        
        !          1086: #if ESPDEBUG
        !          1087:                        li              r22,0x180                                               ; (TEST/DEBUG)
        !          1088:                        dcbst   br0,r22                                                 ; (TEST/DEBUG)
        !          1089:                        sync                                                                    ; (TEST/DEBUG)
        !          1090: #endif
        !          1091:                        
        !          1092:                        dcbz    0,r20                                                   /* Allocate cache for the entry */
        !          1093:                        
        !          1094: skipTrace1:    sync                                                                    /* Make sure all stores are done */
        !          1095:                        stw             r17,SVlock(r8)                                  /* Unlock both save and trace areas */
        !          1096: 
        !          1097: #if RUPTTRC
        !          1098:                        lis             r14,0x7FFF                                              /* (TEST/DEBUG) */
        !          1099:                        mfdec   r17                                                             /* (TEST/DEBUG) */
        !          1100:                        or              r14,r14,r17                                             /* (TEST/DEBUG) */
        !          1101:                        mtdec   r14                                                             /* (TEST/DEBUG) */
        !          1102:                        li              r14,0x20                                                /* (TEST/DEBUG) */
        !          1103:                
        !          1104:                        lwarx   r16,0,r14                                               ; ?
        !          1105: 
        !          1106: mpwait1:       lwarx   r16,0,r14                                               /* (TEST/DEBUG) */
        !          1107:                        mr.             r16,r16                                                 /* (TEST/DEBUG) */
        !          1108:                        bne-    mpwait1                                                 /* (TEST/DEBUG) */
        !          1109:                        stwcx.  r14,0,r14                                               /* (TEST/DEBUG) */
        !          1110:                        bne-    mpwait1                                                 /* (TEST/DEBUG) */
        !          1111: 
        !          1112:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1113:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1114:                        bne             cr7,nono2                                               /* (TEST/DEBUG) */
        !          1115:                        lwz             r0,0(br0)                                               /* (TEST/DEBUG) */
        !          1116:                        mr.             r0,r0                                                   /* (TEST/DEBUG) */
        !          1117:                        beq+    nono2                                                   /* (TEST/DEBUG) */
        !          1118:                        bne             cr6,nopir3                                              /* (TEST/DEBUG) */
        !          1119:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          1120:                        b               gotpir3                                                 /* (TEST/DEBUG) */
        !          1121: nopir3:                li              r4,0                                                    /* (TEST/DEBUG) */
        !          1122: gotpir3:                                                                                       /* (TEST/DEBUG) */
        !          1123:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          1124:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          1125:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          1126:                        mr              r5,r10                                                  /* (TEST/DEBUG) */
        !          1127:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          1128:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          1129:                        ori             r4,r4,0x3230                                    /* (TEST/DEBUG) */
        !          1130:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          1131:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1132: nono2:
        !          1133:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1134:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1135:                        li              r16,0                                                   /* (TEST/DEBUG) */
        !          1136:                        stw             r16,0x20(br0)                                   /* (TEST/DEBUG) */
        !          1137:                        mtdec   r17                                                             /* (TEST/DEBUG) */
        !          1138: 
        !          1139: #endif
        !          1140: 
        !          1141:                
        !          1142: 
        !          1143: /*
        !          1144:  *                     At this point, we can take another exception and lose nothing.
        !          1145:  *
        !          1146:  *                     We still have the current savearea pointed to by R13, the next by R10 and
        !          1147:  *                     sprg1.  R20 contains the pointer to a trace entry and CR5_eq says
        !          1148:  *                     to do the trace or not.
        !          1149:  *
        !          1150:  *                     Note that R13 was chosen as the save area pointer because the SIGP,
        !          1151:  *                     firmware, and DSI/ISI handlers aren't supposed to touch anything
        !          1152:  *                     over R12. But, actually, the DSI/ISI stuff does.
        !          1153:  *
        !          1154:  *
        !          1155:  *                     Let's cut that trace entry now.
        !          1156:  */
        !          1157: 
        !          1158:                        bne-    cr5,skipTrace2                                  /* Don't want to trace this kind... */
        !          1159: 
        !          1160:                        li              r14,32                                                  /* Second line of entry */
        !          1161: 
        !          1162: getTB:         mftbu   r16                                                             /* Get the upper timebase */
        !          1163:                        mftb    r17                                                             /* Get the lower timebase */
        !          1164:                        mftbu   r18                                                             /* Get the upper one again  */
        !          1165:                        cmplw   r16,r18                                                 /* Did the top tick? */
        !          1166:                        bne-    getTB                                                   /* Yeah, need to get it again... */
        !          1167:                
        !          1168:                        dcbz    r14,r20                                                 /* Zap the second half */
        !          1169:                        
        !          1170:                        stw             r16,LTR_timeHi(r20)                             /* Set the upper part of TB */
        !          1171:                        bne             cr6,nopir4                                              /* Is there a processor ID number on this guy? */
        !          1172:                        mfspr   r19,pir                                                 /* Get the processor address */
        !          1173:                        b               gotpir4                                                 /* Got it... */
        !          1174: nopir4:                li              r19,0                                                   /* Assume processor 0 for those underprivileged folks */
        !          1175: gotpir4:                                                                                       
        !          1176:                        lwz             r1,saver1(r13)                                  /* Get back interrupt time R1 */
        !          1177:                        stw             r17,LTR_timeLo(r20)                             /* Set the lower part of TB */
        !          1178:                        rlwinm  r19,r19,0,27,31                                 /* Cut the junk */
        !          1179:                        stw             r0,LTR_r0(r20)                                  /* Save off register 0 */                       
        !          1180:                        sth             r19,LTR_cpu(r20)                                /* Stash the cpu address */
        !          1181:                        stw             r1,LTR_r1(r20)                                  /* Save off register 1 */                       
        !          1182:                        stw             r2,LTR_r2(r20)                                  /* Save off register 2 */                       
        !          1183:                        stw             r3,LTR_r3(r20)                                  /* Save off register 3 */       
        !          1184:                        lwz             r16,savecr(r13)                                 /* We don't remember the CR anymore, get it */
        !          1185:                        stw             r4,LTR_r4(r20)                                  /* Save off register 4 */
        !          1186:                        mfsrr0  r17                                                             /* Get this back, it's still good */
        !          1187:                        stw             r5,LTR_r5(r20)                                  /* Save off register 5 */       
        !          1188:                        mfsrr1  r18                                                             /* This is still good in here also */
        !          1189:                        
        !          1190:                        stw             r16,LTR_cr(r20)                                 /* Save the CR (or dec) */
        !          1191:                        stw             r17,LTR_srr0(r20)                               /* Save the SSR0 */
        !          1192:                        stw             r18,LTR_srr1(r20)                               /* Save the SRR1 */
        !          1193:                        mfdar   r17                                                             /* Get this back */
        !          1194: 
        !          1195:                        mflr    r16                                                             /* Get the LR */
        !          1196:                        stw             r17,LTR_dar(r20)                                /* Save the DAR */
        !          1197:                        mfctr   r17                                                             /* Get the CTR */
        !          1198:                        stw             r16,LTR_lr(r20)                                 /* Save the LR */
        !          1199: #if 0
        !          1200:                        lis             r17,HIGH_ADDR(EXT(saveanchor))  ; (TEST/DEBUG)
        !          1201:                        ori             r17,r17,LOW_ADDR(EXT(saveanchor))       ; (TEST/DEBUG)
        !          1202:                        lwz             r16,SVcount(r17)                                ; (TEST/DEBUG)
        !          1203:                        lwz             r17,SVinuse(r17)                                ; (TEST/DEBUG)
        !          1204:                        rlwimi  r17,r16,16,0,15                                 ; (TEST/DEBUG)
        !          1205: #endif
        !          1206:                        stw             r17,LTR_ctr(r20)                                /* Save off the CTR */
        !          1207:                        stw             r13,LTR_save(r20)                               /* Save the savearea */
        !          1208:                        sth             r11,LTR_excpt(r20)                              /* Save the exception type */
        !          1209: #if ESPDEBUG
        !          1210:                        addi    r17,r20,32                                              ; (TEST/DEBUG)
        !          1211:                        dcbst   br0,r20                                                 ; (TEST/DEBUG)
        !          1212:                        dcbst   br0,r17                                                 ; (TEST/DEBUG)
        !          1213:                        sync                                                                    ; (TEST/DEBUG)
        !          1214: #endif
        !          1215: 
        !          1216: /*
        !          1217:  *                     We're done with the trace, except for maybe modifying the exception
        !          1218:  *                     code later on. So, that means that we need to save R20 and CR5, but
        !          1219:  *                     R0 to R5 are clear now.
        !          1220:  *                     
        !          1221:  *                     So, let's finish setting up the kernel registers now.
        !          1222:  */
        !          1223: 
        !          1224: skipTrace2:    
        !          1225: 
        !          1226: #if PERFTIMES && DEBUG
        !          1227:                        li              r3,68                                                   ; Indicate interrupt
        !          1228:                        mr              r4,r11                                                  ; Get code to log
        !          1229:                        mr              r5,r13                                                  ; Get savearea to log
        !          1230:                        mr              r8,r0                                                   ; Save R0
        !          1231:                        bl              EXT(dbgLog2)                                    ; Cut log entry
        !          1232:                        mr              r0,r8                                                   ; Restore R0
        !          1233: #endif
        !          1234: 
        !          1235:                        mfsprg  r2,0                                                    /* Get the per processor block */
        !          1236: 
        !          1237: #if 0
        !          1238:                        lis             r19,0xF300                                              /* (TEST/DEBUG) */
        !          1239:                        ori             r19,r19,0x0020                                  /* (TEST/DEBUG) */
        !          1240:                        dcbi    0,r19                                                   /* (TEST/DEBUG) */
        !          1241:                        sync                                                                    /* (TEST/DEBUG) */
        !          1242:                        eieio                                                                   /* (TEST/DEBUG) */
        !          1243:                        lwz             r18,0x000C(r19)                                 /* (TEST/DEBUG) */
        !          1244:                        eieio                                                                   /* (TEST/DEBUG) */
        !          1245:                        dcbi    0,r19                                                   /* (TEST/DEBUG) */
        !          1246:                        rlwinm. r4,r18,0,19,19                                  /* (TEST/DEBUG) */
        !          1247:                        rlwinm  r18,r18,0,20,18                                 /* (TEST/DEBUG) */
        !          1248:                        sync                                                                    /* (TEST/DEBUG) */
        !          1249:                        eieio                                                                   /* (TEST/DEBUG) */
        !          1250:                        beq+    nonmi                                                   /* (TEST/DEBUG) */
        !          1251: 
        !          1252:                        stw             r18,0x0008(r19)                                 /* (TEST/DEBUG) */
        !          1253:                        dcbi    0,r19                                                   /* (TEST/DEBUG) */
        !          1254:                        sync                                                                    /* (TEST/DEBUG) */
        !          1255:                        eieio                                                                   /* (TEST/DEBUG) */
        !          1256:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1257: 
        !          1258: nonmi:                                                                                         /* (TEST/DEBUG) */
        !          1259: #endif
        !          1260:                
        !          1261: #if 0
        !          1262:                        lis             r4,hi16(EXT(hash_table_base))   ; (TEST/DEBUG)
        !          1263:                        ori             r4,r4,lo16(EXT(hash_table_base))        ; (TEST/DEBUG)
        !          1264:                        lwz             r8,0(r4)                                                ; (TEST/DEBUG)
        !          1265:                        lwz             r4,4(r4)                                                ; (TEST/DEBUG)
        !          1266:                        add             r8,r4,r8                                                ; (TEST/DEBUG)
        !          1267:                        
        !          1268: yyyck:         lwz             r12,4(r8)                                               ; (TEST/DEBUG)
        !          1269:                        rlwimn. r12,r12,0,24,31                                 ; (TEST/DEBUG)
        !          1270:                        bne+    yyyok                                                   ; (TEST/DEBUG)
        !          1271:                        BREAKPOINT_TRAP                                                 ; (TEST/DEBUG)
        !          1272: 
        !          1273: yyyok:         addi    r8,r8,0x40                                              ; (TEST/DEBUG)
        !          1274:                        subic   r4,r4,0x40                                              ; (TEST/DEBUG)
        !          1275:                        bgt+    yyyck                                                   ; (TEST/DEBUG)
        !          1276: #endif
        !          1277: 
        !          1278: #if CHECKSAVE
        !          1279: 
        !          1280:                        lis             r4,0x7FFF                                               /* (TEST/DEBUG) */
        !          1281:                        mfdec   r12                                                             /* (TEST/DEBUG) */
        !          1282:                        or              r4,r4,r12                                               /* (TEST/DEBUG) */
        !          1283:                        mtdec   r4                                                              /* (TEST/DEBUG) */
        !          1284:                        li              r4,0x20                                                 /* (TEST/DEBUG) */
        !          1285:                
        !          1286:                        lwarx   r8,0,r4                                                 ; ?
        !          1287: 
        !          1288: mpwait2:       lwarx   r8,0,r4                                                 /* (TEST/DEBUG) */
        !          1289:                        mr.             r8,r8                                                   /* (TEST/DEBUG) */
        !          1290:                        bne-    mpwait2                                                 /* (TEST/DEBUG) */
        !          1291:                        stwcx.  r4,0,r4                                                 /* (TEST/DEBUG) */
        !          1292:                        bne-    mpwait2                                                 /* (TEST/DEBUG) */
        !          1293: 
        !          1294:                        isync                                                                   /* (TEST/DEBUG) */
        !          1295:                        lwz             r4,0xD80(br0)                                   /* (TEST/DEBUG) */
        !          1296:                        mr.             r4,r4                                                   /* (TEST/DEBUG) */
        !          1297:                        li              r4,1                                                    /* (TEST/DEBUG) */
        !          1298:                        bne-    doncheksv                                               /* (TEST/DEBUG) */
        !          1299:                
        !          1300:                        lis             r8,HIGH_ADDR(EXT(saveanchor))   /* (TEST/DEBUG) */
        !          1301:                        ori             r8,r8,LOW_ADDR(EXT(saveanchor)) /* (TEST/DEBUG) */
        !          1302:                
        !          1303:                        stw             r4,0xD80(br0)                                   /* (TEST/DEBUG) */
        !          1304: 
        !          1305:                        lwarx   r4,0,r8                                                 ; ?
        !          1306: 
        !          1307: mpwait2x:      lwarx   r4,0,r8                                                 /* (TEST/DEBUG) */
        !          1308:                        mr.             r4,r4                                                   /* (TEST/DEBUG) */
        !          1309:                        bne-    mpwait2x                                                /* (TEST/DEBUG) */
        !          1310:                        stwcx.  r8,0,r8                                                 /* (TEST/DEBUG) */
        !          1311:                        bne-    mpwait2x                                                /* (TEST/DEBUG) */
        !          1312: 
        !          1313:                        isync                                                                   /* (TEST/DEBUG) */
        !          1314: 
        !          1315: #if 0
        !          1316:                        rlwinm  r4,r13,0,0,19                                   /* (TEST/DEBUG) */
        !          1317:                        lwz             r21,SACflags(r4)                                /* (TEST/DEBUG) */
        !          1318:                        rlwinm  r22,r21,24,24,31                                /* (TEST/DEBUG) */
        !          1319:                        cmplwi  r22,0x00EE                                              /* (TEST/DEBUG) */
        !          1320:                        lwz             r22,SACvrswap(r4)                               /* (TEST/DEBUG) */
        !          1321:                        bne-    currbad                                                 /* (TEST/DEBUG) */
        !          1322:                        andis.  r21,r21,hi16(sac_perm)                  /* (TEST/DEBUG) */
        !          1323:                        bne-    currnotbad                                              /* (TEST/DEBUG) */
        !          1324:                        mr.             r22,r22                                                 /* (TEST/DEBUG) */
        !          1325:                        bne+    currnotbad                                              /* (TEST/DEBUG) */
        !          1326:                        
        !          1327: currbad:       lis             r23,hi16(EXT(debugbackpocket))  /* (TEST/DEBUG) */
        !          1328:                        ori             r23,r23,lo16(EXT(debugbackpocket))      /* (TEST/DEBUG) */
        !          1329:                        stw             r23,SVfree(r8)                                  /* (TEST/DEBUG) */
        !          1330: 
        !          1331:                        mfsprg  r25,1                                                   /* (TEST/DEBUG) */
        !          1332:                        mtsprg  1,r23                                                   /* (TEST/DEBUG) */
        !          1333:                        lwz             r26,SACalloc(r23)                               /* (TEST/DEBUG) */
        !          1334:                        rlwinm  r26,r26,0,1,31                                  /* (TEST/DEBUG) */
        !          1335:                        stw             r26,SACalloc(r23)                               /* (TEST/DEBUG) */
        !          1336: 
        !          1337:                        sync                                                                    /* (TEST/DEBUG) */
        !          1338:                        li              r28,0                                                   /* (TEST/DEBUG) */
        !          1339:                        stw             r28,0x20(br0)                                   /* (TEST/DEBUG) */
        !          1340:                        stw             r28,0(r8)                                               /* (TEST/DEBUG) */
        !          1341:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1342: 
        !          1343: currnotbad:                    
        !          1344: #endif
        !          1345:                
        !          1346:                        lwz             r28,SVcount(r8)                                 /* (TEST/DEBUG) */
        !          1347: #if RUPTTRC
        !          1348:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1349:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1350:                        bne             cr7,nono90                                              /* (TEST/DEBUG) */
        !          1351:                        lwz             r0,0(br0)                                               /* (TEST/DEBUG) */
        !          1352:                        mr.             r0,r0                                                   /* (TEST/DEBUG) */
        !          1353:                        beq+    nono90                                                  /* (TEST/DEBUG) */
        !          1354:                        bne             cr6,nopir5                                              /* (TEST/DEBUG) */
        !          1355:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          1356:                        b               gotpir0                                                 /* (TEST/DEBUG) */
        !          1357: nopir5:                li              r4,0                                                    /* (TEST/DEBUG) */
        !          1358: gotpir5:                                                                                       /* (TEST/DEBUG) */
        !          1359:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          1360:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          1361:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          1362:                        mr              r5,r28                                                  /* (TEST/DEBUG) */
        !          1363:                        oris    r4,r4,0x3036                                    /* (TEST/DEBUG) */
        !          1364:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          1365:                        ori             r4,r4,0x3636                                    /* (TEST/DEBUG) */
        !          1366:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          1367:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1368: nono90:
        !          1369:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1370:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1371: #endif
        !          1372:                        lwz             r21,SVinuse(r8)                                 /* (TEST/DEBUG) */
        !          1373:                        lwz             r23,SVmin(r8)                                   /* (TEST/DEBUG) */
        !          1374:                        sub             r22,r28,r21                                             /* (TEST/DEBUG) */
        !          1375:                        cmpw    r22,r23                                                 /* (TEST/DEBUG) */
        !          1376:                        bge+    cksave0                                                 /* (TEST/DEBUG) */
        !          1377:                        
        !          1378:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1379:                        stw             r4,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1380:                        stw             r4,0(r8)                                                /* (TEST/DEBUG) */
        !          1381:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1382:                        
        !          1383: cksave0:       lwz             r28,SVfree(r8)                                  /* (TEST/DEBUG) */
        !          1384:                        li              r24,0                                                   /* (TEST/DEBUG) */
        !          1385:                        li              r29,1                                                   /* (TEST/SAVE) */
        !          1386:                        
        !          1387: cksave0a:      mr.             r28,r28                                                 /* (TEST/DEBUG) */
        !          1388:                        beq-    cksave3                                                 /* (TEST/DEBUG) */
        !          1389:                        
        !          1390:                        rlwinm. r21,r28,0,4,19                                  /* (TEST/DEBUG) */
        !          1391:                        bne+    cksave1                                                 /* (TEST/DEBUG) */
        !          1392:                        
        !          1393:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1394:                        stw             r4,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1395:                        stw             r4,0(r8)                                                /* (TEST/DEBUG) */
        !          1396:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1397:                        
        !          1398: cksave1:       rlwinm. r21,r28,0,21,3                                  /* (TEST/DEBUG) */
        !          1399:                        beq+    cksave2                                                 /* (TEST/DEBUG) */
        !          1400:                        
        !          1401:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1402:                        stw             r4,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1403:                        stw             r4,0(r8)                                                /* (TEST/DEBUG) */
        !          1404:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1405:                        
        !          1406: cksave2:       lwz             r25,SACalloc(r28)                               /* (TEST/DEBUG) */
        !          1407:                        lbz             r26,SACflags+2(r28)                             /* (TEST/DEBUG) */
        !          1408:                        lbz             r21,SACflags+3(r28)                             /* (TEST/DEBUG) */
        !          1409:                        cmplwi  r26,0x00EE                                              /* (TEST/DEBUG) */
        !          1410:                        stb             r29,SACflags+3(r28)                             /* (TEST/DEBUG) */
        !          1411:                        beq+    cksave2z
        !          1412:                        
        !          1413:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1414:                        stw             r4,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1415:                        stw             r4,0(r8)                                                /* (TEST/DEBUG) */
        !          1416:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1417: 
        !          1418: cksave2z:      mr.             r21,r21                                                 /* (TEST/DEBUG) */
        !          1419:                        beq+    cksave2a                                                /* (TEST/DEBUG) */
        !          1420:                        
        !          1421:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1422:                        stw             r4,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1423:                        stw             r4,0(r8)                                                /* (TEST/DEBUG) */
        !          1424:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1425: 
        !          1426: cksave2a:      rlwinm  r26,r25,1,31,31                                 /* (TEST/DEBUG) */
        !          1427:                        rlwinm  r27,r25,2,31,31                                 /* (TEST/DEBUG) */
        !          1428:                        add             r24,r24,r26                                             /* (TEST/DEBUG) */
        !          1429:                        add             r24,r24,r27                                             /* (TEST/DEBUG) */
        !          1430:                        lwz             r28,SACnext(r28)                                /* (TEST/DEBUG) */
        !          1431:                        b               cksave0a                                                /* (TEST/DEBUG) */
        !          1432:                        
        !          1433: cksave3:       cmplw   r24,r22                                                 /* (TEST/DEBUG) */
        !          1434:                        beq+    cksave4                                                 /* (TEST/DEBUG) */
        !          1435:                        
        !          1436:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1437:                        stw             r4,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1438:                        stw             r4,0(r8)                                                /* (TEST/DEBUG) */
        !          1439:                        BREAKPOINT_TRAP                                                 /* (TEST/DEBUG) */
        !          1440:                        
        !          1441: cksave4:       lwz             r28,SVfree(r8)                                  /* (TEST/DEBUG) */
        !          1442:                        li              r24,0                                                   /* (TEST/DEBUG) */
        !          1443: 
        !          1444: cksave5:       mr.             r28,r28                                                 /* (TEST/DEBUG) */
        !          1445:                        beq-    cksave6                                                 /* (TEST/DEBUG) */
        !          1446:                        stb             r24,SACflags+3(r28)                             /* (TEST/DEBUG) */
        !          1447:                        lwz             r28,SACnext(r28)                                /* (TEST/DEBUG) */
        !          1448:                        b               cksave5                                                 /* (TEST/DEBUG) */
        !          1449: 
        !          1450: cksave6:       
        !          1451: 
        !          1452:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1453:                        stw             r4,0xD80(br0)                                   /* (TEST/DEBUG) */
        !          1454:                        stw             r4,0(r8)                                                /* (TEST/DEBUG) */
        !          1455: 
        !          1456: doncheksv:
        !          1457:                        li              r4,0                                                    /* (TEST/DEBUG) */
        !          1458:                        stw             r4,0x20(br0)                                    /* (TEST/DEBUG) */                      
        !          1459:                        mtdec   r12                                                             /* (TEST/DEBUG) */
        !          1460: #endif
        !          1461: 
        !          1462: #if 0
        !          1463:                        lhz             r4,0x980(br0)                                   ; (TEST/DEBUG) 
        !          1464:                        xoris   r4,r4,lo16(0xFFF8)                              ; (TEST/DEBUG)
        !          1465:                        mr.             r4,r4                                                   ; (TEST/DEBUG)
        !          1466:                        beq-    dontkillmedead                                  ; (TEST/DEBUG)
        !          1467:                        mfmsr   r12                                                             ; (TEST/DEBUG) 
        !          1468:                        ori             r4,r12,0x2000                                   ; (TEST/DEBUG)  
        !          1469:                        mtmsr   r4                                                              ; (TEST/DEBUG) 
        !          1470:                        isync                                                                   ; (TEST/DEBUG) 
        !          1471:                        stfd    f13,0x980(br0)                                  ; (TEST/DEBUG) 
        !          1472:                        mtmsr   r12                                                             ; (TEST/DEBUG) 
        !          1473:                        isync                                                                   ; (TEST/DEBUG) 
        !          1474:                        lhz             r4,0x980(br0)                                   ; (TEST/DEBUG) 
        !          1475:                        xoris   r4,r4,lo16(0xFFF8)                              ; (TEST/DEBUG)
        !          1476:                        mr.             r4,r4                                                   ; (TEST/DEBUG)
        !          1477:                        bne+    dontkillmedead                                  ; (TEST/DEBUG)
        !          1478:                        BREAKPOINT_TRAP                                                 ; (TEST/DEBUG)
        !          1479:                        
        !          1480: dontkillmedead:                                                                                ; (TEST/DEBUG)
        !          1481: #endif
        !          1482: 
        !          1483:                        lis             r4,HIGH_ADDR(EXT(MPspec))               /* Get the MP control block */
        !          1484:                        dcbt    0,r2                                                    /* We'll need the per_proc in a sec */
        !          1485:                        cmplwi  cr0,r11,T_INTERRUPT                             /* Do we have an external interrupt? */
        !          1486:                        ori             r4,r4,LOW_ADDR(EXT(MPspec))             /* Get the bottom half of the MP control block */
        !          1487:                        bne+    notracex                                                /* Not an external... */
        !          1488: 
        !          1489: /*
        !          1490:  *                     Here we check to see if there was a interprocessor signal 
        !          1491:  */
        !          1492: 
        !          1493:                        lwz             r4,MPSSIGPhandler(r4)                   /* Get the address of the SIGP interrupt filter */
        !          1494:                        lhz             r3,PP_CPU_FLAGS(r2)                             /* Get the CPU flags */
        !          1495:                        cmplwi  cr1,r4,0                                                /* Check if signal filter is initialized yet */
        !          1496:                        andi.   r3,r3,LOW_ADDR(SIGPactive)              /* See if this processor has started up */
        !          1497:                        mtlr    r4                                                              /* Load up filter address */
        !          1498:                        beq-    cr1,notracex                                    /* We don't have a filter yet... */                     
        !          1499:                        beq-    notracex                                                /* This processor hasn't started filtering yet... */
        !          1500:                        
        !          1501:                        blrl                                                                    /* Filter the interrupt */
        !          1502:                
        !          1503:                        mfsprg  r2,0                                                    /* Make sure we have the per processor block */                 
        !          1504:                        cmplwi  cr0,r3,kMPIOInterruptPending    /* See what the filter says */
        !          1505:                        li              r11,T_INTERRUPT                                 /* Assume we have a regular external 'rupt */
        !          1506:                        beq+    modRupt                                                 /* Yeah, we figured it would be... */
        !          1507:                        li              r11,T_SIGP                                              /* Assume we had a signal processor interrupt */
        !          1508:                        bgt+    modRupt                                                 /* Yeah, at this point we would assume so... */
        !          1509:                        li              r11,T_IN_VAIN                                   /* Nothing there actually, so eat it */
        !          1510:                        
        !          1511: modRupt:       stw             r11,PP_SAVE_EXCEPTION_TYPE(r2)  /* Set that it was either in vain or a SIGP */
        !          1512:                        stw             r11,saveexception(r13)                  /* Save the exception code here also */
        !          1513:                        bne-    cr5,notracex                                    /* Jump if no tracing... */
        !          1514:                        sth             r11,LTR_excpt(r20)                              /* Save the exception type */
        !          1515: 
        !          1516: notracex:      
        !          1517: 
        !          1518: #if 0          
        !          1519:                        bne             cr6,nopir6                                              /* (TEST/DEBUG) */
        !          1520:                        mfspr   r7,pir                                                  /* (TEST/DEBUG) */
        !          1521:                        b               gotpir6                                                 /* (TEST/DEBUG) */
        !          1522: nopir6:                li              r7,0                                                    /* (TEST/DEBUG) */
        !          1523: gotpir6:                                                                                       /* (TEST/DEBUG) */
        !          1524:                        lis             r6,HIGH_ADDR(EXT(RuptCtrs))             /* (TEST/DEBUG) */
        !          1525:                        rlwinm  r7,r7,8,23,23                                   /* (TEST/DEBUG) */
        !          1526:                        lis             r12,HIGH_ADDR(EXT(GratefulDeb)) /* (TEST/DEBUG) */
        !          1527:                        rlwimi  r7,r7,1,22,22                                   /* (TEST/DEBUG) */
        !          1528:                        ori             r6,r6,LOW_ADDR(EXT(RuptCtrs))   /* (TEST/DEBUG) */
        !          1529:                        rlwinm  r1,r11,2,0,29                                   /* (TEST/DEBUG) */
        !          1530:                        add             r6,r6,r7                                                /* (TEST/DEBUG) */
        !          1531:                        ori             r12,r12,LOW_ADDR(EXT(GratefulDeb))      /* (TEST/DEBUG) */
        !          1532:                        lwz             r21,(47*16)+8(r6)                               /* (TEST/DEBUG) */
        !          1533:                        lwz             r22,(47*16)+12(r6)                              /* (TEST/DEBUG) */
        !          1534:                        add             r1,r1,r6                                                /* (TEST/DEBUG) */
        !          1535:                        mftb    r24                                                             /* (TEST/DEBUG) */
        !          1536:                        sub             r22,r24,r22                                             /* (TEST/DEBUG) */
        !          1537:                        lwz             r4,4(r6)                                                /* (TEST/DEBUG) */
        !          1538:                        cmplw   cr2,r22,r21                                             /* (TEST/DEBUG) */
        !          1539:                        lwz             r7,4(r1)                                                /* (TEST/DEBUG) */
        !          1540:                        lwz             r21,8(r6)                                               /* (TEST/DEBUG) */
        !          1541:                        blt+    cr2,nottime                                             /* (TEST/DEBUG) */
        !          1542:                        stw             r24,(47*16)+12(r6)                              /* (TEST/DEBUG) */
        !          1543:                        
        !          1544: nottime:       addi    r4,r4,1                                                 /* (TEST/DEBUG) */
        !          1545:                        lwz             r22,8(r1)                                               /* (TEST/DEBUG) */
        !          1546:                        addi    r7,r7,1                                                 /* (TEST/DEBUG) */
        !          1547:                        stw             r4,4(r6)                                                /* (TEST/DEBUG) */
        !          1548:                        lwz             r3,0(r6)                                                /* (TEST/DEBUG) */
        !          1549:                        mr.             r21,r21                                                 /* (TEST/DEBUG) */
        !          1550:                        stw             r7,4(r1)                                                /* (TEST/DEBUG) */
        !          1551:                        mtlr    r12                                                             /* (TEST/DEBUG) */
        !          1552:                        lwz             r1,0(r1)                                                /* (TEST/DEBUG) */
        !          1553:                        beq-    nottimed1                                               /* (TEST/DEBUG) */
        !          1554:                        blt+    cr2,isnttime1                                   /* (TEST/DEBUG) */
        !          1555:                                                
        !          1556: nottimed1:     mr.             r3,r3                                                   /* (TEST/DEBUG) */
        !          1557:                        bgelrl+                                                                 /* (TEST/DEBUG) */
        !          1558: 
        !          1559: isnttime1:     mr.             r22,r22                                                 /* (TEST/DEBUG) */
        !          1560:                        beq-    nottimed2                                               /* (TEST/DEBUG) */
        !          1561:                        blt+    cr2,isnttime2                                   /* (TEST/DEBUG) */
        !          1562:                        
        !          1563: nottimed2:     mr.             r3,r1                                                   /* (TEST/DEBUG) */
        !          1564:                        mtlr    r12                                                             /* (TEST/DEBUG) */
        !          1565:                        mr              r4,r7                                                   /* (TEST/DEBUG) */
        !          1566:                        bgelrl+                                                                 /* (TEST/DEBUG) */
        !          1567:                        mr              r3,r11                                                  /* (TEST/DEBUG) */
        !          1568:                        
        !          1569: isnttime2:     cmplwi  r11,T_DATA_ACCESS                               /* (TEST/DEBUG) */
        !          1570:                        lis             r12,HIGH_ADDR(EXT(GratefulDeb)) /* (TEST/DEBUG) */
        !          1571:                        bne+    nodsidisp                                               /* (TEST/DEBUG) */
        !          1572:                        mr.             r22,r22                                                 /* (TEST/DEBUG) */
        !          1573:                        beq-    nottimed3                                               /* (TEST/DEBUG) */
        !          1574:                        blt+    cr2,nodsidisp                                   /* (TEST/DEBUG) */
        !          1575: 
        !          1576: nottimed3:     li              r3,5                                                    /* (TEST/DEBUG) */
        !          1577:                        ori             r12,r12,LOW_ADDR(EXT(GratefulDeb))      /* (TEST/DEBUG) */
        !          1578:                        lwz             r4,savesrr0(r13)                                /* (TEST/DEBUG) */
        !          1579:                        mtlr    r12                                                             /* (TEST/DEBUG) */
        !          1580:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1581:                        
        !          1582:                        lis             r12,HIGH_ADDR(EXT(GratefulDeb)) /* (TEST/DEBUG) */
        !          1583:                        ori             r12,r12,LOW_ADDR(EXT(GratefulDeb))      /* (TEST/DEBUG) */
        !          1584:                        lis             r3,9                                                    /* (TEST/DEBUG) */
        !          1585:                        ori             r3,r3,5                                                 /* (TEST/DEBUG) */
        !          1586:                        mtlr    r12                                                             /* (TEST/DEBUG) */
        !          1587:                        lwz             r4,savedar(r13)                                 /* (TEST/DEBUG) */
        !          1588:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1589: 
        !          1590: nodsidisp:     cmplwi  r11,T_INSTRUCTION_ACCESS                /* (TEST/DEBUG) */
        !          1591:                        lis             r12,HIGH_ADDR(EXT(GratefulDeb)) /* (TEST/DEBUG) */
        !          1592:                        bne+    noisidisp                                               /* (TEST/DEBUG) */
        !          1593:                        mr.             r22,r22                                                 /* (TEST/DEBUG) */
        !          1594:                        beq-    nottimed4                                               /* (TEST/DEBUG) */
        !          1595:                        blt+    cr2,noisidisp                                   /* (TEST/DEBUG) */
        !          1596: 
        !          1597: nottimed4:     li              r3,6                                                    /* (TEST/DEBUG) */
        !          1598:                        ori             r12,r12,LOW_ADDR(EXT(GratefulDeb))      /* (TEST/DEBUG) */
        !          1599:                        lwz             r4,savesrr0(r13)                                /* (TEST/DEBUG) */
        !          1600:                        mtlr    r12                                                             /* (TEST/DEBUG) */
        !          1601:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1602: 
        !          1603: noisidisp:     mr              r3,r11                                                  /* (TEST/DEBUG) */              
        !          1604: #endif
        !          1605: 
        !          1606: #if 0
        !          1607:                        cmplwi  r11,T_PROGRAM                                   /* (TEST/DEBUG) */
        !          1608:                        lis             r12,HIGH_ADDR(EXT(GratefulDeb)) /* (TEST/DEBUG) */
        !          1609:                        bne+    nopgmdisp                                               /* (TEST/DEBUG) */
        !          1610:                        li              r3,7                                                    /* (TEST/DEBUG) */
        !          1611:                        ori             r12,r12,LOW_ADDR(EXT(GratefulDeb))      /* (TEST/DEBUG) */
        !          1612:                        lwz             r4,savesrr0(r13)                                /* (TEST/DEBUG) */
        !          1613:                        mtlr    r12                                                             /* (TEST/DEBUG) */
        !          1614:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1615: 
        !          1616: nopgmdisp:     mr              r3,r11                                                  /* (TEST/DEBUG) */              
        !          1617: #endif
        !          1618: 
        !          1619: #if RUPTTRC
        !          1620:                
        !          1621:                        lis             r6,0x7FFF                                               /* (TEST/DEBUG) */
        !          1622:                        mfdec   r7                                                              /* (TEST/DEBUG) */
        !          1623:                        or              r6,r6,r7                                                /* (TEST/DEBUG) */
        !          1624:                        mtdec   r6                                                              /* (TEST/DEBUG) */
        !          1625:                        li              r6,0x20                                                 /* (TEST/DEBUG) */
        !          1626:                
        !          1627:                        lwarx   r1,0,r6                                                 ; ?
        !          1628: 
        !          1629: mpwait3:       lwarx   r1,0,r6                                                 /* (TEST/DEBUG) */
        !          1630:                        mr.             r1,r1                                                   /* (TEST/DEBUG) */
        !          1631:                        bne-    mpwait3                                                 /* (TEST/DEBUG) */
        !          1632:                        stwcx.  r6,0,r6                                                 /* (TEST/DEBUG) */
        !          1633:                        bne-    mpwait3                                                 /* (TEST/DEBUG) */
        !          1634:                        
        !          1635:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1636:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1637:                        bne             cr7,nono3                                               /* (TEST/DEBUG) */
        !          1638:                        lwz             r0,0(br0)                                               /* (TEST/DEBUG) */
        !          1639:                        mr.             r0,r0                                                   /* (TEST/DEBUG) */
        !          1640:                        beq+    nono3                                                   /* (TEST/DEBUG) */
        !          1641:                        bne             cr6,nopir7                                              /* (TEST/DEBUG) */
        !          1642:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          1643:                        b               gotpir7                                                 /* (TEST/DEBUG) */
        !          1644: nopir7:                li              r4,0                                                    /* (TEST/DEBUG) */
        !          1645: gotpir7:                                                                                       /* (TEST/DEBUG) */
        !          1646:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          1647:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          1648:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          1649:                        mr              r5,r11                                                  /* (TEST/DEBUG) */
        !          1650:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          1651:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          1652:                        ori             r4,r4,0x3330                                    /* (TEST/DEBUG) */
        !          1653:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          1654:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1655:                        
        !          1656:                        bne             cr6,nopir8                                              /* (TEST/DEBUG) */
        !          1657:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          1658:                        b               gotpir8                                                 /* (TEST/DEBUG) */
        !          1659: nopir8:                li              r4,0                                                    /* (TEST/DEBUG) */
        !          1660: gotpir8:                                                                                       /* (TEST/DEBUG) */
        !          1661:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          1662:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          1663:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          1664:                        lwz             r5,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1665:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          1666:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          1667:                        ori             r4,r4,0x3430                                    /* (TEST/DEBUG) */
        !          1668:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          1669:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1670: nono3:
        !          1671:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1672:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1673:                        li              r6,0                                                    /* (TEST/DEBUG) */
        !          1674:                        stw             r6,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1675:                        mtdec   r7                                                              /* (TEST/DEBUG) */
        !          1676: 
        !          1677: #endif
        !          1678: 
        !          1679:                        li              r21,0                                                   ; Assume no processor register for now
        !          1680:                        lis             r12,hi16(EXT(hw_counts))                ; Get the high part of the interrupt counters
        !          1681:                        bne-    cr6,nopirhere                                   ; Jump if this processor does not have a PIR...
        !          1682:                        mfspr   r21,pir                                                 ; Get the PIR   
        !          1683: 
        !          1684: nopirhere:     ori             r12,r12,lo16(EXT(hw_counts))    ; Get the low part of the interrupt counters
        !          1685:                        rlwinm  r21,r21,8,20,23                                 ; Get index to processor counts
        !          1686:                        mtcrf   0x80,r0                                                 /* Set our CR0 to the high nybble of the request code */
        !          1687:                        rlwinm  r6,r0,1,0,31                                    /* Move sign bit to the end */
        !          1688:                        cmplwi  cr1,r11,T_SYSTEM_CALL                   /* Did we get a system call? */
        !          1689:                        crandc  cr0_lt,cr0_lt,cr0_gt                    /* See if we have R0 equal to 0b10xx...x */
        !          1690:                        add             r12,r12,r21                                             ; Point to the processor count area
        !          1691:                        cmplwi  cr3,r11,T_IN_VAIN                               /* Was this all in vain? All for nothing? */
        !          1692:                        lwzx    r22,r12,r11                                             ; Get the old value
        !          1693:                        cmplwi  cr2,r6,1                                                /* See if original R0 had the CutTrace request code in it */
        !          1694:                        addi    r22,r22,1                                               ; Count this one
        !          1695:                        cmplwi  cr4,r11,T_SIGP                                  /* Indicate if we had a SIGP 'rupt */
        !          1696:                        stwx    r22,r12,r11                                             ; Store it back
        !          1697:                        
        !          1698:                        beq-    cr3,EatRupt                                             /* Interrupt was all for nothing... */
        !          1699:                        cmplwi  cr3,r11,T_MACHINE_CHECK                 ; Did we get a machine check?
        !          1700:                        bne+    cr1,noCutT                                              /* Not a system call... */
        !          1701:                        bnl+    cr0,noCutT                                              /* R0 not 0b10xxx...x, can't be any kind of magical system call... */
        !          1702:                        beq-    cr2,isCutTrace                                  /* This is a CutTrace system call */
        !          1703:                        
        !          1704: /*
        !          1705:  *                     Here's where we call the firmware.  If it returns T_IN_VAIN, that means
        !          1706:  *                     that it has handled the interruption.  Remember: thou shalt not trash R13
        !          1707:  *                     or R20 while you are away.  Anything else is ok.
        !          1708:  */
        !          1709: 
        !          1710: 
        !          1711:                        lis             r1,HIGH_ADDR(EXT(FirmwareCall)) /* Top half of firmware call handler */
        !          1712:                        ori             r1,r1,LOW_ADDR(EXT(FirmwareCall))       /* Bottom half of it */
        !          1713:                        lwz             r3,saver3(r13)                                  /* Restore the first parameter, the rest are ok already */
        !          1714:                        mtlr    r1                                                              /* Get it in the link register */
        !          1715:                        blrl                                                                    /* Call the handler */
        !          1716: 
        !          1717: #if RUPTTRC
        !          1718:                        lis             r7,0x7FFF                                               /* (TEST/DEBUG) */
        !          1719:                        mfdec   r6                                                              /* (TEST/DEBUG) */
        !          1720:                        or              r7,r7,r6                                                /* (TEST/DEBUG) */
        !          1721:                        mtdec   r7                                                              /* (TEST/DEBUG) */
        !          1722:                        li              r7,0x20                                                 /* (TEST/DEBUG) */
        !          1723:                
        !          1724:                        lwarx   r1,0,r7                                                 ; ?
        !          1725: 
        !          1726: mpwait4:       lwarx   r1,0,r7                                                 /* (TEST/DEBUG) */
        !          1727:                        mr.             r1,r1                                                   /* (TEST/DEBUG) */
        !          1728:                        bne-    mpwait4                                                 /* (TEST/DEBUG) */
        !          1729:                        stwcx.  r7,0,r7                                                 /* (TEST/DEBUG) */
        !          1730:                        bne-    mpwait4                                                 /* (TEST/DEBUG) */
        !          1731:                        
        !          1732:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1733:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1734:                        bne             cr7,nono4                                               /* (TEST/DEBUG) */
        !          1735:                        lwz             r0,0(br0)                                               /* (TEST/DEBUG) */
        !          1736:                        mr.             r0,r0                                                   /* (TEST/DEBUG) */
        !          1737:                        beq+    nono4                                                   /* (TEST/DEBUG) */
        !          1738:                        
        !          1739:                        bne             cr6,nopir9                                              /* (TEST/DEBUG) */
        !          1740:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          1741:                        b               gotpir9                                                 /* (TEST/DEBUG) */
        !          1742: nopir9:                li              r4,0                                                    /* (TEST/DEBUG) */
        !          1743: gotpir9:                                                                                       /* (TEST/DEBUG) */
        !          1744:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          1745:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          1746:                        mr              r5,r3                                                   /* (TEST/DEBUG) */
        !          1747:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          1748:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          1749:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          1750:                        ori             r4,r4,0x3530                                    /* (TEST/DEBUG) */
        !          1751:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          1752:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1753:                        mtdec   r25                                                             /* (TEST/DEBUG) */
        !          1754: nono4:
        !          1755:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1756:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1757:                        li              r7,0                                                    /* (TEST/DEBUG) */
        !          1758:                        stw             r7,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1759:                        mtdec   r6                                                              /* (TEST/DEBUG) */
        !          1760: #endif
        !          1761: 
        !          1762:                        cmplwi  r3,T_IN_VAIN                                    /* Was it handled? */
        !          1763:                        mfsprg  r2,0                                                    /* Restore the per_processor area */
        !          1764:                        beq+    EatRupt                                                 /* Interrupt was handled... */
        !          1765:                        mr              r11,r3                                                  /* Put the 'rupt code in the right register */
        !          1766:                        b               noSIGP                                                  /* Go to the normal system call handler */
        !          1767:                        
        !          1768: isCutTrace:                            
        !          1769:                        li              r7,-32768                                               /* Get a 0x8000 for the exception code */
        !          1770:                        bne-    cr5,EatRupt                                             /* Tracing is disabled... */
        !          1771:                        sth             r7,LTR_excpt(r20)                               /* Modify the exception type to a CutTrace */
        !          1772:                        b               EatRupt                                                 /* Time to go home... */
        !          1773: 
        !          1774: /*                     We are here 'cause we didn't have a CutTrace system call */
        !          1775: 
        !          1776: noCutT:                beq-    cr3,MachineCheck                                ; Whoa... Machine check...
        !          1777:                        bne+    cr4,noSIGP                                              /* Skip away if we didn't get a SIGP... */
        !          1778:                
        !          1779:                        lis             r6,HIGH_ADDR(EXT(MPsignalFW))   /* Top half of SIGP handler */
        !          1780:                        ori             r6,r6,LOW_ADDR(EXT(MPsignalFW)) /* Bottom half of it */
        !          1781:                        mtlr    r6                                                              /* Get it in the link register */
        !          1782:                        
        !          1783:                        blrl                                                                    /* Call the handler - we'll only come back if this is an AST,  */
        !          1784:                                                                                                        /* 'cause FW can't handle that */
        !          1785:                        mfsprg  r2,0                                                    /* Restore the per_processor area */
        !          1786: ;
        !          1787: ;                      The following interrupts are the only ones that can be redriven
        !          1788: ;                      by the higher level code or emulation routines.
        !          1789: ;
        !          1790: 
        !          1791: Redrive:       cmplwi  cr0,r3,T_IN_VAIN                                /* Did the signal handler eat the signal? */
        !          1792:                        mr              r11,r3                                                  /* Move it to the right place */
        !          1793:                        beq+    cr0,EatRupt                                             /* Bail now if the signal handler processed the signal... */
        !          1794: 
        !          1795: 
        !          1796: /*
        !          1797:  *                     Here's where we check for the other fast-path exceptions: translation exceptions,
        !          1798:  *                     emulated instructions, etc.
        !          1799:  */
        !          1800: 
        !          1801: noSIGP:                cmplwi  cr3,r11,T_ALTIVEC_ASSIST                ; Check for an Altivec denorm assist
        !          1802:                        cmplwi  cr1,r11,T_PROGRAM                               /* See if we got a program exception */
        !          1803:                        cmplwi  cr2,r11,T_INSTRUCTION_ACCESS    /* Check on an ISI */
        !          1804:                        bne+    cr3,noAltivecAssist                             ; It is not an assist...
        !          1805:                        b               EXT(AltivecAssist)                              ; It is an assist...
        !          1806: 
        !          1807: noAltivecAssist:
        !          1808:                        bne+    cr1,noEmulate                                   ; No emulation here...
        !          1809:                        b               EXT(Emulate)                                    ; Go try to emulate...
        !          1810: 
        !          1811: noEmulate:     cmplwi  cr3,r11,T_CSWITCH                               /* Are we context switching */
        !          1812:                        cmplwi  r11,T_DATA_ACCESS                               /* Check on a DSI */
        !          1813:                        beq-    cr2,DSIorISI                                    /* It's a PTE fault... */
        !          1814:                        beq-    cr3,conswtch                                    /* It's a context switch... */
        !          1815:                        bne+    PassUp                                                  /* It's not a PTE fault... */
        !          1816: 
        !          1817: /*
        !          1818:  *                     This call will either handle the fault, in which case it will not
        !          1819:  *                     return, or return to pass the fault up the line.
        !          1820:  */
        !          1821: 
        !          1822: DSIorISI:
        !          1823:                        lis             r7,HIGH_ADDR(EXT(handlePF))             /* Top half of DSI handler */
        !          1824:                        ori             r7,r7,LOW_ADDR(EXT(handlePF))   /* Bottom half of it */
        !          1825:                        mtlr    r7                                                              /* Get it in the link register */
        !          1826:                        mr              r3,r11                                                  /* Move the 'rupt code */
        !          1827:                        
        !          1828:                        blrl                                                                    /* See if we can handle this fault  */
        !          1829: 
        !          1830: #if RUPTTRC
        !          1831:                        bne             cr7,nononono2                                   /* (TEST/DEBUG) */
        !          1832:                        lwz             r7,0(br0)                                               /* (TEST/DEBUG) */
        !          1833:                        mr.             r7,r7                                                   /* (TEST/DEBUG) */
        !          1834:                        beq+    nononono2                                               /* (TEST/DEBUG) */
        !          1835: #if 0                  
        !          1836:                        lis             r7,0x7FFF                                               /* (TEST/DEBUG) */
        !          1837:                        mfdec   r2                                                              /* (TEST/DEBUG) */
        !          1838:                        or              r7,r7,r2                                                /* (TEST/DEBUG) */
        !          1839:                        mtdec   r7                                                              /* (TEST/DEBUG) */
        !          1840:                        li              r7,0x20                                                 /* (TEST/DEBUG) */
        !          1841:                        
        !          1842:                        lwarx   r0,0,r7                                                 ; ?
        !          1843: 
        !          1844: yesyesyes2:    lwarx   r0,0,r7                                                 /* (TEST/DEBUG) */
        !          1845:                        mr.             r0,r0                                                   /* (TEST/DEBUG) */
        !          1846:                        li              r0,1                                                    /* (TEST/DEBUG) */
        !          1847:                        bne-    yesyesyes2                                              /* (TEST/DEBUG) */
        !          1848:                        stwcx.  r0,0,r7                                                 /* (TEST/DEBUG) */
        !          1849:                        bne-    yesyesyes2                                              /* (TEST/DEBUG) */
        !          1850: #endif
        !          1851:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1852:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1853:                        mr              r20,r3
        !          1854:                        bne             cr6,nopir10                                             /* (TEST/DEBUG) */
        !          1855:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          1856:                        b               gotpir10                                                /* (TEST/DEBUG) */
        !          1857: nopir10:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          1858: gotpir10:                                                                                      /* (TEST/DEBUG) */
        !          1859:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          1860:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          1861:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          1862:                        or              r4,r4,r20                                               /* (TEST/DEBUG) */
        !          1863:                        lwz             r5,savedar(r13)                                 /* (TEST/DEBUG) */
        !          1864:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          1865:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          1866:                        ori             r4,r4,0x3630                                    /* (TEST/DEBUG) */
        !          1867:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          1868:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1869: 
        !          1870: #if 0
        !          1871:                        lis             r31,HIGH_ADDR(EXT(dbgRegs))             /* (TEST/DEBUG) */
        !          1872:                        ori             r31,r31,LOW_ADDR(EXT(dbgRegs))  /* (TEST/DEBUG) */
        !          1873:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          1874:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          1875:                        blrl                                                                    /* (TEST/DEBUG) */
        !          1876: #endif
        !          1877:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          1878:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          1879:                        li              r0,0                                                    /* (TEST/DEBUG) */
        !          1880:                        stw             r0,0x20(br0)                                    /* (TEST/DEBUG) */
        !          1881:                        mtdec   r2                                                              /* (TEST/DEBUG) */
        !          1882: nononono2:                                                                                     /* (TEST/DEBUG) */                      
        !          1883: #endif
        !          1884: 
        !          1885:                        lwz             r0,savesrr1(r13)                                ; Get the MSR in use at exception time
        !          1886:                        mfsprg  r2, 0                                                   /* Get back per_proc */
        !          1887:                        cmplwi  cr1,r3,T_IN_VAIN                                ; Was it handled?
        !          1888:                        andi.   r4,r0,lo16(MASK(MSR_RI))                ; See if the recover bit is on
        !          1889:                        mr              r11,r3                                                  /* Make sure we can find this later */
        !          1890:                        beq+    cr1,EatRupt                                             ; Yeah, just blast back to the user... 
        !          1891:                        andc    r0,r0,r4                                                ; Remove the recover bit
        !          1892:                        beq+    PassUp                                                  ; Not on, normal case...
        !          1893:                        lwz             r4,savesrr0(r13)                                ; Get the failing instruction address
        !          1894:                        lwz             r5,savecr(r13)                                  ; Get the condition register
        !          1895:                        stw             r0,savesrr1(r13)                                ; Save the result MSR
        !          1896:                        addi    r4,r4,4                                                 ; Skip failing instruction
        !          1897:                        rlwinm  r5,r5,0,3,1                                             ; Clear CR0_EQ to let emulation code know we failed
        !          1898:                        stw             r4,savesrr0(r13)                                ; Save instruction address
        !          1899:                        stw             r4,savecr(r13)                                  ; And the resume CR
        !          1900:                        b               EatRupt                                                 ; Resume emulated code
        !          1901: 
        !          1902: /*
        !          1903:  *                     Here is where we handle the context switch firmware call.  The old 
        !          1904:  *                     context has been saved, and the new savearea in in saver3.  We'll just
        !          1905:  *                     muck around with the savearea pointers, and then join the exit routine 
        !          1906:  */
        !          1907: conswtch:      lwz             r28,SAVflags(r13)                               /* The the flags of the current */
        !          1908:                        mr              r29,r13                                                 /* Save the save */
        !          1909:                        rlwinm  r30,r13,0,0,19                                  /* Get the start of the savearea block */
        !          1910:                        lwz             r5,saver3(r13)                                  /* Switch to the new savearea */
        !          1911:                        oris    r28,r28,HIGH_ADDR(SAVattach)    /* Turn on the attached flag */
        !          1912:                        lwz             r30,SACvrswap(r30)                              /* get real to virtual translation */
        !          1913:                        mr              r13,r5                                                  /* Switch saveareas */
        !          1914:                        xor             r27,r29,r30                                             /* Flip to virtual */
        !          1915:                        stw             r28,SAVflags(r29)                               /* Stash it back */
        !          1916:                        stw             r27,saver3(r5)                                  /* Push the new savearea to the switch to routine */
        !          1917:                        b               EatRupt                                                 /* Start 'er up... */
        !          1918: 
        !          1919: ;
        !          1920: ;                      Handle machine check here.
        !          1921: ;
        !          1922: ; ?
        !          1923: ;
        !          1924: MachineCheck:
        !          1925:                        lwz             r27,savesrr1(r13)                               ; ?
        !          1926:                        rlwinm. r11,r27,0,dcmck,dcmck                   ; ?
        !          1927:                        beq+    notDCache                                               ; ?
        !          1928:                        
        !          1929:                        mfspr   r11,msscr0                                              ; ?
        !          1930:                        dssall                                                                  ; ?
        !          1931:                        sync
        !          1932:                        
        !          1933:                        lwz             r27,savesrr1(r13)                               ; ?
        !          1934: 
        !          1935: hiccup:                cmplw   r27,r27                                                 ; ?
        !          1936:                        bne-    hiccup                                                  ; ?
        !          1937:                        isync                                                                   ; ?
        !          1938:                        
        !          1939:                        oris    r11,r11,hi16(dl1hwfm)                   ; ?
        !          1940:                        mtspr   msscr0,r11                                              ; ?
        !          1941:                        
        !          1942: rstbsy:                mfspr   r11,msscr0                                              ; ?
        !          1943:                        
        !          1944:                        rlwinm. r11,r11,0,dl1hwf,dl1hwf                 ; ?
        !          1945:                        bne             rstbsy                                                  ; ?
        !          1946:                        
        !          1947:                        sync                                                                    ; ?
        !          1948: 
        !          1949:                        li              r11,T_IN_VAIN                                   ; ?
        !          1950:                        b               EatRupt                                                 ; ?
        !          1951: 
        !          1952:                        
        !          1953: notDCache:
        !          1954: ;
        !          1955: ;                      Check if the failure was in 
        !          1956: ;                      ml_probe_read.  If so, this is expected, so modify the PC to
        !          1957: ;                      ml_proble_read_mck and then eat the exception.
        !          1958: ;
        !          1959:                        lwz             r30,savesrr0(r13)                               ; Get the failing PC
        !          1960:                        lis             r28,hi16(EXT(ml_probe_read_mck))        ; High order part
        !          1961:                        lis             r27,hi16(EXT(ml_probe_read))    ; High order part
        !          1962:                        ori             r28,r28,lo16(EXT(ml_probe_read_mck))    ; Get the low part
        !          1963:                        ori             r27,r27,lo16(EXT(ml_probe_read))        ; Get the low part
        !          1964:                        cmplw   r30,r28                                                 ; Check highest possible
        !          1965:                        cmplw   cr1,r30,r27                                             ; Check lowest
        !          1966:                        bge-    PassUp                                                  ; Outside of range
        !          1967:                        blt-    cr1,PassUp                                              ; Outside of range
        !          1968: ;
        !          1969: ;                      We need to fix up the BATs here because the probe
        !          1970: ;                      routine messed them all up... As long as we are at it,
        !          1971: ;                      fix up to return directly to caller of probe.
        !          1972: ;
        !          1973:                
        !          1974:                        lwz             r30,saver5(r13)                                 ; Get proper DBAT values
        !          1975:                        lwz             r28,saver6(r13)
        !          1976:                        lwz             r27,saver7(r13)
        !          1977:                        lwz             r11,saver8(r13)
        !          1978:                        lwz             r18,saver9(r13)
        !          1979:                        
        !          1980:                        sync
        !          1981:                        mtdbatu 0,r30                                                   ; Restore DBAT 0 high
        !          1982:                        mtdbatl 0,r28                                                   ; Restore DBAT 0 low
        !          1983:                        mtdbatu 1,r27                                                   ; Restore DBAT 1 high
        !          1984:                        mtdbatu 2,r11                                                   ; Restore DBAT 2 high
        !          1985:                        mtdbatu 3,r18                                                   ; Restore DBAT 3 high 
        !          1986:                        sync
        !          1987: 
        !          1988:                        lwz             r28,savelr(r13)                                 ; Get return point
        !          1989:                        lwz             r27,saver0(r13)                                 ; Get the saved MSR
        !          1990:                        li              r30,0                                                   ; Get a failure RC
        !          1991:                        stw             r28,savesrr0(r13)                               ; Set the return point
        !          1992:                        stw             r27,savesrr1(r13)                               ; Set the continued MSR
        !          1993:                        stw             r30,saver3(r13)                                 ; Set return code
        !          1994:                        li              r11,T_IN_VAIN                                   ; Set new interrupt code
        !          1995:                        b               EatRupt                                                 ; Yum, yum, eat it all up...
        !          1996: 
        !          1997: /*
        !          1998:  *                     Here's where we come back from some instruction emulator.  If we come back with
        !          1999:  *                     T_IN_VAIN, the emulation is done and we should just reload state and directly
        !          2000:  *                     go back to the interrupted code. Otherwise, we'll check to see if
        !          2001:  *                     we need to redrive with a different interrupt, i.e., DSI.
        !          2002:  */
        !          2003:  
        !          2004:                        .align  5
        !          2005:                        .globl  EXT(EmulExit)
        !          2006: 
        !          2007: LEXT(EmulExit)
        !          2008: 
        !          2009:                        cmplwi  r11,T_IN_VAIN                                   /* Was it emulated? */
        !          2010:                        lis             r1,hi16(SAVredrive)                             ; Get redrive request
        !          2011:                        mfsprg  r2,0                                                    ; Restore the per_proc area
        !          2012:                        beq+    EatRupt                                                 /* Yeah, just blast back to the user... */
        !          2013:                        lwz             r4,SAVflags(r13)                                ; Pick up the flags
        !          2014: 
        !          2015:                        and.    r0,r4,r1                                                ; Check if redrive requested
        !          2016:                        andc    r4,r4,r1                                                ; Clear redrive
        !          2017: 
        !          2018:                        beq+    PassUp                                                  ; No redrive, just keep on going...
        !          2019: 
        !          2020:                        lwz             r3,saveexception(r13)                   ; Restore exception code
        !          2021:                        stw             r4,SAVflags(r13)                                ; Set the flags
        !          2022:                        b               Redrive                                                 ; Redrive the exception...
        !          2023:                
        !          2024: /*                     Jump into main handler code switching on VM at the same time */
        !          2025: 
        !          2026: /*                     We assume kernel data is mapped contiguously in physical
        !          2027:  *                     memory, otherwise we'd need to switch on (at least) virtual data.
        !          2028:  *                     SRs are already set up.
        !          2029:  */
        !          2030: PassUp:                lwz             r2,PP_PHYS_EXCEPTION_HANDLERS(r2)       /* Pick up the exception handler base */
        !          2031:                        lwzx    r6,r2,r11                                               /* Get the actual exception handler address */
        !          2032: 
        !          2033: PassUpDeb:     lwz             r8,SAVflags(r13)                                /* Get the flags */
        !          2034:                        mtsrr0  r6                                                              /* Set up the handler address */
        !          2035:                        oris    r8,r8,HIGH_ADDR(SAVattach)              /* Since we're passing it up, attach it */
        !          2036:                        rlwinm  r5,r13,0,0,19                                   /* Back off to the start of savearea block */
        !          2037:                        
        !          2038:                        mfmsr   r3                                                              /* Get our MSR */
        !          2039:                        stw             r8,SAVflags(r13)                                /* Pass up the flags */
        !          2040:                        rlwinm  r3,r3,0,MSR_BE_BIT+1,MSR_SE_BIT-1       /* Clear all but the trace bits */
        !          2041:                        li              r2,MSR_SUPERVISOR_INT_OFF               /* Get our normal MSR value */
        !          2042:                        lwz             r5,SACvrswap(r5)                                /* Get real to virtual conversion */                    
        !          2043:                        or              r2,r2,r3                                                /* Keep the trace bits if they're on */
        !          2044:                        mr              r3,r11                                                  /* Pass the exception code in the paramter reg */
        !          2045:                        mtsrr1  r2                                                              /* Set up our normal MSR value */
        !          2046:                        xor             r4,r13,r5                                               /* Pass up the virtual address of context savearea */
        !          2047: 
        !          2048: #if RUPTTRC            
        !          2049:                        lis             r20,0x7FFF                                              /* (TEST/DEBUG) */
        !          2050:                        mfdec   r25                                                             /* (TEST/DEBUG) */
        !          2051:                        or              r20,r20,r25                                             /* (TEST/DEBUG) */
        !          2052:                        mtdec   r20                                                             /* (TEST/DEBUG) */
        !          2053:                        li              r20,0x20                                                /* (TEST/DEBUG) */
        !          2054:                
        !          2055:                        lwarx   r21,0,r20                                               ; ?
        !          2056: 
        !          2057: mpwait5:       lwarx   r21,0,r20                                               /* (TEST/DEBUG) */
        !          2058:                        mr.             r21,r21                                                 /* (TEST/DEBUG) */
        !          2059:                        bne-    mpwait5                                                 /* (TEST/DEBUG) */
        !          2060:                        stwcx.  r20,0,r20                                               /* (TEST/DEBUG) */
        !          2061:                        bne-    mpwait5                                                 /* (TEST/DEBUG) */
        !          2062:                        
        !          2063:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          2064:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          2065:                        bne             cr7,nono9                                               /* (TEST/DEBUG) */
        !          2066:                        lwz             r0,0(br0)                                               /* (TEST/DEBUG) */
        !          2067:                        mr.             r0,r0                                                   /* (TEST/DEBUG) */
        !          2068:                        beq+    nono9                                                   /* (TEST/DEBUG) */
        !          2069:                        mr              r30,r4                                                  /* (TEST/DEBUG) */
        !          2070:                        mr              r24,r5                                                  /* (TEST/DEBUG) */
        !          2071:                        
        !          2072:                        bne             cr6,nopir11                                             /* (TEST/DEBUG) */
        !          2073:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2074:                        b               gotpir11                                                /* (TEST/DEBUG) */
        !          2075: nopir11:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2076: gotpir11:                                                                                      /* (TEST/DEBUG) */
        !          2077:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2078:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2079:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2080:                        mr              r5,r6                                                   /* (TEST/DEBUG) */
        !          2081:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          2082:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2083:                        ori             r4,r4,0x3930                                    /* (TEST/DEBUG) */
        !          2084:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2085:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2086:                        
        !          2087:                        bne             cr6,nopir12                                             /* (TEST/DEBUG) */
        !          2088:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2089:                        b               gotpir12                                                /* (TEST/DEBUG) */
        !          2090: nopir12:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2091: gotpir12:                                                                                      /* (TEST/DEBUG) */
        !          2092:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2093:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2094:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2095:                        mr              r5,r30                                                  /* (TEST/DEBUG) */
        !          2096:                        oris    r4,r4,0x3031                                    /* (TEST/DEBUG) */
        !          2097:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2098:                        ori             r4,r4,0x3130                                    /* (TEST/DEBUG) */
        !          2099:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2100:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2101:                
        !          2102:                        bne             cr6,nopir13                                             /* (TEST/DEBUG) */
        !          2103:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2104:                        b               gotpir13                                                /* (TEST/DEBUG) */
        !          2105: nopir13:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2106: gotpir13:                                                                                      /* (TEST/DEBUG) */
        !          2107:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2108:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2109:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2110:                        xor             r5,r30,r24                                              /* (TEST/DEBUG) */
        !          2111:                        oris    r4,r4,0x3031                                    /* (TEST/DEBUG) */
        !          2112:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2113:                        ori             r4,r4,0x3131                                    /* (TEST/DEBUG) */
        !          2114:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2115:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2116:                        
        !          2117:                        bne             cr6,nopir14                                             /* (TEST/DEBUG) */
        !          2118:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2119:                        b               gotpir14                                                /* (TEST/DEBUG) */
        !          2120: nopir14:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2121: gotpir14:                                                                                      /* (TEST/DEBUG) */
        !          2122:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2123:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2124:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2125:                        mr              r5,r25                                                  /* (TEST/DEBUG) */
        !          2126:                        oris    r4,r4,0x3031                                    /* (TEST/DEBUG) */
        !          2127:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2128:                        ori             r4,r4,0x3132                                    /* (TEST/DEBUG) */
        !          2129:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2130:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2131:                        
        !          2132:                        bne             cr6,nopir15                                             /* (TEST/DEBUG) */
        !          2133:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2134:                        b               gotpir15                                                /* (TEST/DEBUG) */
        !          2135: nopir15:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2136: gotpir15:                                                                                      /* (TEST/DEBUG) */
        !          2137:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2138:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2139:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2140:                        mfsrr0  r5                                                              /* (TEST/DEBUG) */
        !          2141:                        oris    r4,r4,0x3031                                    /* (TEST/DEBUG) */
        !          2142:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2143:                        ori             r4,r4,0x3133                                    /* (TEST/DEBUG) */
        !          2144:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2145:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2146: nono9:
        !          2147:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          2148:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          2149:                        li              r20,0                                                   /* (TEST/DEBUG) */
        !          2150:                        stw             r20,0x20(br0)                                   /* (TEST/DEBUG) */
        !          2151:                        mtdec   r25                                                             /* (TEST/DEBUG) */
        !          2152: #endif
        !          2153: 
        !          2154:                        rfi                                                                             /* Launch the exception handler */
        !          2155: 
        !          2156:                        .long   0                                                               /* Leave these here gol durn it! */
        !          2157:                        .long   0
        !          2158:                        .long   0
        !          2159:                        .long   0
        !          2160:                        .long   0
        !          2161:                        .long   0
        !          2162:                        .long   0
        !          2163:                        .long   0
        !          2164: 
        !          2165: /*
        !          2166:  *                     This routine is the only place where we return from an interruption.
        !          2167:  *                     Anyplace else is wrong.  Even if I write the code, it's still wrong
        !          2168:  *                     Feel free to come by and slap me if I do do it. Even though I may
        !          2169:  *                     have had a good reason to do it.
        !          2170:  *
        !          2171:  *                     All we need to remember here is that R13 must point to the savearea
        !          2172:  *                     that has the context we need to load up. Translation and interruptions
        !          2173:  *                     must be disabled.
        !          2174:  *
        !          2175:  *                     This code always loads the context in the savearea pointed to
        !          2176:  *                     by R13.  In the process, it throws away the savearea.  If there 
        !          2177:  *                     is any tomfoolery with savearea stacks, it must be taken care of 
        !          2178:  *                     before we get here.
        !          2179:  */
        !          2180:  
        !          2181: EatRupt:       mr              r31,r13                                                 /* Move the savearea pointer to the far end of the register set */
        !          2182: 
        !          2183: EatRupt2:      mfsprg  r2,0                                                    /* Get the per_proc block */
        !          2184:        
        !          2185: /*
        !          2186:  *                     First we see if we are able to free the new savearea.
        !          2187:  *                     If it is not attached to anything, put it on the free list.
        !          2188:  *                     This is real dangerous, we haven't restored context yet...
        !          2189:  *                     So, the free savearea chain lock must stay until the bitter end!
        !          2190:  */
        !          2191:                        
        !          2192: #if RUPTTRC
        !          2193:                        lis             r18,0x7FFF                                              /* (TEST/DEBUG) */
        !          2194:                        mfdec   r25                                                             /* (TEST/DEBUG) */
        !          2195:                        or              r18,r18,r25                                             /* (TEST/DEBUG) */
        !          2196:                        mtdec   r18                                                             /* (TEST/DEBUG) */
        !          2197:                        li              r18,0x20                                                /* (TEST/DEBUG) */
        !          2198:                
        !          2199:                        lwarx   r19,0,r18                                               ; ?
        !          2200: 
        !          2201: mpwait6:       lwarx   r19,0,r18                                               /* (TEST/DEBUG) */
        !          2202:                        mr.             r19,r19                                                 /* (TEST/DEBUG) */
        !          2203:                        bne-    mpwait6                                                 /* (TEST/DEBUG) */
        !          2204:                        stwcx.  r18,0,r18                                               /* (TEST/DEBUG) */
        !          2205:                        bne-    mpwait6                                                 /* (TEST/DEBUG) */
        !          2206:                        
        !          2207:                        stw             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          2208:                        stmw    r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          2209:                        bne             cr7,nono5                                               /* (TEST/DEBUG) */
        !          2210:                        lwz             r0,0(br0)                                               /* (TEST/DEBUG) */
        !          2211:                        mr.             r0,r0                                                   /* (TEST/DEBUG) */
        !          2212:                        beq+    nono5                                                   /* (TEST/DEBUG) */
        !          2213: 
        !          2214:                        bne             cr6,nopir16                                             /* (TEST/DEBUG) */
        !          2215:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2216:                        b               gotpir16                                                /* (TEST/DEBUG) */
        !          2217: nopir16:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2218: gotpir16:                                                                                      /* (TEST/DEBUG) */
        !          2219:                        rlwinm  r24,r31,0,0,19                                  /* (TEST/DEBUG) */
        !          2220:                        mr              r5,r31                                                  /* (TEST/DEBUG) */
        !          2221:                        mr              r30,r31                                                 /* (TEST/DEBUG) */
        !          2222:                        lwz             r24,SACvrswap(r24)                              /* (TEST/DEBUG) */
        !          2223:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2224:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2225:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2226:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          2227:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2228:                        ori             r4,r4,0x3730                                    /* (TEST/DEBUG) */
        !          2229:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2230:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2231: 
        !          2232:                
        !          2233:                        bne             cr6,nopir17                                             /* (TEST/DEBUG) */
        !          2234:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2235:                        b               gotpir17                                                /* (TEST/DEBUG) */
        !          2236: nopir17:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2237: gotpir17:                                                                                      /* (TEST/DEBUG) */
        !          2238:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2239:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2240:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2241:                        xor             r5,r30,r24                                              /* (TEST/DEBUG) */
        !          2242:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          2243:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2244:                        ori             r4,r4,0x3731                                    /* (TEST/DEBUG) */
        !          2245:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2246:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2247:                        
        !          2248:                        bne             cr6,nopir18                                             /* (TEST/DEBUG) */
        !          2249:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2250:                        b               gotpir18                                                /* (TEST/DEBUG) */
        !          2251: nopir18:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2252: gotpir18:                                                                                      /* (TEST/DEBUG) */
        !          2253:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2254:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2255:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2256:                        mfsprg  r5,1                                                    /* (TEST/DEBUG) */
        !          2257:                        oris    r4,r4,0x3030                                    /* (TEST/DEBUG) */
        !          2258:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2259:                        ori             r4,r4,0x3830                                    /* (TEST/DEBUG) */
        !          2260:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2261:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2262: 
        !          2263:                        bne             cr6,nopir19                                             /* (TEST/DEBUG) */
        !          2264:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2265:                        b               gotpir19                                                /* (TEST/DEBUG) */
        !          2266: nopir19:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2267: gotpir19:                                                                                      /* (TEST/DEBUG) */
        !          2268:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2269:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2270:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2271:                        lwz             r5,savesrr0(r30)                                /* (TEST/DEBUG) */
        !          2272:                        oris    r4,r4,0x3031                                    /* (TEST/DEBUG) */
        !          2273:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2274:                        ori             r4,r4,0x3130                                    /* (TEST/DEBUG) */
        !          2275:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2276:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2277: 
        !          2278:                        bne             cr6,nopir20                                             /* (TEST/DEBUG) */
        !          2279:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2280:                        b               gotpir20                                                /* (TEST/DEBUG) */
        !          2281: nopir20:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2282: gotpir20:                                                                                      /* (TEST/DEBUG) */
        !          2283:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2284:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2285:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2286:                        lwz             r5,savesrr1(r30)                                /* (TEST/DEBUG) */
        !          2287:                        oris    r4,r4,0x3031                                    /* (TEST/DEBUG) */
        !          2288:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2289:                        ori             r4,r4,0x3131                                    /* (TEST/DEBUG) */
        !          2290:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2291:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2292: 
        !          2293:                        bne             cr6,nopir21                                             /* (TEST/DEBUG) */
        !          2294:                        mfspr   r4,pir                                                  /* (TEST/DEBUG) */
        !          2295:                        b               gotpir21                                                /* (TEST/DEBUG) */
        !          2296: nopir21:       li              r4,0                                                    /* (TEST/DEBUG) */
        !          2297: gotpir21:                                                                                      /* (TEST/DEBUG) */
        !          2298:                        lis             r31,HIGH_ADDR(EXT(dbgDispLL))   /* (TEST/DEBUG) */
        !          2299:                        rlwinm  r4,r4,24,4,7                                    /* (TEST/DEBUG) */
        !          2300:                        li              r3,0                                                    /* (TEST/DEBUG) */
        !          2301:                        lwz             r5,savelr(r30)                                  /* (TEST/DEBUG) */
        !          2302:                        oris    r4,r4,0x3031                                    /* (TEST/DEBUG) */
        !          2303:                        ori             r31,r31,LOW_ADDR(EXT(dbgDispLL))        /* (TEST/DEBUG) */
        !          2304:                        ori             r4,r4,0x3132                                    /* (TEST/DEBUG) */
        !          2305:                        mtlr    r31                                                             /* (TEST/DEBUG) */
        !          2306:                        blrl                                                                    /* (TEST/DEBUG) */
        !          2307: nono5:
        !          2308:                        lmw             r1,0x284(br0)                                   /* (TEST/DEBUG) */
        !          2309:                        lwz             r0,0x280(br0)                                   /* (TEST/DEBUG) */
        !          2310:                        li              r19,0                                                   /* (TEST/DEBUG) */
        !          2311:                        stw             r19,0x20(br0)                                   /* (TEST/DEBUG) */
        !          2312:                        mtdec   r25                                                             /* (TEST/DEBUG) */
        !          2313:                        
        !          2314: #endif
        !          2315: 
        !          2316: 
        !          2317: /*
        !          2318:  *                     It's dangerous here.  We haven't restored anything from the current savearea yet.
        !          2319:  *                     And, we mark it the active one.  So, if we get an exception in here, it is
        !          2320:  *                     unrecoverable.  Unless we mess up, we can't get any kind of exception.  So,
        !          2321:  *                     it is important to assay this code as only the purest of gold.
        !          2322:  *
        !          2323:  *                     But first, see if there is a savearea hanging off of quickfret.  If so, 
        !          2324:  *                     we release that one first and then come back for the other.  We should rarely
        !          2325:  *                     see one, they appear when FPU or VMX context is discarded by either returning
        !          2326:  *                     to a higher exception level, or explicitly.
        !          2327:  *
        !          2328:  *                     A word about QUICKFRET: Multiple saveareas may be queued for release.  It is
        !          2329:  *                     the responsibility of the queuer to insure that the savearea is not multiply
        !          2330:  *                     queued and that the appropriate inuse bits are reset.
        !          2331:  */
        !          2332: 
        !          2333: #define TRCSAVE 0
        !          2334: 
        !          2335: #if TRCSAVE
        !          2336:                        lwz             r30,saver0(r31)                                 ; (TEST/DEBUG) Get users R0
        !          2337:                        lwz             r20,saveexception(r31)                  ; (TEST/DEBUG) Returning from trace?
        !          2338:                        xor             r30,r20,r30                                             ; (TEST/DEBUG) Make code
        !          2339:                        rlwinm  r30,r30,1,0,31                                  ; (TEST/DEBUG) Make an easy test
        !          2340:                        cmplwi  cr5,r30,0x61                                    ; (TEST/DEBUG) See if this is a trace
        !          2341: #endif
        !          2342:  
        !          2343:                        mr              r18,r31                                                 /* Save the savearea pointer */
        !          2344:                        lwz             r19,PP_QUICKFRET(r2)                    /* Get the quick release savearea */
        !          2345: 
        !          2346:                        la              r20,savesrr0(r18)                               /* Point to the first thing we look at */
        !          2347:                        li              r0,0                                                    /* Get a zero */
        !          2348:                        dcbt    0,r20                                                   /* Touch in the first thing in the real savearea */
        !          2349:                        la              r21,savesr0(r18)                                /* Point to the first thing we restore */
        !          2350:                        lis             r30,HIGH_ADDR(EXT(saveanchor))  /* Get the high part of the anchor */
        !          2351:                        stw             r0,PP_QUICKFRET(r2)                             /* Clear quickfret pointer */
        !          2352:                        ori             r30,r30,LOW_ADDR(EXT(saveanchor))       /* Bottom half of the anchor */
        !          2353:                        dcbt    0,r21                                                   /* Touch in the first thing */
        !          2354: 
        !          2355: #if TRCSAVE
        !          2356:                        beq-    cr5,trkill0                                             ; (TEST/DEBUG) Do not trace this type
        !          2357:                        lwz             r14,LOW_ADDR(traceMask-EXT(ExceptionVectorsStart))(br0) ; (TEST/DEBUG) Get the trace mask
        !          2358:                        mr.             r14,r14                                                 ; (TEST/DEBUG) Is it stopped?
        !          2359:                        beq-    trkill0                                                 ; (TEST/DEBUG) yes...
        !          2360:                        bl              cte                                                             ; (TEST/DEBUG) Trace this
        !          2361:                        stw             r18,LTR_r1(r20)                                 ; (TEST/DEBUG) Normal savearea
        !          2362:                        stw             r19,LTR_r2(r20)                                 ; (TEST/DEBUG) Quickfret savearea
        !          2363: trkill0:
        !          2364: #endif
        !          2365: 
        !          2366:                        lwarx   r22,0,r30                                               ; ?
        !          2367: 
        !          2368: rtlck:         lwarx   r22,0,r30                                               /* Grab the lock value */
        !          2369:                        li              r23,1                                                   /* Use part of the delay time */
        !          2370:                        mr.             r22,r22                                                 /* Is it locked? */
        !          2371:                        bne-    rtlcks                                                  /* Yeah, wait for it to clear... */
        !          2372:                        stwcx.  r23,0,r30                                               /* Try to seize that there durn lock */
        !          2373:                        beq+    fretagain                                               ; Got it...
        !          2374:                        b               rtlck                                                   /* Collision, try again... */
        !          2375:                        
        !          2376: rtlcks:                lwz             r22,SVlock(r30)                                 /* Get that lock in here */
        !          2377:                        mr.             r22,r22                                                 /* Is it free yet? */
        !          2378:                        beq+    rtlck                                                   /* Yeah, try for it again... */
        !          2379:                        b               rtlcks                                                  /* Sniff away... */
        !          2380: 
        !          2381: ;
        !          2382: ;                      Lock gotten, toss the saveareas
        !          2383: ;
        !          2384: fretagain:     
        !          2385: #if TRCSAVE
        !          2386:                        beq-    cr5,trkill1                                             ; (TEST/DEBUG) Do not trace this type
        !          2387:                        lwz             r14,LOW_ADDR(traceMask-EXT(ExceptionVectorsStart))(br0) ; (TEST/DEBUG) Get the trace mask
        !          2388:                        mr.             r14,r14                                                 ; (TEST/DEBUG) Is it stopped?
        !          2389:                        beq-    trkill1                                                 ; (TEST/DEBUG) yes...
        !          2390:                        li              r0,1                                                    ; (TEST/DEBUG) ID number
        !          2391:                        bl              cte                                                             ; (TEST/DEBUG) Trace this
        !          2392:                        stw             r18,LTR_r1(r20)                                 ; (TEST/DEBUG) Normal savearea
        !          2393:                        stw             r19,LTR_r2(r20)                                 ; (TEST/DEBUG) Quickfret savearea
        !          2394: trkill1:
        !          2395: #endif
        !          2396:                        
        !          2397:                        mr.             r18,r18                                                 ; Are we actually done here?
        !          2398:                        beq-    donefret                                                ; Yeah...
        !          2399:                        mr.             r31,r19                                                 ; Is there a quickfret to do?
        !          2400:                        beq+    noqfrt                                                  ; Nope...
        !          2401:                        lwz             r19,SAVqfret(r19)                               ; Yes, get the next in line
        !          2402: #if TRCSAVE
        !          2403:                        beq-    cr5,trkill2                                             ; (TEST/DEBUG) Do not trace this type
        !          2404:                        lwz             r14,LOW_ADDR(traceMask-EXT(ExceptionVectorsStart))(br0) ; (TEST/DEBUG) Get the trace mask
        !          2405:                        mr.             r14,r14                                                 ; (TEST/DEBUG) Is it stopped?
        !          2406:                        beq-    trkill2                                                 ; (TEST/DEBUG) yes...
        !          2407:                        li              r0,2                                                    ; (TEST/DEBUG) ID number
        !          2408:                        bl              cte                                                             ; (TEST/DEBUG) Trace this
        !          2409:                        stw             r18,LTR_r1(r20)                                 ; (TEST/DEBUG) Normal savearea
        !          2410:                        stw             r19,LTR_r2(r20)                                 ; (TEST/DEBUG) next quickfret savearea
        !          2411:                        stw             r31,LTR_r3(r20)                                 ; (TEST/DEBUG) Current one to toss
        !          2412: trkill2:
        !          2413: #endif
        !          2414:                        b               doqfrt                                                  ; Go do it...
        !          2415: 
        !          2416: noqfrt:                mr              r31,r18                                                 ; Set the area to release
        !          2417:                        li              r18,0                                                   ; Show we have done it
        !          2418: #if TRCSAVE
        !          2419:                        beq-    cr5,trkill3                                             ; (TEST/DEBUG) Do not trace this type
        !          2420:                        lwz             r14,LOW_ADDR(traceMask-EXT(ExceptionVectorsStart))(br0) ; (TEST/DEBUG) Get the trace mask
        !          2421:                        mr.             r14,r14                                                 ; (TEST/DEBUG) Is it stopped?
        !          2422:                        beq-    trkill3                                                 ; (TEST/DEBUG) yes...
        !          2423:                        li              r0,3                                                    ; (TEST/DEBUG) ID number
        !          2424:                        bl              cte                                                             ; (TEST/DEBUG) Trace this
        !          2425:                        stw             r18,LTR_r1(r20)                                 ; (TEST/DEBUG) Normal savearea
        !          2426:                        stw             r19,LTR_r2(r20)                                 ; (TEST/DEBUG) next quickfret savearea
        !          2427:                        stw             r31,LTR_r3(r20)                                 ; (TEST/DEBUG) Current one to toss
        !          2428: trkill3:
        !          2429: #endif
        !          2430: 
        !          2431: doqfrt:                li              r0,0                                                    ; Get a constant 0
        !          2432:                        lis             r26,0x8000                                              /* Build a bit mask and assume first savearea */
        !          2433:                        stw             r0,SAVqfret(r31)                                ; Make sure back chain is unlinked
        !          2434:                        lwz             r28,SAVflags(r31)                               ; Get the flags for the old active one
        !          2435: #if TRCSAVE
        !          2436:                        beq-    cr5,trkill4                                             ; (TEST/DEBUG) Do not trace this type
        !          2437:                        lwz             r14,LOW_ADDR(traceMask-EXT(ExceptionVectorsStart))(br0) ; (TEST/DEBUG) Get the trace mask
        !          2438:                        mr.             r14,r14                                                 ; (TEST/DEBUG) Is it stopped?
        !          2439:                        beq-    trkill4                                                 ; (TEST/DEBUG) yes...
        !          2440:                        li              r0,4                                                    ; (TEST/DEBUG) ID number
        !          2441:                        bl              cte                                                             ; (TEST/DEBUG) Trace this
        !          2442:                        stw             r18,LTR_r1(r20)                                 ; (TEST/DEBUG) Normal savearea
        !          2443:                        stw             r19,LTR_r2(r20)                                 ; (TEST/DEBUG) next quickfret savearea
        !          2444:                        stw             r31,LTR_r3(r20)                                 ; (TEST/DEBUG) Current one to toss
        !          2445:                        stw             r28,LTR_r4(r20)                                 ; (TEST/DEBUG) Save current flags
        !          2446: trkill4:
        !          2447: #endif                 
        !          2448:                        rlwinm  r25,r31,21,31,31                                /* Get position of savearea in block */
        !          2449:                        andis.  r28,r28,HIGH_ADDR(SAVinuse)             /* See if we need to free it */
        !          2450:                        srw             r26,r26,r25                                             /* Get bit position to deallocate */
        !          2451:                        rlwinm  r29,r31,0,0,19                                  /* Round savearea pointer to even page address */
        !          2452:                                        
        !          2453:                        bne-    fretagain                                               /* Still in use, we can't free this one... */
        !          2454: 
        !          2455:                        lwz             r23,SACalloc(r29)                               /* Get the allocation for this block */
        !          2456:                        lwz             r24,SVinuse(r30)                                /* Get the in use count */
        !          2457:                        mr              r28,r23                                                 ; (TEST/DEBUG) save for trace
        !          2458:                        or              r23,r23,r26                                             /* Turn on our bit */
        !          2459:                        subi    r24,r24,1                                               /* Show that this one is free */
        !          2460:                        cmplw   r23,r26                                                 /* Is our's the only one free? */
        !          2461:                        stw             r23,SACalloc(r29)                               /* Save it out */
        !          2462:                        bne+    rstrest                                                 /* Nope, then the block is already on the free list */
        !          2463: 
        !          2464:                        lwz             r22,SVfree(r30)                                 /* Get the old head of the free list */
        !          2465:                        stw             r29,SVfree(r30)                                 /* Point the head at us now */
        !          2466:                        stw             r22,SACnext(r29)                                ; Point us to the old last
        !          2467:        
        !          2468: rstrest:       stw             r24,SVinuse(r30)                                /* Set the in use count */
        !          2469: #if TRCSAVE
        !          2470:                        beq-    cr5,trkill5                                             ; (TEST/DEBUG) Do not trace this type
        !          2471:                        lwz             r14,LOW_ADDR(traceMask-EXT(ExceptionVectorsStart))(br0) ; (TEST/DEBUG) Get the trace mask
        !          2472:                        mr.             r14,r14                                                 ; (TEST/DEBUG) Is it stopped?
        !          2473:                        beq-    trkill5                                                 ; (TEST/DEBUG) yes...
        !          2474:                        li              r0,5                                                    ; (TEST/DEBUG) ID number
        !          2475:                        bl              cte                                                             ; (TEST/DEBUG) Trace this
        !          2476:                        stw             r18,LTR_r1(r20)                                 ; (TEST/DEBUG) Normal savearea
        !          2477:                        stw             r19,LTR_r2(r20)                                 ; (TEST/DEBUG) Next quickfret savearea
        !          2478:                        stw             r31,LTR_r3(r20)                                 ; (TEST/DEBUG) Current one to toss
        !          2479:                        stw             r28,LTR_srr1(r20)                               ; (TEST/DEBUG) Save the original allocation
        !          2480:                        stw             r23,LTR_dar(r20)                                ; (TEST/DEBUG) Save the new allocation
        !          2481:                        stw             r24,LTR_save(r20)                               ; (TEST/DEBUG) Save the new in use count
        !          2482:                        stw             r22,LTR_lr(r20)                                 ; (TEST/DEBUG) Save the old top of free list
        !          2483:                        stw             r29,LTR_ctr(r20)                                ; (TEST/DEBUG) Save the new top of free list
        !          2484: trkill5:
        !          2485: #endif                 
        !          2486:                        b               fretagain                                               ; Go finish up the rest...
        !          2487: 
        !          2488: ;
        !          2489: ;                      Build the SR values depending upon destination.  If we are going to the kernel,
        !          2490: ;                      the SRs are almost all the way set up. SR14 (or the currently used copyin/out register)
        !          2491: ;                      must be set to whatever it was at the last exception because it varies.  All the rest
        !          2492: ;                      have been set up already.
        !          2493: ;
        !          2494: ;                      If we are going into user space, we need to check a bit more. SR0, SR1, SR2, and
        !          2495: ;                      SR14 (current implementation) must be restored always.  The others must be set if
        !          2496: ;                      they are different that what was loaded last time (i.e., tasks have switched).  
        !          2497: ;                      We check the last loaded address space ID and if the same, we skip the loads.  
        !          2498: ;                      This is a performance gain because SR manipulations are slow.
        !          2499: ;
        !          2500: 
        !          2501: donefret:      lwz             r26,savesrr1(r31)                               ; Get destination state flags
        !          2502:                        lwz             r15,PP_USERSPACE(r2)                    ; Pick up the user space ID we may launch
        !          2503:                        rlwinm. r17,r26,0,MSR_PR_BIT,MSR_PR_BIT ; See if we are going to user or system
        !          2504:                        lwz             r16,PP_LASTSPACE(r2)                    ; Pick up the last loaded SR value
        !          2505:                        oris    r13,r15,hi16(SEG_REG_PROT)              ; Get the protection bits correct
        !          2506:                        
        !          2507:                        cmplw   cr3,r15,r15                                             ; Set that we do not need to stop streams
        !          2508:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2509:                        beq-    gotokern                                                ; We are going into kernel state, SRs all set up...
        !          2510:                        
        !          2511:                        mtsr    sr0,r13                                                 ; Set SR0
        !          2512:                        addis   r13,r14,0x0010                                  ; Generate next SR value
        !          2513:                        cmplw   cr3,r15,r16                                             ; See if most of the SRs are already loaded
        !          2514:                        mtsr    sr1,r14                                                 ; Set SR1
        !          2515:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2516:                        mtsr    sr2,r13                                                 ; Set SR2
        !          2517:                        addis   r13,r14,0x0010                                  ; Generate next SR value
        !          2518:                        mtsr    sr3,r14                                                 ; Set SR3
        !          2519:                        
        !          2520:                        beq+    cr3,noloadsr                                    ; SRs have not changed, no reload...
        !          2521: 
        !          2522:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2523:                        mtsr    sr4,r13                                                 ; Set SR4
        !          2524:                        addis   r13,r14,0x0010                                  ; Generate next SR value
        !          2525:                        mtsr    sr5,r14                                                 ; Set SR5
        !          2526:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2527:                        mtsr    sr6,r13                                                 ; Set SR6
        !          2528:                        addis   r13,r14,0x0010                                  ; Generate next SR value
        !          2529:                        mtsr    sr7,r14                                                 ; Set SR7
        !          2530:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2531:                        mtsr    sr8,r13                                                 ; Set SR8
        !          2532:                        addis   r13,r14,0x0010                                  ; Generate next SR value
        !          2533:                        mtsr    sr9,r14                                                 ; Set SR9
        !          2534:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2535:                        mtsr    sr10,r13                                                ; Set SR10
        !          2536:                        addis   r13,r14,0x0010                                  ; Generate next SR value
        !          2537:                        mtsr    sr11,r14                                                ; Set SR11
        !          2538:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2539:                        mtsr    sr12,r13                                                ; Set SR12
        !          2540:                        addis   r13,r14,0x0010                                  ; Generate next SR value
        !          2541:                        mtsr    sr13,r14                                                ; Set SR13
        !          2542:                        addis   r14,r13,0x0010                                  ; Generate next SR value
        !          2543:                        mtsr    sr14,r13                                                ; Set SR14
        !          2544:                        mtsr    sr15,r14                                                ; Set SR15
        !          2545:                        stw             r15,PP_LASTSPACE(r2)                    ; Set the last loaded SR value
        !          2546:                        b               ngotokern                                               ; All done with user state SRs...
        !          2547: 
        !          2548: noloadsr:      oris    r14,r15,hi16(SEG_REG_PROT|0x00E00000)   ; Build SR14 (copyin/out) value
        !          2549:                        b               loadsr14                                                ; All done with user state SRs (except for SR14)...
        !          2550: 
        !          2551: gotokern:      lwz             r14,savesr14(r31)                               ; Get the copyin/out register at interrupt time
        !          2552: 
        !          2553: loadsr14:      mtsr    sr14,r14                                                ; Set SR14
        !          2554:                        
        !          2555: ngotokern:     lwz             r25,savesrr0(r31)                               /* Get the SRR0 to use */
        !          2556:                        la              r28,saver6(r31)                                 /* Point to the next line to use */
        !          2557:                        lwz             r0,saver0(r31)                                  /* Restore */                   
        !          2558:                        dcbt    0,r28                                                   /* Touch it in */
        !          2559:                        lwz             r1,saver1(r31)                                  /* Restore */   
        !          2560:                        lwz             r2,saver2(r31)                                  /* Restore */   
        !          2561:                        la              r28,saver14(r31)                                /* Point to the next line to get */
        !          2562:                        lwz             r3,saver3(r31)                                  /* Restore */
        !          2563:                        mtsrr0  r25                                                             /* Restore the SRR0 now */
        !          2564:                        lwz             r4,saver4(r31)                                  /* Restore */
        !          2565:                        lwz             r5,saver5(r31)                                  /* Restore */
        !          2566:                        mtsrr1  r26                                                             /* Restore the SRR1 now */
        !          2567:                        lwz             r6,saver6(r31)                                  /* Restore */                   
        !          2568:                        
        !          2569:                        dcbt    0,r28                                                   /* Touch that next line on in */
        !          2570:                        
        !          2571:                        lwz             r7,saver7(r31)                                  /* Restore */                   
        !          2572:                        lwz             r8,saver8(r31)                                  /* Restore */                   
        !          2573:                        lwz             r9,saver9(r31)                                  /* Restore */                   
        !          2574:                        lwz             r10,saver10(r31)                                /* Restore */                   
        !          2575:                        lwz             r11,saver11(r31)                                /* Restore */                   
        !          2576:                        lwz             r12,saver12(r31)                                /* Restore */                   
        !          2577:                        lwz             r13,saver13(r31)                                /* Restore */                   
        !          2578:                        la              r28,saver22(r31)                                /* Point to the next line to do */
        !          2579:                        lwz             r14,saver14(r31)                                /* Restore */   
        !          2580:                        lwz             r15,saver15(r31)                                /* Restore */                   
        !          2581:                        
        !          2582:                        dcbt    0,r28                                                   /* Touch in another line of context */
        !          2583:                        
        !          2584:                        lwz             r16,saver16(r31)                                /* Restore */
        !          2585:                        lwz             r17,saver17(r31)                                /* Restore */
        !          2586:                        lwz             r18,saver18(r31)                                /* Restore */   
        !          2587:                        lwz             r19,saver19(r31)                                /* Restore */   
        !          2588:                        lwz             r20,saver20(r31)                                /* Restore */   
        !          2589:                        lwz             r21,saver21(r31)                                /* Restore */
        !          2590:                        la              r28,saver30(r31)                                /* Point to the final line */
        !          2591:                        lwz             r22,saver22(r31)                                /* Restore */
        !          2592: 
        !          2593:                        dcbt    0,r28                                                   /* Suck it in */
        !          2594: 
        !          2595:                        lwz             r23,saver23(r31)                                /* Restore */
        !          2596:                        mfpvr   r27                                                             ; Get the processor version
        !          2597:                        lwz             r24,saver24(r31)                                /* Restore */                   
        !          2598:                        rlwinm  r27,r27,16,16,31                                ; Get the processor type
        !          2599:                        lwz             r25,saver25(r31)                                /* Restore */                   
        !          2600:                        cmplwi  cr1,r27,PROCESSOR_VERSION_Max   ; Do we have Altivec? */                        
        !          2601:                        lwz             r26,saver26(r31)                                /* Restore */                   
        !          2602:                        lwz             r27,saver27(r31)                                /* Restore */                   
        !          2603: 
        !          2604:                        dcbt    0,r28                                                   /* Get the final line */
        !          2605:                        lwz             r28,savecr(r31)                                 /* Get CR to restore */
        !          2606:                        blt             cr1,noavec4                                             ; No vector on this machine
        !          2607:                        lwz             r29,savevrsave(r31)                             ; Get the vrsave
        !          2608:                        beq+    cr3,noavec3                                             ; SRs have not changed, no need to stop the streams...
        !          2609:                        dssall                                                                  ; Kill all data streams
        !          2610:                                                                                                        ; The streams should be suspended
        !          2611:                                                                                                        ; already, and we do a bunch of 
        !          2612:                                                                                                        ; dependent loads and a sync later
        !          2613:                                                                                                        ; so we should be cool.
        !          2614:                
        !          2615: noavec3:       mtspr   vrsave,r29                                              ; Set the vrsave
        !          2616: 
        !          2617: noavec4:       lwz             r29,savexer(r31)                                /* Get XER to restore */
        !          2618:                        mtcr    r28                                                             /* Restore the CR */
        !          2619:                        lwz             r28,savelr(r31)                                 /* Get LR to restore */
        !          2620:                        mtxer   r29                                                             /* Restore the XER */
        !          2621:                        lwz             r29,savectr(r31)                                /* Get the CTR to restore */
        !          2622:                        mtlr    r28                                                             /* Restore the LR */
        !          2623:                        lwz             r28,saver30(r31)                                /* Restore */
        !          2624:                        mtctr   r29                                                             /* Restore the CTR */
        !          2625:                        lwz             r29,saver31(r31)                                /* Restore */
        !          2626:                        mtsprg  2,r28                                                   /* Save R30 */
        !          2627:                        lwz             r28,saver28(r31)                                /* Restore */                   
        !          2628:                        mtsprg  3,r29                                                   /* Save R31 */
        !          2629:                        lwz             r29,saver29(r31)                                /* Restore */
        !          2630: 
        !          2631: #if PERFTIMES && DEBUG
        !          2632:                        stmw    r1,0x280(br0)                                   ; Save all registers
        !          2633:                        mfcr    r20                                                             ; Save the CR
        !          2634:                        mflr    r21                                                             ; Save the LR
        !          2635:                        mfsrr0  r9                                                              ; Save SRR0
        !          2636:                        mfsrr1  r11                                                             ; Save SRR1
        !          2637:                        mr              r8,r0                                                   ; Save R0
        !          2638:                        li              r3,69                                                   ; Indicate interrupt
        !          2639:                        mr              r4,r11                                                  ; Set MSR to log
        !          2640:                        mr              r5,r31                                                  ; Get savearea to log
        !          2641:                        bl              EXT(dbgLog2)                                    ; Cut log entry
        !          2642:                        mr              r0,r8                                                   ; Restore R0
        !          2643:                        mtsrr0  r9                                                              ; Restore SRR0
        !          2644:                        mtsrr1  r11                                                             ; Restore SRR1
        !          2645:                        mtlr    r21                                                             ; Restore the LR
        !          2646:                        mtcr    r20                                                             ; Restore the CR
        !          2647:                        lmw             r1,0x280(br0)                                   ; Restore all the rest
        !          2648: #endif
        !          2649: 
        !          2650:                        li              r31,0                                                   /* Get set to clear lock */
        !          2651:                        sync                                                                    /* Make sure it's all out there */
        !          2652:                        stw             r31,SVlock(r30)                                 /* Unlock it */
        !          2653:                        mfsprg  r30,2                                                   /* Restore R30 */
        !          2654:                        mfsprg  r31,3                                                   /* Restore R31 */
        !          2655: 
        !          2656:                        rfi                                                                             /* Click heels three times and think very hard that there's no place like home */
        !          2657: 
        !          2658:                        .long   0                                                               /* For old 601 bug */
        !          2659:                        .long   0
        !          2660:                        .long   0
        !          2661:                        .long   0
        !          2662:                        .long   0
        !          2663:                        .long   0
        !          2664:                        .long   0
        !          2665:                        .long   0
        !          2666: 
        !          2667: 
        !          2668: 
        !          2669:        
        !          2670: /*
        !          2671:  * exception_exit(savearea *)
        !          2672:  *
        !          2673:  *
        !          2674:  * ENTRY :     IR and/or DR and/or interruptions can be on
        !          2675:  *                     R3 points to the physical address of a savearea
        !          2676:  */
        !          2677:        
        !          2678:                        .align  5
        !          2679:                        .globl  EXT(exception_exit)
        !          2680:                        
        !          2681:                        nop                                                                             ; Align ISYNC to last line in cache
        !          2682:                        nop
        !          2683: 
        !          2684: LEXT(exception_exit)
        !          2685: 
        !          2686:                        mfmsr   r30                                                             /* Get the current MSR */
        !          2687:                        mr              r31,r3                                                  /* Get the savearea in the right register */
        !          2688:                        andi.   r30,r30,0x7FCF                                  /* Turn off externals, IR, and DR */
        !          2689:                        lis             r1,hi16(SAVredrive)                             ; Get redrive request
        !          2690:                        mtmsr   r30                                                             /* Translation and all off */
        !          2691:                        isync                                                                   /* Toss prefetch */
        !          2692: 
        !          2693:                        mfsprg  r2,0                                                    ; Get the per_proc block
        !          2694:                        lwz             r4,SAVflags(r3)                                 ; Pick up the flags
        !          2695:                        mr              r13,r3                                                  ; Put savearea here also
        !          2696: 
        !          2697:                        and.    r0,r4,r1                                                ; Check if redrive requested
        !          2698:                        andc    r4,r4,r1                                                ; Clear redrive
        !          2699:                        
        !          2700:                        dcbt    br0,r2                                                  ; We will need this in just a sec
        !          2701: 
        !          2702:                        beq+    EatRupt                                                 ; No redrive, just exit...
        !          2703: 
        !          2704:                        lwz             r3,saveexception(r13)                   ; Restore exception code
        !          2705:                        stw             r4,SAVflags(r13)                                ; Set the flags
        !          2706:                        b               Redrive                                                 ; Redrive the exception...
        !          2707:                
        !          2708: ;
        !          2709: ;                      Make trace entry for lowmem_vectors internal debug
        !          2710: ;
        !          2711: #if TRCSAVE
        !          2712: cte:
        !          2713:                        lwz             r20,LOW_ADDR(EXT(traceCurr)-EXT(ExceptionVectorsStart))(br0)    ; Pick up the current trace entry
        !          2714:                        lwz             r16,LOW_ADDR(EXT(traceEnd)-EXT(ExceptionVectorsStart))(br0)     ; Grab up the end of it all
        !          2715:                        addi    r17,r20,LTR_size                                ; Point to the next trace entry
        !          2716:                        cmplw   r17,r16                                                 ; Do we need to wrap the trace table?
        !          2717:                        li              r15,32                                                  ; Second line of entry
        !          2718:                        bne+    ctenwrap                                                ; We got a trace entry...                       
        !          2719:                        lwz             r17,LOW_ADDR(EXT(traceStart)-EXT(ExceptionVectorsStart))(br0)   ; Wrap back to the top
        !          2720:        
        !          2721: ctenwrap:      stw             r17,LOW_ADDR(EXT(traceCurr)-EXT(ExceptionVectorsStart))(br0)    ; Set the next entry for the next guy           
        !          2722:                        
        !          2723:                        dcbz    0,r20                                                   ; Allocate cache for the entry
        !          2724:                        dcbz    r15,r20                                                 ; Zap the second half
        !          2725: 
        !          2726: ctegetTB:      mftbu   r16                                                             ; Get the upper timebase
        !          2727:                        mftb    r17                                                             ; Get the lower timebase
        !          2728:                        mftbu   r15                                                             ; Get the upper one again
        !          2729:                        cmplw   r16,r15                                                 ; Did the top tick?
        !          2730:                        bne-    ctegetTB                                                ; Yeah, need to get it again...
        !          2731:                        
        !          2732:                        li              r15,0x111                                               ; Get the special trace ID code
        !          2733:                        stw             r0,LTR_r0(r20)                                  ; Save R0 (usually used as an ID number
        !          2734:                        stw             r16,LTR_timeHi(r20)                             ; Set the upper part of TB
        !          2735:                        mflr    r16                                                             ; Get the return point
        !          2736:                        stw             r17,LTR_timeLo(r20)                             ; Set the lower part of TB
        !          2737:                        sth             r15,LTR_excpt(r20)                              ; Save the exception type
        !          2738:                        stw             r16,LTR_srr0(r20)                               ; Save the return point
        !          2739:                        blr                                                                             ; Leave...
        !          2740: #endif
        !          2741: 
        !          2742: /*
        !          2743:  *             Start of the trace table
        !          2744:  */
        !          2745:  
        !          2746:                        .align  12                                              /* Align to 4k boundary */
        !          2747:        
        !          2748: traceTableBeg:                                         /* Start of trace table */
        !          2749: /*                     .fill   2048,4,0                   Make an 8k trace table for now */
        !          2750:                        .fill   13760,4,0               /* Make an .trace table for now */
        !          2751: /*                     .fill   240000,4,0                 Make an .trace table for now */
        !          2752: traceTableEnd:                                         /* End of trace table */
        !          2753:        
        !          2754:                        .globl EXT(ExceptionVectorsEnd)
        !          2755: EXT(ExceptionVectorsEnd):      /* Used if relocating the exception vectors */
        !          2756: #ifndef HACKALERTHACKALERT
        !          2757: /* 
        !          2758:  *             This .long needs to be here because the linker gets confused and tries to 
        !          2759:  *             include the final label in a section in the next section if there is nothing 
        !          2760:  *             after it
        !          2761:  */
        !          2762:        .long   0                                               /* (HACK/HACK/HACK) */
        !          2763: #endif
        !          2764: 
        !          2765:        .data
        !          2766:        .align  ALIGN
        !          2767:        .globl  EXT(exception_end)
        !          2768: EXT(exception_end):
        !          2769:        .long   EXT(ExceptionVectorsEnd) -EXT(ExceptionVectorsStart) /* phys fn */
        !          2770: 
        !          2771: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.