Annotation of XNU/pexpert/ppc/pe_clock_speed_asm.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:  *  clock_speed_asm.s - Uses the Via timer, decrementer, and counter
                     24:  *                     to determine the clock and bus rates.
                     25:  *
                     26:  *  (c) Apple Computer, Inc. 1998-9
                     27:  *
                     28:  *  Writen by:  Josh de Cesare
                     29:  *
                     30:  */
                     31: 
                     32: #include <ppc/asm.h>
                     33: 
                     34: // constants for the via
                     35: #define CountLow  0x800
                     36: #define CountHigh 0xa00
                     37: #define LatchLow  0xc00
                     38: #define LatchHigh 0xe00
                     39: 
                     40: 
                     41: // void pe_run_clock_test(clock_test_data *data)
                     42: //
                     43: // data points to the base address of the via and two longs
                     44: // for storing the via and dec results.
                     45: //
                     46: // The basic idea is this...
                     47: // Use the counter register to execute a loop that will take
                     48: // 10,000,000 processor clocks.  Time it using both the via counter
                     49: // and the time base.  Return the number of ticks for both so the
                     50: // raw values for processor and bus speed can be calculated.
                     51: ENTRY(pe_run_clock_test, TAG_NO_FRAME_USED)
                     52: 
                     53:        li      r4,     1               ; flag for cache load
                     54:        li      r5,     1               ; Only once through this time
                     55:        lwz     r9,     0(r3)           ; r9 is the via addr
                     56: 
                     57: L_again:
                     58:        mtctr   r5                      ; set the count
                     59:        li      r5,     0xff            ; Start the counter at 0xffff
                     60:        stb     r5,     CountLow(r9)    ; clear the via counter
                     61:        eieio
                     62:        stb     r5,     CountHigh(r9)
                     63:        eieio
                     64:        mftb    r10                     ; save starting value of the time base
                     65:        isync
                     66: 
                     67: L_loop:
                     68:        addi    r5,     r5,     1       ; 8 adds for 8 cycles
                     69:        addi    r5,     r5,     2       ; the bdnz should be 0 cycles
                     70:        addi    r5,     r5,     3
                     71:        addi    r5,     r5,     4
                     72:        addi    r5,     r5,     5
                     73:        addi    r5,     r5,     6
                     74:        addi    r5,     r5,     7
                     75:        addi    r5,     r5,     8
                     76:        bdnz    L_loop
                     77: 
                     78:        sync
                     79:        mftb    r5                      ; save the raw time base value
                     80:        lbz     r6,     CountHigh(r9)   ; get the via counter values
                     81:        eieio
                     82:        lbz     r7,     CountLow(r9)
                     83:        eieio
                     84:        lbz     r8,     CountHigh(r9)
                     85:        eieio
                     86: 
                     87:        cmpi    cr0,    r4,     1       ; see if the was the cache run
                     88:        bne     L_finish_up             ; nope, we are done.
                     89: 
                     90:        li      r4,     0               ; set flag for the real test
                     91:        li      r5,     0x12d0          ; set the initial count to 1.25e+6
                     92:        oris    r5,     r5,     0x13
                     93:        b       L_again
                     94: 
                     95: L_finish_up:
                     96:        cmpi    cr0,    r7,     0       ; if L1 is zero then H1 is good. 
                     97:        beq     L_use_H1                ; else H2 will be good.
                     98: 
                     99:        mr      r6,     r8              ; use H2 instead.
                    100: 
                    101: L_use_H1:
                    102:        rlwimi  r7,     r6,     8, 16, 23
                    103:        not     r6,     r7              ; neg - 1 is not
                    104:        andi.   r6,     r6,     0xffff
                    105:        stw     r6,     4(r3)           ; save via ticks
                    106: 
                    107:        sub     r5,     r5,     r10     ; r5 is the number of time base ticks
                    108:        stw     r5,     8(r3)           ; save time base ticks
                    109: 
                    110:         blr

unix.superglobalmegacorp.com

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