2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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.
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
20 * @APPLE_LICENSE_HEADER_END@
28 #include <mach_kgdb.h>
30 #include <ppc/proc_reg.h>
31 #include <mach/ppc/vm_param.h>
52 * Interrupt and bootup stack for initial processor
59 /* Align on page boundry */
61 /* Red zone for interrupt stack, one page (will be unmapped)*/
65 .globl EXT(FixedStackStart)
70 .set ., .+INTSTACK_SIZE*NCPUS
72 /* Debugger stack - used by the debugger if present */
73 /* NOTE!!! Keep the debugger stack right after the interrupt stack */
74 #if MACH_KDP || MACH_KDB
77 .set ., .+KERNEL_STACK_SIZE*NCPUS
79 .globl EXT(FixedStackEnd)
83 .globl EXT(intstack_top_ss)
85 .long EXT(intstack)+INTSTACK_SIZE-SS_SIZE /* intstack_top_ss points to the top of interrupt stack */
88 .globl EXT(debstack_top_ss)
91 .long EXT(debstack)+KERNEL_STACK_SIZE-SS_SIZE /* debstack_top_ss points to the top of debug stack */
93 .globl EXT(debstackptr)
95 .long EXT(debstack)+KERNEL_STACK_SIZE-SS_SIZE
97 #endif /* MACH_KDP || MACH_KDB */
100 * All CPUs start here.
102 * This code is called from SecondaryLoader
104 * Various arguments are passed via a table:
105 * ARG0 = pointer to other startup parameters
109 ENTRY(_start_cpu,TAG_NO_FRAME_USED)
110 crclr bootCPU ; Set non-boot processor
111 crclr firstInit ; Set not first time init
112 mr r30,r3 ; Set current per_proc
115 ; Note that we are just trying to get close. The real TB sync will take
116 ; place later. The value we are loading is set in two places. For the
117 ; main processor, it will be the TB at the last interrupt before we went
118 ; to sleep. For the others, it will be the time just before the main
119 ; processor woke us up.
122 lwz r15,ruptStamp(r3) ; Get the timebase from the other processor
123 li r17,0 ; Clear this out
124 lwz r16,ruptStamp+4(r3) ; Get the timebase from the other processor
125 mtspr tbl,r17 ; Clear bottom so we do not tick
126 mtspr tbu,r15 ; Set top
127 mtspr tbl,r16 ; Then bottom again
131 ENTRY(_start,TAG_NO_FRAME_USED)
133 lis r30,hi16(EXT(per_proc_info)) ; Set current per_proc
134 ori r30,r30,lo16(EXT(per_proc_info)) ; Set current per_proc
135 crset bootCPU ; Set boot processor
137 lwz r17,pfAvailable(r30) ; Get the available bits
138 rlwinm. r0,r17,0,pfValidb,pfValidb ; Have we initialized the feature flags yet?
139 crmove firstInit,cr0_eq ; Set if we are doing first time init
140 bne allstart ; Yeah, we must be waking up from sleep...
143 ; Here is where we do any one time general low-level initialization
145 lis r20,HIGH_ADDR(fwdisplock) ; Get address of the firmware display lock
146 li r19,0 ; Zorch a register
147 ori r20,r20,LOW_ADDR(fwdisplock) ; Get address of the firmware display lock
148 stw r19,0(r20) ; Make sure the lock is free
150 allstart: mr r31,r3 ; Save away arguments
151 lis r23,hi16(EXT(per_proc_info)) ; Set base per_proc
152 ori r23,r23,lo16(EXT(per_proc_info)) ; Set base per_proc
154 mtsprg 0,r30 ; Set the per_proc
156 mfspr r6,hid0 ; Get the HID0
157 li r7,MSR_VM_OFF ; Get real mode MSR
158 rlwinm r6,r6,0,sleep+1,doze-1 ; Remove any vestiges of sleep
159 mtspr hid0,r6 ; Set the insominac HID0
160 mtmsr r7 ; Set the real mode SRR
163 ; Map in the first 256Mb in both instruction and data BATs
165 li r7,((0x7FF<<2)|2) ; Set up for V=R 256MB in supervisor space
166 li r8,((2<<3)|2) ; Physical address = 0, coherent, R/W
167 li r9,0 ; Clear out a register
169 mtsprg 1,r9 ; Clear the extra SPRGs
175 mtdbatu 0,r7 ; Map bottom 256MB
176 mtdbatl 0,r8 ; Map bottom 256MB
177 mtdbatu 1,r9 ; Invalidate maps
178 mtdbatl 1,r9 ; Invalidate maps
179 mtdbatu 2,r9 ; Invalidate maps
180 mtdbatl 2,r9 ; Invalidate maps
181 mtdbatu 3,r9 ; Invalidate maps
182 mtdbatl 3,r9 ; Invalidate maps
185 mtibatu 0,r7 ; Map bottom 256MB
186 mtibatl 0,r8 ; Map bottom 256MB
187 mtibatu 1,r9 ; Invalidate maps
188 mtibatl 1,r9 ; Invalidate maps
189 mtibatu 2,r9 ; Invalidate maps
190 mtibatl 2,r9 ; Invalidate maps
191 mtibatu 3,r9 ; Invalidate maps
192 mtibatl 3,r9 ; Invalidate maps
196 lis r26,hi16(processor_types) ; Point to processor table
197 ori r26,r26,lo16(processor_types) ; Other half
198 mfpvr r10 ; Get the PVR
200 nextPVR: lwz r28,ptFilter(r26) ; Get the filter
201 lwz r27,ptVersion(r26) ; Get the version and revision codes
202 and r28,r10,r28 ; Throw away dont care bits
203 cmplw r27,r28 ; Is this the right set?
204 beq donePVR ; We have the right one...
205 addi r26,r26,ptSize ; Point to the next type
206 b nextPVR ; Check it out...
208 donePVR: lwz r20,ptInitRout(r26) ; Grab the special init routine
209 mtlr r20 ; Setup to call the init
211 bf firstInit,notFirst ; Not first boot, go...
214 ; The following code just does a general initialization of the features just
215 ; after the initial first-time boot. This is not done after waking up or on
216 ; any "secondary" processor.
218 ; We are just setting defaults. The specific initialization code will modify these
222 lwz r17,ptFeatures(r26) ; Pick up the features
224 lwz r13,ptRptdProc(r26) ; Get the reported processor
225 sth r13,pfrptdProc(r30) ; Set the reported processor
227 lwz r13,ptTempMax(r26) ; Get maximum operating temperature
228 stw r13,thrmmaxTemp(r30) ; Set the maximum
229 lwz r13,ptTempThr(r26) ; Get temprature to throttle down when exceeded
230 stw r13,thrmthrottleTemp(r30) ; Set the temperature that we throttle
232 lwz r13,ptLineSize(r26) ; Get the cache line size
233 sth r13,pflineSize(r30) ; Save it
234 lwz r13,ptl1iSize(r26) ; Get icache size
235 stw r13,pfl1iSize(r30) ; Save it
236 lwz r13,ptl1dSize(r26) ; Get dcache size
237 stw r13,pfl1dSize(r30) ; Save it
238 b doOurInit ; Go do processor specific initialization...
240 notFirst: lwz r17,pfAvailable(r30) ; Get our features
241 rlwinm. r0,r17,0,pfValidb,pfValidb ; Have we set up this CPU yet?
242 bne doOurInit ; Yeah, must be wakeup...
244 lis r23,hi16(EXT(per_proc_info)) ; Set base per_proc
245 ori r23,r23,lo16(EXT(per_proc_info)) ; Set base per_proc
247 la r7,pfAvailable(r30) ; Point to features of our processor
248 la r8,pfAvailable(r23) ; Point to features of boot processor
249 li r9,(pfSize+thrmSize)/4 ; Get size of a features area
251 cpyFeat: subi r9,r9,1 ; Count word
252 lwz r0,0(r8) ; Get boot cpu features
253 stw r0,0(r7) ; Copy to ours
254 mr. r9,r9 ; Finished?
255 addi r7,r7,4 ; Next out
256 addi r8,r8,4 ; Next in
257 bgt cpyFeat ; Copy all boot cpu features to us...
259 lwz r17,pfAvailable(r30) ; Get our newly initialized features
262 mr. r20,r20 ; See if initialization routine
263 crand firstBoot,bootCPU,firstInit ; Indicate if we are on the initial first processor startup
264 bnelrl ; Do the initialization
266 ori r17,r17,lo16(pfValid) ; Set the valid bit
267 stw r17,pfAvailable(r30) ; Set the available features
268 mtsprg 2,r17 ; Remember the feature flags
270 rlwinm. r0,r17,0,pfFloatb,pfFloatb ; See if there is floating point
271 beq- noFloat ; Nope, this is a really stupid machine...
273 li r0,MSR_VM_OFF|MASK(MSR_FP) ; Enable for floating point
274 mtmsr r0 /* Set the standard MSR values */
277 lis r5,HIGH_ADDR(EXT(FloatInit)) /* Get top of floating point init value */
278 ori r5,r5,LOW_ADDR(EXT(FloatInit)) /* Slam bottom */
279 lfd f0,0(r5) /* Initialize FP0 */
280 fmr f1,f0 /* Ours in not */
281 fmr f2,f0 /* to wonder why, */
282 fmr f3,f0 /* ours is but to */
283 fmr f4,f0 /* do or die! */
312 li r0, MSR_VM_OFF ; Turn off floating point
316 noFloat: rlwinm. r0,r17,0,pfAltivecb,pfAltivecb ; See if there is Altivec
317 beq- noVector ; Nope...
319 li r0,0 ; Clear out a register
321 lis r7,hi16(MSR_VEC_ON) ; Get real mode MSR + Altivec
322 ori r7,r7,lo16(MSR_VM_OFF) ; Get real mode MSR + Altivec
323 mtmsr r7 ; Set the real mode SRR */
324 isync ; Make sure it has happened
326 lis r5,hi16(EXT(QNaNbarbarian)) ; Altivec initializer
327 ori r5,r5,lo16(EXT(QNaNbarbarian)) ; Altivec initializer
329 mtspr vrsave,r0 ; Set that no VRs are used yet */
331 vspltisw v1,0 ; Clear a register
332 lvx v0,br0,r5 ; Initialize VR0
333 mtvscr v1 ; Clear the vector status register
334 vor v2,v0,v0 ; Copy into the next register
335 vor v1,v0,v0 ; Copy into the next register
336 vor v3,v0,v0 ; Copy into the next register
337 vor v4,v0,v0 ; Copy into the next register
338 vor v5,v0,v0 ; Copy into the next register
339 vor v6,v0,v0 ; Copy into the next register
340 vor v7,v0,v0 ; Copy into the next register
341 vor v8,v0,v0 ; Copy into the next register
342 vor v9,v0,v0 ; Copy into the next register
343 vor v10,v0,v0 ; Copy into the next register
344 vor v11,v0,v0 ; Copy into the next register
345 vor v12,v0,v0 ; Copy into the next register
346 vor v13,v0,v0 ; Copy into the next register
347 vor v14,v0,v0 ; Copy into the next register
348 vor v15,v0,v0 ; Copy into the next register
349 vor v16,v0,v0 ; Copy into the next register
350 vor v17,v0,v0 ; Copy into the next register
351 vor v18,v0,v0 ; Copy into the next register
352 vor v19,v0,v0 ; Copy into the next register
353 vor v20,v0,v0 ; Copy into the next register
354 vor v21,v0,v0 ; Copy into the next register
355 vor v22,v0,v0 ; Copy into the next register
356 vor v23,v0,v0 ; Copy into the next register
357 vor v24,v0,v0 ; Copy into the next register
358 vor v25,v0,v0 ; Copy into the next register
359 vor v26,v0,v0 ; Copy into the next register
360 vor v27,v0,v0 ; Copy into the next register
361 vor v28,v0,v0 ; Copy into the next register
362 vor v29,v0,v0 ; Copy into the next register
363 vor v30,v0,v0 ; Copy into the next register
364 vor v31,v0,v0 ; Copy into the next register
366 li r0, MSR_VM_OFF ; Turn off vectors
370 noVector: rlwinm. r0,r17,0,pfSMPcapb,pfSMPcapb ; See if we can do SMP
373 lhz r13,PP_CPU_NUMBER(r30) ; Get the CPU number
374 mtspr pir,r13 ; Set the PIR
376 noSMP: rlwinm. r0,r17,0,pfThermalb,pfThermalb ; See if there is an TAU
377 beq- noThermometer ; Nope...
379 li r13,0 ; Disable thermals for now
380 mtspr thrm3,r13 ; Do it
381 li r13,lo16(thrmtidm|thrmvm) ; Set for lower-than thermal event at 0 degrees
382 mtspr thrm1,r13 ; Do it
383 lis r13,hi16(thrmthrm) ; Set 127 degrees
384 ori r13,r13,lo16(thrmvm) ; Set for higher-than event
385 mtspr thrm2,r13 ; Set it
389 bl EXT(cacheInit) ; Initializes all caches (including the TLB)
391 li r0,MSR_SUPERVISOR_INT_OFF ; Make sure we do not have FP enabled
392 mtmsr r0 ; Set the standard MSR values
395 bf bootCPU,callcpu ; Not the boot processor...
397 lis r29,HIGH_ADDR(EXT(intstack_top_ss)) ; move onto interrupt stack
398 ori r29,r29,LOW_ADDR(EXT(intstack_top_ss))
402 stw r28,FM_BACKPTR(r29) ; store a null frame backpointer
405 mr r3,r31 ; Restore any arguments we may have trashed
407 bl EXT(ppc_init) ; Jump into boot init code
411 lwz r29,PP_INTSTACK_TOP_SS(r31) ; move onto interrupt stack
414 stw r28,FM_BACKPTR(r29) ; store a null frame backpointer
417 mr r1,r29 ; move onto new stack
418 mr r3,r31 ; Restore any arguments we may have trashed
420 bl EXT(ppc_init_cpu) ; Jump into cpu init code
421 BREAKPOINT_TRAP ; Should never return
424 ; Specific processor initialization routines
429 init750CX: bflr firstBoot ; No init for wakeup....
430 mfspr r13,hid1 ; Get HID1
431 li r14,lo16(0xFD5F) ; Get valid
432 rlwinm r13,r13,4,28,31 ; Isolate
433 slw r14,r14,r13 ; Position
434 rlwimi r17,r14,15-pfCanNapb,pfCanNapb,pfCanNapb ; Set it
435 b init750com ; Join common...
439 init750: bflr firstBoot ; No init for wakeup....
441 init750com: mfspr r13,l2cr ; Get the L2CR
442 rlwinm. r0,r13,0,l2e,l2e ; Any L2?
443 bne+ i750hl2 ; Yes...
444 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No L2, turn off feature
446 i750hl2: lis r14,hi16(256*1024) ; Base L2 size
447 addis r15,r13,0x3000 ; Hah... Figure this one out...
448 rlwinm r15,r15,4,30,31 ; Isolate
449 rlwinm. r8,r13,0,l2siz,l2sizf ; Was size valid?
450 slw r14,r14,r15 ; Set 256KB, 512KB, or 1MB
451 beq- init750none ; Not a valid setting...
453 stw r13,pfl2cr(r30) ; Shadow the L2CR
454 stw r14,pfl2Size(r30) ; Set the L2 size
458 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No level 2 cache
462 init7400: bf firstBoot,i7400nb ; Do different if not initial boot...
463 mfspr r13,l2cr ; Get the L2CR
464 rlwinm. r0,r13,0,l2e,l2e ; Any L2?
465 bne+ i7400hl2 ; Yes...
466 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No L2, turn off feature
468 i7400hl2: lis r14,hi16(256*1024) ; Base L2 size
469 addis r15,r13,0x3000 ; Hah... Figure this one out...
470 rlwinm r15,r15,4,30,31
471 slw r14,r14,r15 ; Set 256KB, 512KB, 1MB, or 2MB
473 stw r13,pfl2cr(r30) ; Shadow the L2CR
474 stw r14,pfl2Size(r30) ; Set the L2 size
476 mfspr r11,hid0 ; Get the current HID0
477 oris r11,r11,hi16(emcpm|eiecm) ; ?
480 stw r11,pfHID0(r30) ; Save the HID0 value
482 mfspr r11,msscr0 ; Get the msscr0 register
483 stw r11,pfMSSCR0(r30) ; Save the MSSCR0 value
484 mfspr r11,msscr1 ; Get the msscr1 register
485 stw r11,pfMSSCR1(r30) ; Save the MSSCR1 value
488 i7400nb: lwz r11,pfHID0(r30) ; Get HID0
490 mtspr hid0,r11 ; Set the HID
491 lwz r11,pfMSSCR0(r30) ; Get MSSCR0
494 mtspr msscr0,r11 ; Set the MSSCR0
495 lwz r11,pfMSSCR1(r30) ; Get msscr1
498 mtspr msscr1,r11 ; Set the msscr1
504 ; Note that this is the same as 7400 except we initialize the l2cr2 register
506 init7410: li r13,0 ; Clear
507 mtspr 1016,r13 ; Turn off direct cache
508 b init7400 ; Join up with common....
512 init7450: bf firstBoot,i7450nb ; Do different if not initial boot...
513 oris r17,r17,hi16(pfAvJava) ; Show that we do Java mode in non-open source version
515 mfspr r13,l2cr ; Get the L2CR
516 rlwinm. r0,r13,0,l2e,l2e ; Any L2?
517 bne+ i7450hl2 ; Yes...
518 rlwinm r17,r17,0,pfL2b+1,pfL2b-1 ; No L2, turn off feature
520 i7450hl2: lis r14,hi16(256*1024) ; Base L2 size
521 rlwinm r15,r13,22,12,13 ; Convert to 256k, 512k, or 768k
522 add r14,r14,r15 ; Add in minimum
524 stw r13,pfl2cr(r30) ; Shadow the L2CR
525 stw r14,pfl2Size(r30) ; Set the L2 size
527 ; Take care of level 3 cache
529 mfspr r13,l3cr ; Get the L3CR
530 rlwinm. r0,r13,0,l3e,l3e ; Any L2?
531 bne+ i7450hl3 ; Yes...
532 rlwinm r17,r17,0,pfL3b+1,pfL3b-1 ; No L2, turn off feature
534 i7450hl3: cmplwi cr0,r13,0 ; No L3 if L3CR is zero
535 beq- init7450none ; Go turn off the features...
536 lis r14,hi16(1024*1024) ; Base L3 size
537 rlwinm r15,r13,4,31,31 ; Get size multiplier
538 slw r14,r14,r15 ; Set 1 or 2MB
540 stw r13,pfl3cr(r30) ; Shadow the L3CR
541 stw r14,pfl3Size(r30) ; Set the L3 size
542 b init7450fin ; Return....
545 rlwinm r17,r17,0,pfL3fab+1,pfL3b-1 ; No 3rd level cache or assist
547 init7450fin: mfspr r11,hid0 ; Get the current HID0
548 stw r11,pfHID0(r30) ; Save the HID0 value
549 mfspr r11,hid1 ; Get the current HID1
550 stw r11,pfHID1(r30) ; Save the HID1 value
551 mfspr r11,msscr0 ; Get the msscr0 register
552 stw r11,pfMSSCR0(r30) ; Save the MSSCR0 value
553 mfspr r11,msscr1 ; Get the msscr1 register
554 stw r11,pfMSSCR1(r30) ; Save the MSSCR1 value
555 mfspr r11,ictrl ; Get the ictrl register
556 stw r11,pfICTRL(r30) ; Save the ICTRL value
557 mfspr r11,ldstcr ; Get the ldstcr register
558 stw r11,pfLDSTCR(r30) ; Save the LDSTCR value
562 i7450nb: lwz r11,pfHID0(r30) ; Get HID0
564 mtspr hid0,r11 ; Set the HID
566 lwz r11,pfHID1(r30) ; Get HID1
568 mtspr hid1,r11 ; Set the HID
570 lwz r11,pfMSSCR0(r30) ; Get MSSCR0
572 mtspr msscr0,r11 ; Set the MSSCR0
575 lwz r11,pfICTRL(r30) ; Get ICTRL
577 mtspr ictrl,r11 ; Set the ICTRL
580 lwz r11,pfLDSTCR(r30) ; Get LDSTCR
582 mtspr ldstcr,r11 ; Set the LDSTCR
589 ; Processor to feature table
591 ; .align 2 - Always on word boundary
592 ; .long ptFilter - Mask of significant bits in the Version/Revision code
593 ; - NOTE: Always order from most restrictive to least restrictive matching
594 ; .short ptVersion - Version code from PVR. Always start with 0 which is default
595 ; .short ptRevision - Revision code from PVR. A zero value denotes the generic attributes if not specific
596 ; .long ptFeatures - Available features
597 ; .long ptInitRout - Initilization routine. Can modify any of the other attributes.
598 ; .long ptRptdProc - Processor type reported
599 ; .long ptTempMax - Maximum operating temprature
600 ; .long ptTempThr - Temprature threshold. We throttle if above
601 ; .long ptLineSize - Level 1 cache line size
602 ; .long ptl1iSize - Level 1 instruction cache size
603 ; .long ptl1dSize - Level 1 data cache size
612 .long 0xFFFF0000 ; All revisions
613 .short PROCESSOR_VERSION_601
615 .long pfFloat | pfSMPcap | pfL1i | pfL1d
617 .long CPU_SUBTYPE_POWERPC_ALL
627 .long 0xFFFF0000 ; All revisions
628 .short PROCESSOR_VERSION_603
630 .long pfFloat | pfL1i | pfL1d
632 .long CPU_SUBTYPE_POWERPC_603
642 .long 0xFFFF0000 ; All revisions
643 .short PROCESSOR_VERSION_603e
645 .long pfFloat | pfL1i | pfL1d
647 .long CPU_SUBTYPE_POWERPC_603e
657 .long 0xFFFF0000 ; All revisions
658 .short PROCESSOR_VERSION_604
660 .long pfFloat | pfSMPcap | pfL1i | pfL1d
662 .long CPU_SUBTYPE_POWERPC_604
672 .long 0xFFFF0000 ; All revisions
673 .short PROCESSOR_VERSION_604e
675 .long pfFloat | pfSMPcap | pfL1i | pfL1d
677 .long CPU_SUBTYPE_POWERPC_604e
687 .long 0xFFFF0000 ; All revisions
688 .short PROCESSOR_VERSION_604ev
690 .long pfFloat | pfSMPcap | pfL1i | pfL1d
692 .long CPU_SUBTYPE_POWERPC_604e
702 .long 0xFFFFFFFF ; Exact match
703 .short PROCESSOR_VERSION_750
705 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pfL1i | pfL1d | pfL2
707 .long CPU_SUBTYPE_POWERPC_750
717 .long 0xFFFF0F00 ; 2.x vers
718 .short PROCESSOR_VERSION_750
720 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pfL1i | pfL1d | pfL2
722 .long CPU_SUBTYPE_POWERPC_750
732 .long 0xFFFF0000 ; All revisions
733 .short PROCESSOR_VERSION_750
735 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pfThermal | pfL1i | pfL1d | pfL2
737 .long CPU_SUBTYPE_POWERPC_750
747 .long 0xFFFF0000 ; All revisions
748 .short PROCESSOR_VERSION_7400
750 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfCanDoze | pfThermal | pfL1i | pfL1d | pfL1fa | pfL2 | pfL2fa
752 .long CPU_SUBTYPE_POWERPC_7400
762 .long 0xFFFFFFFF ; Exact match
763 .short PROCESSOR_VERSION_7400
765 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfCanDoze | pfL1i | pfL1d | pfL1fa | pfL2 | pfL2fa
767 .long CPU_SUBTYPE_POWERPC_7400
777 .long 0xFFFF0000 ; All other revisions
778 .short PROCESSOR_VERSION_7410
780 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfCanNap | pfCanDoze | pfL1i | pfL1d | pfL1fa | pfL2 | pfL2fa
782 .long CPU_SUBTYPE_POWERPC_7400
792 .long 0xFFFFFF00 ; Just revisions 1.xx
793 .short PROCESSOR_VERSION_7450
795 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfNoMSRir | pfL23lck | pfL1nnc | pfL1i | pfL1d | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa
797 .long CPU_SUBTYPE_POWERPC_7450
807 .long 0xFFFF0000 ; All other revisions
808 .short PROCESSOR_VERSION_7450
810 .long pfFloat | pfAltivec | pfSMPcap | pfCanSleep | pfNoMSRir | pfL23lck | pfL1i | pfL1d | pfL2 | pfL2fa | pfL2i | pfL3 | pfL3fa
812 .long CPU_SUBTYPE_POWERPC_7450
819 ; Default dumb loser machine
822 .long 0x00000000 ; Matches everything
825 .long pfFloat | pfL1i | pfL1d
827 .long CPU_SUBTYPE_POWERPC_ALL