Annotation of XNU/osfmk/ppc/start.s, revision 1.1.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: #include <cpus.h>
                     26: #include <mach_kdb.h>
                     27: #include <mach_kdp.h>
                     28: #include <mach_kgdb.h>
                     29: 
                     30: #include <ppc/asm.h>
                     31: #include <ppc/proc_reg.h>
                     32: #include <mach/ppc/vm_param.h>
                     33: #include <assym.s>
                     34:        
                     35: /*
                     36:  * Interrupt and bootup stack for initial processor
                     37:  */
                     38: 
                     39:        .file   "start.s"
                     40:        
                     41:        .data
                     42: 
                     43:                /* Align on page boundry */
                     44:        .align  PPC_PGSHIFT
                     45:                /* Red zone for interrupt stack, one page (will be unmapped)*/
                     46:        .set    ., .+PPC_PGBYTES
                     47:                /* intstack itself */
                     48: 
                     49:      .globl  EXT(FixedStackStart)
                     50: EXT(FixedStackStart):
                     51:      
                     52:         .globl  EXT(intstack)
                     53: EXT(intstack):
                     54:        .set    ., .+INTSTACK_SIZE*NCPUS
                     55:        
                     56:        /* Debugger stack - used by the debugger if present */
                     57:        /* NOTE!!! Keep the debugger stack right after the interrupt stack */
                     58: 
                     59: #if MACH_KDP || MACH_KDB
                     60:     .globl  EXT(debstack)
                     61: EXT(debstack):
                     62:        .set    ., .+KERNEL_STACK_SIZE*NCPUS
                     63:      
                     64:         .globl  EXT(FixedStackEnd)
                     65: EXT(FixedStackEnd):
                     66: 
                     67:        .align  ALIGN
                     68:     .globl  EXT(intstack_top_ss)
                     69: EXT(intstack_top_ss):
                     70:        .long   EXT(intstack)+INTSTACK_SIZE-SS_SIZE                     /* intstack_top_ss points to the top of interrupt stack */
                     71: 
                     72:        .align  ALIGN
                     73:     .globl  EXT(debstack_top_ss)       
                     74: EXT(debstack_top_ss):
                     75: 
                     76:        .long   EXT(debstack)+KERNEL_STACK_SIZE-SS_SIZE         /* debstack_top_ss points to the top of debug stack */
                     77: 
                     78:     .globl  EXT(debstackptr)
                     79: EXT(debstackptr):      
                     80:        .long   EXT(debstack)+KERNEL_STACK_SIZE-SS_SIZE
                     81: 
                     82: #endif /* MACH_KDP || MACH_KDB */
                     83: 
                     84: /*
                     85:  * All CPUs start here.
                     86:  *
                     87:  * This code is called from SecondaryLoader
                     88:  *
                     89:  * Various arguments are passed via a table:
                     90:  *   ARG0 = pointer to other startup parameters
                     91:  */
                     92:        .text
                     93:        
                     94: ENTRY(_start_cpu,TAG_NO_FRAME_USED)
                     95:                        li              r30,1
                     96:                        b               allstart
                     97:                        
                     98: ENTRY(_start,TAG_NO_FRAME_USED)
                     99:                        li              r30,0
                    100: allstart:
                    101:                        mr              r31,r3                                          /* Save away arguments */
                    102: 
                    103:                        li              r7,MSR_VM_OFF                           /* Get real mode MSR */
                    104:                        mtmsr   r7                                                      /* Set the real mode SRR */
                    105:                        isync                                   
                    106: 
                    107: ;                      Map in the first 256Mb in both instruction and data BATs
                    108: 
                    109:                        li              r7,((0x7FF<<2)|2)                                       ; Set up for V=R 256MB in supervisor space
                    110:                        li      r8,((2<<3)|2)                                           ; Physical address = 0, coherent, R/W
                    111:                        li              r9,0                                                            ; Clear out a register
                    112:                        
                    113:                        mtsprg  0,r9                                                            ; Insure the SPRGs are clear
                    114:                        mtsprg  1,r9
                    115:                        mtsprg  2,r9
                    116:                        mtsprg  3,r9
                    117: 
                    118:                        sync
                    119:                        isync
                    120:                        mtdbatu 0,r7                                                            ; Map bottom 256MB
                    121:                        mtdbatl 0,r8                                                            ; Map bottom 256MB
                    122:                        mtdbatu 1,r9                                                            ; Invalidate maps
                    123:                        mtdbatl 1,r9                                                            ; Invalidate maps
                    124:                        mtdbatu 2,r9                                                            ; Invalidate maps
                    125:                        mtdbatl 2,r9                                                            ; Invalidate maps
                    126:                        mtdbatu 3,r9                                                            ; Invalidate maps
                    127:                        mtdbatl 3,r9                                                            ; Invalidate maps
                    128:                        sync
                    129:                        isync
                    130:                        mtibatu 0,r7                                                            ; Map bottom 256MB
                    131:                        mtibatl 0,r8                                                            ; Map bottom 256MB
                    132:                        mtibatu 1,r9                                                            ; Invalidate maps
                    133:                        mtibatl 1,r9                                                            ; Invalidate maps
                    134:                        mtibatu 2,r9                                                            ; Invalidate maps
                    135:                        mtibatl 2,r9                                                            ; Invalidate maps
                    136:                        mtibatu 3,r9                                                            ; Invalidate maps
                    137:                        mtibatl 3,r9                                                            ; Invalidate maps
                    138:                        sync
                    139:                        isync
                    140: 
                    141:                        mfpvr   r10
                    142:                        rlwinm  r11,r10,16,16,31
                    143:                        cmplwi  r11,PROCESSOR_VERSION_Max                       ; Do we have Altivec?
                    144:                        blt             novmx                                                           ; Nope...
                    145: 
                    146: ; ?
                    147:                        rlwinm  r13,r10,0,16,31                                         ; ?
                    148:                        cmplwi  r13, 0x0200                                                     ; ?
                    149:                        bge     notMaxV1                                                                ; ?
                    150: 
                    151:                        sync
                    152:                        mfspr   r11,msscr0                                                      ; ?
                    153:                        mfspr   r12,msscr1                                                      ; ?
                    154:                        
                    155:                        oris    r11,r11,hi16(shden)                                     ; ?
                    156:                        
                    157:                        andis.  r0,r11,hi16(emodem)                                     ; ?
                    158:                        bne             inmaxbus                                                        ; ?
                    159:                        ori             r11,r11,lo16(tfstm)                                     ; ?
                    160:                        b               nomaxbus                                                        ; ?
                    161: 
                    162: inmaxbus:      oris    r12,r12,hi16(cqdm)                                      ; ?
                    163: 
                    164: nomaxbus:      rlwinm  r12,r12,0,csqe+1,csqs-1                         ; ?
                    165:                        oris    r12,r12,0x2000                                          ; ?
                    166:                        
                    167:                        sync
                    168:                        mtspr   msscr0,r11                                                      ; ?
                    169:                        mtspr   msscr1,r12                                                      ; ?
                    170:                        sync
                    171:                        isync
                    172: 
                    173: notMaxV1:
                    174: ; ?
                    175:                        cmplwi  r13,0x0202                                                      ; ?
                    176:                        bge     notMaxV2_0                                                              ; ?
                    177: 
                    178:                        lis     r11, 0xffff
                    179:                        ori     r11, r11, 0xfffe
                    180:                        mtspr   iabr, r11
                    181:                        isync
                    182: 
                    183: notMaxV2_0:
                    184: 
                    185:                        li              r0,0                                                            ; Clear out a register
                    186:                        
                    187:                        lis             r7,hi16(MSR_VEC_ON)                                     ; Get real mode MSR + FP + Altivec
                    188:                        ori             r7,r7,lo16(MSR_VM_OFF|MASK(MSR_FP))     ; Get real mode MSR + FP + Altivec
                    189:                        mtmsr   r7                                                                      ; Set the real mode SRR */
                    190:                        isync                                                                           ; Make sure it has happened                                                                     
                    191:                
                    192:                        lis             r5,hi16(EXT(QNaNbarbarian))                     ; Altivec initializer
                    193:                        ori             r5,r5,lo16(EXT(QNaNbarbarian))          ; Altivec initializer
                    194: 
                    195:                        mtspr   vrsave,r0                                                       ; Set that no VRs are used yet */
                    196:                        
                    197:                        vspltisw        v1,0                                                    ; Clear a register
                    198:                        lvx             v0,br0,r5                                                       ; Initialize VR0
                    199:                        mtvscr  v1                                                                      ; Clear the vector status register
                    200:                        vor             v2,v0,v0                                                        ; Copy into the next register
                    201:                        vor             v1,v0,v0                                                        ; Copy into the next register
                    202:                        vor             v3,v0,v0                                                        ; Copy into the next register
                    203:                        vor             v4,v0,v0                                                        ; Copy into the next register
                    204:                        vor             v5,v0,v0                                                        ; Copy into the next register
                    205:                        vor             v6,v0,v0                                                        ; Copy into the next register
                    206:                        vor             v7,v0,v0                                                        ; Copy into the next register
                    207:                        vor             v8,v0,v0                                                        ; Copy into the next register
                    208:                        vor             v9,v0,v0                                                        ; Copy into the next register
                    209:                        vor             v10,v0,v0                                                       ; Copy into the next register
                    210:                        vor             v11,v0,v0                                                       ; Copy into the next register
                    211:                        vor             v12,v0,v0                                                       ; Copy into the next register
                    212:                        vor             v13,v0,v0                                                       ; Copy into the next register
                    213:                        vor             v14,v0,v0                                                       ; Copy into the next register
                    214:                        vor             v15,v0,v0                                                       ; Copy into the next register
                    215:                        vor             v16,v0,v0                                                       ; Copy into the next register
                    216:                        vor             v17,v0,v0                                                       ; Copy into the next register
                    217:                        vor             v18,v0,v0                                                       ; Copy into the next register
                    218:                        vor             v19,v0,v0                                                       ; Copy into the next register
                    219:                        vor             v20,v0,v0                                                       ; Copy into the next register
                    220:                        vor             v21,v0,v0                                                       ; Copy into the next register
                    221:                        vor             v22,v0,v0                                                       ; Copy into the next register
                    222:                        vor             v23,v0,v0                                                       ; Copy into the next register
                    223:                        vor             v24,v0,v0                                                       ; Copy into the next register
                    224:                        vor             v25,v0,v0                                                       ; Copy into the next register
                    225:                        vor             v26,v0,v0                                                       ; Copy into the next register
                    226:                        vor             v27,v0,v0                                                       ; Copy into the next register
                    227:                        vor             v28,v0,v0                                                       ; Copy into the next register
                    228:                        vor             v29,v0,v0                                                       ; Copy into the next register
                    229:                        vor             v30,v0,v0                                                       ; Copy into the next register
                    230:                        vor             v31,v0,v0                                                       ; Copy into the next register
                    231: 
                    232:                        cmplwi  r30,1                                                           ; Are we the boot processor?
                    233:                        mfspr   r11,msscr0                                                      ; Get the memory system control register
                    234:                        dssall                                                                          ; Force all data stream stuff to stop
                    235:                        oris    r11,r11,hi16(dl1hwfm)                           ; Turn on the hardware flush request
                    236:                        sync
                    237:                        beq             invl1                                                           ; Not boot, invalidate L1...
                    238:                        
                    239:                        mtspr   msscr0,r11                                                      ; Start the flush operation
                    240:                        
                    241: rstbsy:                mfspr   r11,msscr0                                                      ; Get the control register again
                    242:                        
                    243:                        rlwinm. r11,r11,0,dl1hwf,dl1hwf                         ; Has the flush request been reset yet?
                    244:                        bne             rstbsy                                                          ; No, flush is still in progress...
                    245:                        
                    246:                        sync                                                                            ; Make sure all flushes have been committed
                    247:                        b               setmck                                                          ; Go set mck handling...
                    248:                        
                    249: invl1:         mfspr   r8,hid0                                                         ; Set the HID0 bits for enable, and invalidate
                    250:                        ori             r8,r8,lo16(0x0000CC00)                          ; Do an isync just incase the cache was off 
                    251:                        sync
                    252:                        isync                                                                           ; Start the invalidate 
                    253:                        mtspr   hid0,r8                                                         ; To finish the invalidate clear the inval bits
                    254:                        li              r9,lo16(0x00000C00)
                    255:                        andc    r8,r8,r9                                                        ; End the invalidate
                    256:                        mtspr   hid0,r8                                                         ; Make sure all is done
                    257:                        sync                                                                            ; Make sure it is really done
                    258:                        sync
                    259:                        
                    260: setmck:                mfspr   r11,hid0                                                        ; ?
                    261:                        ori             r11,r11,hi16(eiecm)                                     ; ?
                    262:                        mtspr   hid0,r11                                                        ; ?
                    263:                        isync
                    264:                        
                    265: #if 0
                    266: ;                      (TEST/DEBUG) Flush and turn off L2 Cache so I can display memory with the durn ESP unit
                    267:                        b               flushl2                                                         ; (TEST/DEBUG) Jump to start
                    268: 
                    269:                        .align  5                                                                       ; (TEST/DEBUG) Force alignment to cache
                    270:                        nop
                    271:                        nop
                    272:                        nop
                    273:                        nop
                    274:                        nop
                    275: flushl2:       mfspr   r11,l2cr                                                        ; (TEST/DEBUG) Get L2 control register
                    276:                        ori             r11,r11,0x0800                                          ; (TEST/DEBUG) Turn on L2 hardware flush request
                    277:                        sync                                                                            ; (TEST/DEBUG) 
                    278: 
                    279: ;                      Cache boundary here 
                    280: ;                      The following flush and cache disable are all in the same line
                    281: 
                    282:                        mtspr   l2cr,r11                                                        ; (TEST/DEBUG) Start the flush
                    283:                        
                    284: flushl2d:      mfspr   r11,l2cr                                                        ; (TEST/DEBUG) Get the control reg again
                    285:                        rlwinm. r8,r11,0,20,20                                          ; (TEST/DEBUG) Have we finished?
                    286:                        bne             flushl2d                                                        ; (TEST/DEBUG) Nope...
                    287:                        sync                                                                            ; (TEST/DEBUG) 
                    288:                        rlwinm  r11,r11,0,1,31                                          ; (TEST/DEBUG) Turn off L2
                    289:                        mtspr   l2cr,r11                                                        ; (TEST/DEBUG) Finish it
                    290:                        sync                                                                            ; (TEST/DEBUG) Quiet down
                    291: 
                    292: ;                      Cache boundary here 
                    293: ;                      Invalidate the L2 cache, just for funsies...
                    294: 
                    295:                        oris    r8,r11,0x0020                                           ; (TEST/DEBUG) Turn on invalidate request
                    296:                        mtspr   l2cr,r8                                                         ; (TEST/DEBUG) Start invalidation
                    297:                        sync                                                                            ; (TEST/DEBUG)
                    298: 
                    299: invl2:         mfspr   r8,l2cr                                                         ; (TEST/DEBUG) Get the L2 control register
                    300:                        rlwinm. r8,r8,0,31,31                                           ; (TEST/DEBUG) Is the invalidation still going on?
                    301:                        bne+    invl2                                                           ; (TEST/DEBUG) Yes, keep going...
                    302:                        
                    303:                        mtspr   l2cr,r11                                                        ; (TEST/DEBUG) Turn off invalidate request, leaving L2 disabled
                    304:                        sync
                    305: ;                      Cache boundary here 
                    306: #endif                 
                    307:                        b               invcache                                                        ; (TEST/DEBUG) Now, go invalidate level 1...
                    308: 
                    309: 
                    310: novmx:
                    311: /*
                    312:  *                     We need to have our memory coherent, but we may not be here.  If we just switch the 
                    313:  *                     BATs, we could end up with memory paradoxes, i.e., cache entries left over from
                    314:  *                     when the memory was incoherent, just babbling away...  To prevent this, we have to get
                    315:  *                     rid of all non-coherent lines.  Since we just loaded the system, we could have tons
                    316:  *                     of lines with and unknown address ranges, so we would have to do a whole slew of DCBSTs
                    317:  *                     to force them all out.  We can't just flash invalidate, 'cause we'd lose a few lines.
                    318:  *                     So, we go translate off, load up some safe lines (from the ROM), and then flash invalidate 
                    319:  *                     the caches.  We don't do this for a 601 'cause there ain't no DBATs or flash invalidate.
                    320:  */
                    321:                        
                    322:                        
                    323: realcode:      lis             r8,0xFFF0                                                       /* Point to the ROM */
                    324:                        addis   r9,r8,0x0002                                            /* Point 128k later */
                    325:                        subi    r8,r8,32                                                        /* Start back one */
                    326:                        
                    327: readROM:       lwz             r10,32(r8)                                                      /* Get a line into cache */
                    328:                        addi    r8,r8,32
                    329:                        cmplw   cr0,r8,r9                                                       /* See if we're done */
                    330:                        blt+    readROM                                                         /* Do it all... */
                    331:                        
                    332:                        sync
                    333: 
                    334:                
                    335: invcache:
                    336:                        mfspr   r8,hid0                                                         ; Turn on the L1 and invalidate it
                    337:                        ori             r8,r8,lo16(0x0000CC00)                          ; Set the HID0 bits for enable, and invalidate
                    338:                        isync                                                                           ; Do an isync just incase the cache was off
                    339:                        mtspr   hid0,r8                                                         ; Start the invalidate
                    340:                        li              r9,lo16(0x00000C00)                                     ; To finish the invalidate clear the inval bits
                    341:                        andc    r8,r8,r9
                    342:                        mtspr   hid0,r8                                                         ; End the invalidate
                    343:                        sync                                                                            ; Make sure all is done
                    344:                        sync                                                                            ; Make sure it is really done 
                    345: 
                    346: /* */
                    347: /*                     Clear out the TLB.  They be garbage after hard reset. */
                    348: /* */
                    349: 
                    350:                        lis             r12,hi16(EXT(tlb_system_lock))          /* Get the TLBIE lock */
                    351:                        li              r0,512                                                          /* Get number of TLB entries (overestimate at 512 entries) */
                    352:                        ori             r12,r12,lo16(EXT(tlb_system_lock))      /* Grab up the bottom part */
                    353:                        li              r3,0                                                            /* Start at 0 */
                    354: 
                    355:                        lwarx   r5,0,r12                                                        ; ?
                    356: 
                    357: itlbhang:      lwarx   r5,0,r12                                                        /* Get the TLBIE lock */
                    358:                        mr.             r5,r5                                                           /* Is it locked? */
                    359:                        bne-    itlbhang                                                        /* It's locked, go wait... */
                    360:                        stwcx.  r0,0,r12                                                        /* Try to get it */
                    361:                        bne-    itlbhang                                                        /* We was beat... */
                    362: 
                    363:                        mtctr   r0                                                                      /* Set the CTR */
                    364:                        
                    365: IRpurgeTLB:    tlbie   r3                                                                      /* Purge this entry */
                    366:                        addi    r3,r3,4096                                                      /* Next page */
                    367:                        bdnz    IRpurgeTLB                                                      /* Do 'em all... */
                    368:                        
                    369:                        sync                                                                            /* Make sure all TLB purges are done */
                    370: 
                    371:                        mfpvr   r10
                    372:                        rlwinm  r10,r10,16,16,31
                    373: 
                    374:                        eieio                                                                           /* Make sure that the tlbie happens first */
                    375:                        
                    376:                        cmplwi  r10,PROCESSOR_VERSION_603                       /* Got a 603 */
                    377:                        beq             donttsync                                                       /* Yeah, don't sync... */
                    378: 
                    379:                        cmplwi  r10,PROCESSOR_VERSION_603e                      /* Got a 603e */
                    380:                        beq             donttsync                                                       /* Yeah, don't sync... */
                    381: 
                    382:                        cmplwi  r10,PROCESSOR_VERSION_750                       /* Got a 750 */
                    383:                        beq             donttsync                                                       /* Yeah, don't sync... */
                    384: 
                    385:                        tlbsync                                                                         /* Make sure on other processors also */
                    386:                        sync                                                                            /* Make sure the TLBSYNC is done */
                    387:        
                    388: donttsync:     stw             r5,0(r12)                                                       ; Unlock the TLBIE interlock    
                    389: 
                    390:                        li              r0,MSR_SUPERVISOR_INT_OFF|MASK(MSR_FP)          /* Make sure we don't have ints enabled */
                    391:                        mtmsr   r0                                                                      /* Set the standard MSR values */
                    392:                        isync
                    393:                        
                    394:                        lis             r5,HIGH_ADDR(EXT(FloatInit))            /* Get top of floating point init value */
                    395:                        ori             r5,r5,LOW_ADDR(EXT(FloatInit))          /* Slam bottom */
                    396:                        lfd             f0,0(r5)                                                        /* Initialize FP0 */
                    397:                        fmr             f1,f0                                                           /* Ours in not */                                       
                    398:                        fmr             f2,f0                                                           /* to wonder why, */
                    399:                        fmr             f3,f0                                                           /* ours is but to */
                    400:                        fmr             f4,f0                                                           /* do or die! */
                    401:                        fmr             f5,f0                                           
                    402:                        fmr             f6,f0                                           
                    403:                        fmr             f7,f0                                           
                    404:                        fmr             f8,f0                                           
                    405:                        fmr             f9,f0                                           
                    406:                        fmr             f10,f0                                          
                    407:                        fmr             f11,f0                                          
                    408:                        fmr             f12,f0                                          
                    409:                        fmr             f13,f0                                          
                    410:                        fmr             f14,f0                                          
                    411:                        fmr             f15,f0                                          
                    412:                        fmr             f16,f0                                          
                    413:                        fmr             f17,f0                                          
                    414:                        fmr             f18,f0                                          
                    415:                        fmr             f19,f0                                          
                    416:                        fmr             f20,f0                                          
                    417:                        fmr             f21,f0                                          
                    418:                        fmr             f22,f0                                          
                    419:                        fmr             f23,f0                                          
                    420:                        fmr             f24,f0                                          
                    421:                        fmr             f25,f0                                          
                    422:                        fmr             f26,f0                                          
                    423:                        fmr             f27,f0                                          
                    424:                        fmr             f28,f0                                          
                    425:                        fmr             f29,f0                                          
                    426:                        fmr             f30,f0                                          
                    427:                        fmr             f31,f0                                          
                    428:                
                    429:                        li              r0,     MSR_SUPERVISOR_INT_OFF                  /* Make sure we don't have FP enabled */
                    430:                        mtmsr   r0                                                                      /* Set the standard MSR values */
                    431:                        isync
                    432: 
                    433: #if 0
                    434:                        li              r3,0                            /* (TEST/DEBUG) */
                    435:                        bl              EXT(fwSCCinit)          /* (TEST/DEBUG) */
                    436: #endif
                    437: #if 0
                    438:                        li              r3,1                            /* (TEST/DEBUG) */
                    439:                        bl              EXT(fwSCCinit)          /* (TEST/DEBUG) */
                    440: #endif
                    441: 
                    442:                        lis             r20,HIGH_ADDR(fwdisplock)       /* Get address of the firmware display lock */
                    443:                        li              r19,0                                           /* Zorch a register */
                    444:                        ori             r20,r20,LOW_ADDR(fwdisplock)    /* Get address of the firmware display lock */
                    445:                        stw             r19,0(r20)                                      /* Make sure the lock is free */
                    446: 
                    447: #if 0
                    448:                        li              r3,0                            /* (TEST/DEBUG) */
                    449:                        lis             r4,0x6D65                       /* (TEST/DEBUG) 'memg' */
                    450:                        ori             r4,r4,0x6D67            /* (TEST/DEBUG) */
                    451:                        li              r5,0                            /* (TEST/DEBUG) */
                    452:                        bl              EXT(dbgDispLL)          /* (TEST/DEBUG) */
                    453: #endif
                    454:                        cmpi    cr0, r30, 1
                    455:                        beq             callcpu
                    456:        /* move onto interrupt stack */
                    457: 
                    458:                        lis             r29,HIGH_ADDR(EXT(intstack_top_ss))
                    459:                        ori             r29,r29,LOW_ADDR(EXT(intstack_top_ss))
                    460: #if 0
                    461:                        li              r3,0                            /* (TEST/DEBUG) */
                    462:                        lis             r4,0x7232                       /* (TEST/DEBUG) 'r29a' */
                    463:                        ori             r4,r4,0x3961            /* (TEST/DEBUG) */
                    464:                        mr              r5,r29                          /* (TEST/DEBUG) */
                    465:                        bl              EXT(dbgDispLL)          /* (TEST/DEBUG) */
                    466: #endif
                    467:                        lwz             r29,0(r29)
                    468: #if 0
                    469:                        li              r3,0                            /* (TEST/DEBUG) */
                    470:                        lis             r4,0x7232                       /* (TEST/DEBUG) 'r29b' */
                    471:                        ori             r4,r4,0x3962            /* (TEST/DEBUG) */
                    472:                        mr              r5,r29                          /* (TEST/DEBUG) */
                    473:                        bl              EXT(dbgDispLL)          /* (TEST/DEBUG) */
                    474: #endif
                    475: 
                    476:        li      r28,    0
                    477:        stw     r28,    FM_BACKPTR(r29) /* store a null frame backpointer */
                    478: 
                    479:        /* move onto new stack */
                    480:        
                    481: #if 0
                    482:                        li              r3,0                            /* (TEST/DEBUG) */
                    483:                        lis             r4,0x676F                       /* (TEST/DEBUG) 'gogo' */
                    484:                        ori             r4,r4,0x676F            /* (TEST/DEBUG) */
                    485:                        mr              r5,r29                          /* (TEST/DEBUG) */
                    486:                        bl              EXT(dbgDispLL)          /* (TEST/DEBUG) */
                    487: #endif
                    488: 
                    489:                        mr              r1,r29
                    490:                        mr              r3,r31                          /* Restore any arguments we may have trashed */
                    491: 
                    492:                        bl      EXT(ppc_init)
                    493: 
                    494:                        /* Should never return */
                    495: 
                    496:                        BREAKPOINT_TRAP
                    497: 
                    498: callcpu:
                    499:                        /* move onto interrupt stack */
                    500:                        lwz             r29,PP_INTSTACK_TOP_SS(r31)
                    501:                        li              r28,    0
                    502:                        stw             r28,    FM_BACKPTR(r29) /* store a null frame backpointer */
                    503: 
                    504:                        /* move onto new stack */
                    505:                        mr              r1,r29
                    506:                        mr              r3,r31                          /* Restore any arguments we may have trashed */
                    507: 
                    508:                        bl      EXT(ppc_init_cpu)
                    509: 
                    510:                        /* Should never return */
                    511: 
                    512:                        BREAKPOINT_TRAP
                    513: 

unix.superglobalmegacorp.com

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