profile.h revision 1.7 1 1.7 ross /* $NetBSD: profile.h,v 1.7 2006/07/07 21:28:03 ross Exp $ */
2 1.5 tsubai
3 1.5 tsubai /*-
4 1.5 tsubai * Copyright (c) 2000 Tsubai Masanari. All rights reserved.
5 1.5 tsubai *
6 1.5 tsubai * Redistribution and use in source and binary forms, with or without
7 1.5 tsubai * modification, are permitted provided that the following conditions
8 1.5 tsubai * are met:
9 1.5 tsubai * 1. Redistributions of source code must retain the above copyright
10 1.5 tsubai * notice, this list of conditions and the following disclaimer.
11 1.5 tsubai * 2. Redistributions in binary form must reproduce the above copyright
12 1.5 tsubai * notice, this list of conditions and the following disclaimer in the
13 1.5 tsubai * documentation and/or other materials provided with the distribution.
14 1.5 tsubai * 3. The name of the author may not be used to endorse or promote products
15 1.5 tsubai * derived from this software without specific prior written permission.
16 1.5 tsubai *
17 1.5 tsubai * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 1.5 tsubai * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 1.5 tsubai * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 1.5 tsubai * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 1.5 tsubai * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 1.5 tsubai * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 1.5 tsubai * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 1.5 tsubai * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 1.5 tsubai * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 1.5 tsubai * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 1.5 tsubai */
28 1.2 thorpej
29 1.6 briggs #define _MCOUNT_DECL void __mcount
30 1.2 thorpej
31 1.7 ross #ifdef _LP64
32 1.7 ross
33 1.7 ross #define MCOUNT \
34 1.7 ross __asm(" .globl _mcount \n" \
35 1.7 ross " .section \".opd\",\"aw\" \n" \
36 1.7 ross " .align 3 \n" \
37 1.7 ross "_mcount: \n" \
38 1.7 ross " .quad ._mcount,.TOC.@tocbase,0\n" \
39 1.7 ross " .previous \n" \
40 1.7 ross " .size _mcount,24 \n" \
41 1.7 ross " .type ._mcount,@function \n" \
42 1.7 ross " .globl ._mcount \n" \
43 1.7 ross " .align 3 \n" \
44 1.7 ross "._mcount: \n" \
45 1.7 ross " frame=128 \n" \
46 1.7 ross " stdu 1,-frame(1) \n" \
47 1.7 ross " std 2,120(1) \n" \
48 1.7 ross " std 3,48+0(1) \n" \
49 1.7 ross " std 4,48+8(1) \n" \
50 1.7 ross " std 5,48+16(1) \n" \
51 1.7 ross " std 6,48+24(1) \n" \
52 1.7 ross " std 7,48+32(1) \n" \
53 1.7 ross " std 8,48+40(1) \n" \
54 1.7 ross " std 9,48+48(1) \n" \
55 1.7 ross " std 10,48+56(1) \n" \
56 1.7 ross " \n" \
57 1.7 ross " mflr 4 \n" \
58 1.7 ross " std 4,112(1) \n" \
59 1.7 ross " ld 3,frame+16(1) \n" \
60 1.7 ross " bl .__mcount \n" \
61 1.7 ross " ld 2,120(1) \n" \
62 1.7 ross " ld 3,frame+16(1) \n" \
63 1.7 ross " mtlr 3 \n" \
64 1.7 ross " ld 4,112(1) \n" \
65 1.7 ross " mtctr 4 \n" \
66 1.7 ross " \n" \
67 1.7 ross " ld 3,16(1) \n" \
68 1.7 ross " ld 4,20(1) \n" \
69 1.7 ross " ld 5,24(1) \n" \
70 1.7 ross " ld 6,28(1) \n" \
71 1.7 ross " ld 7,32(1) \n" \
72 1.7 ross " ld 8,36(1) \n" \
73 1.7 ross " ld 9,40(1) \n" \
74 1.7 ross " ld 10,44(1) \n" \
75 1.7 ross " addi 1,1,frame \n" \
76 1.7 ross " bctr");
77 1.7 ross
78 1.7 ross #else
79 1.7 ross
80 1.4 tsubai #ifdef PIC
81 1.4 tsubai #define _PLT "@plt"
82 1.4 tsubai #else
83 1.4 tsubai #define _PLT
84 1.4 tsubai #endif
85 1.2 thorpej
86 1.6 briggs #define MCOUNT \
87 1.6 briggs __asm(" .globl _mcount \n" \
88 1.6 briggs " .type _mcount,@function \n" \
89 1.6 briggs "_mcount: \n" \
90 1.6 briggs " stwu 1,-64(1) \n" \
91 1.6 briggs " stw 3,16(1) \n" \
92 1.6 briggs " stw 4,20(1) \n" \
93 1.6 briggs " stw 5,24(1) \n" \
94 1.6 briggs " stw 6,28(1) \n" \
95 1.6 briggs " stw 7,32(1) \n" \
96 1.6 briggs " stw 8,36(1) \n" \
97 1.6 briggs " stw 9,40(1) \n" \
98 1.6 briggs " stw 10,44(1) \n" \
99 1.6 briggs " \n" \
100 1.6 briggs " mflr 4 \n" \
101 1.6 briggs " stw 4,48(1) \n" \
102 1.6 briggs " lwz 3,68(1) \n" \
103 1.6 briggs " bl __mcount" _PLT " \n" \
104 1.6 briggs " lwz 3,68(1) \n" \
105 1.6 briggs " mtlr 3 \n" \
106 1.6 briggs " lwz 4,48(1) \n" \
107 1.6 briggs " mtctr 4 \n" \
108 1.6 briggs " \n" \
109 1.6 briggs " lwz 3,16(1) \n" \
110 1.6 briggs " lwz 4,20(1) \n" \
111 1.6 briggs " lwz 5,24(1) \n" \
112 1.6 briggs " lwz 6,28(1) \n" \
113 1.6 briggs " lwz 7,32(1) \n" \
114 1.6 briggs " lwz 8,36(1) \n" \
115 1.6 briggs " lwz 9,40(1) \n" \
116 1.6 briggs " lwz 10,44(1) \n" \
117 1.6 briggs " addi 1,1,64 \n" \
118 1.6 briggs " bctr \n" \
119 1.6 briggs "_mcount_end: \n" \
120 1.6 briggs " .size _mcount,_mcount_end-_mcount");
121 1.3 thorpej
122 1.7 ross #endif
123 1.7 ross
124 1.3 thorpej #ifdef _KERNEL
125 1.5 tsubai #define MCOUNT_ENTER \
126 1.5 tsubai __asm volatile("mfmsr %0" : "=r"(s)); \
127 1.5 tsubai if ((s & (PSL_IR | PSL_DR)) != (PSL_IR | PSL_DR)) \
128 1.5 tsubai return; /* XXX */ \
129 1.5 tsubai s &= ~PSL_POW; \
130 1.5 tsubai __asm volatile("mtmsr %0" :: "r"(s & ~PSL_EE))
131 1.5 tsubai
132 1.5 tsubai #define MCOUNT_EXIT \
133 1.5 tsubai __asm volatile("mtmsr %0" :: "r"(s))
134 1.3 thorpej #endif
135