|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.