|
|
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_INTERNAL_USE_ONLY@
24: */
25:
26: /*
27: Performance.s
28:
29: Handle things that should are related to the hardware performance monitor
30:
31: Lovingly crafted by Bill Angell using traditional methods and only natural or recycled materials.
32: No more than 7500 chinchillas were killed in the production of the code.
33:
34: */
35:
36: #include <ppc/asm.h>
37: #include <ppc/proc_reg.h>
38: #include <ppc/POWERMAC/mp/MPPlugIn.h>
39: #include <ppc/exception.h>
40: #include <ppc/Performance.h>
41: #include <mach/machine/vm_param.h>
42: #include <assym.s>
43:
44: #if PERF_HIST
45: /*
46: * This routine is used to interface to the performance monitor
47: */
48:
49: ENTRY(PerfCtl, TAG_NO_FRAME_USED)
50:
51: lis r0,PerfCtlCall@h /* Get the top part of the SC number */
52: ori r0,r0,PerfCtlCall@l /* and the bottom part */
53: sc /* Do it to it */
54: blr /* Bye bye, Birdie... */
55:
56:
57: ENTRY(PerfCtlLL, TAG_NO_FRAME_USED)
58:
59: cmplwi r3,maxPerf /* See if we are within range */
60: mflr r11 /* Get the return point */
61: li r3,0 /* Show failure */
62: bgelrl- /* Load up current address and, also, leave if out of range */
63: prfBase: mflr r12 /* Get our address */
64: rlwinm r10,r3,2,0,31 /* Get displacement into branch table */
65: addi r12,r12,prfBrnch-prfBase /* Point to the branch address */
66: add r12,r12,r10 /* Point to the branch */
67: mtlr r12 /* Get it in the link register */
68: blr /* Vector to the specific performance command... */
69:
70: prfBrnch: b prfClear /* Clear the histogram table */
71: b prfStart /* Start the performance monitor */
72: b prfStop /* Stop the performance monitor */
73: b prfMap /* Map the histogram into an address space */
74: .equ maxPerf, (.-prfBrnch)/4 /* Set the highest valid address */
75:
76: /*
77: * Clear the monitor histogram
78: */
79: prfClear:
80: li r4,PMIhist@l /* We know this to be in page 0, so no need for the high part */
81: lis r8,PMIHIST_SIZE@h /* Get high half of the table size */
82: lwz r4,0(r4) /* Get the real address of the histgram */
83: ori r8,r8,PMIHIST_SIZE@l /* Get the low half of the table size */
84: li r6,32 /* Get a displacement */
85: li r3,1 /* Set up a good return code */
86: mtlr r11 /* Restore the return address */
87:
88: clrloop: subi r8,r8,32 /* Back off a cache line */
89: dcbz 0,r4 /* Do the even line */
90: sub. r8,r8,r6 /* Back off a second time (we only do this to generate a CR */
91: dcbz r6,r4 /* Clear the even line */
92: addi r4,r4,64 /* Move up to every other line */
93: bgt+ clrloop /* Go until we've done it all... */
94:
95: blr /* Leave... */
96:
97: /*
98: * Start the monitor histogram
99: */
100: prfStart:
101: mtlr r11 /* Restore the return address */
102: blr /* Return... */
103:
104: /*
105: * Stop the monitor histogram
106: */
107: prfStop:
108: mtlr r11 /* Restore the return address */
109: blr /* Return... */
110:
111: /*
112: * Maps the monitor histogram into another address space
113: */
114: prfMap:
115: mtlr r11 /* Restore the return address */
116: blr /* Return... */
117:
118: #endif
119:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.