profile.h revision 1.10 1 1.10 ryo /* $NetBSD: profile.h,v 1.10 2021/11/02 11:22:03 ryo 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.8 matt #ifdef _KERNEL_OPT
30 1.8 matt #include "opt_ppcarch.h"
31 1.8 matt #endif
32 1.8 matt
33 1.6 briggs #define _MCOUNT_DECL void __mcount
34 1.2 thorpej
35 1.7 ross #ifdef _LP64
36 1.7 ross
37 1.7 ross #define MCOUNT \
38 1.7 ross __asm(" .globl _mcount \n" \
39 1.7 ross " .section \".opd\",\"aw\" \n" \
40 1.7 ross " .align 3 \n" \
41 1.7 ross "_mcount: \n" \
42 1.7 ross " .quad ._mcount,.TOC.@tocbase,0\n" \
43 1.7 ross " .previous \n" \
44 1.7 ross " .size _mcount,24 \n" \
45 1.7 ross " .type ._mcount,@function \n" \
46 1.7 ross " .globl ._mcount \n" \
47 1.7 ross " .align 3 \n" \
48 1.7 ross "._mcount: \n" \
49 1.7 ross " frame=128 \n" \
50 1.7 ross " stdu 1,-frame(1) \n" \
51 1.7 ross " std 2,120(1) \n" \
52 1.7 ross " std 3,48+0(1) \n" \
53 1.7 ross " std 4,48+8(1) \n" \
54 1.7 ross " std 5,48+16(1) \n" \
55 1.7 ross " std 6,48+24(1) \n" \
56 1.7 ross " std 7,48+32(1) \n" \
57 1.7 ross " std 8,48+40(1) \n" \
58 1.7 ross " std 9,48+48(1) \n" \
59 1.7 ross " std 10,48+56(1) \n" \
60 1.7 ross " \n" \
61 1.7 ross " mflr 4 \n" \
62 1.7 ross " std 4,112(1) \n" \
63 1.7 ross " ld 3,frame+16(1) \n" \
64 1.7 ross " bl .__mcount \n" \
65 1.7 ross " ld 2,120(1) \n" \
66 1.7 ross " ld 3,frame+16(1) \n" \
67 1.7 ross " mtlr 3 \n" \
68 1.7 ross " ld 4,112(1) \n" \
69 1.7 ross " mtctr 4 \n" \
70 1.7 ross " \n" \
71 1.7 ross " ld 3,16(1) \n" \
72 1.7 ross " ld 4,20(1) \n" \
73 1.7 ross " ld 5,24(1) \n" \
74 1.7 ross " ld 6,28(1) \n" \
75 1.7 ross " ld 7,32(1) \n" \
76 1.7 ross " ld 8,36(1) \n" \
77 1.7 ross " ld 9,40(1) \n" \
78 1.7 ross " ld 10,44(1) \n" \
79 1.7 ross " addi 1,1,frame \n" \
80 1.7 ross " bctr");
81 1.7 ross
82 1.7 ross #else
83 1.7 ross
84 1.9 joerg #ifdef __PIC__
85 1.4 tsubai #define _PLT "@plt"
86 1.4 tsubai #else
87 1.4 tsubai #define _PLT
88 1.4 tsubai #endif
89 1.2 thorpej
90 1.6 briggs #define MCOUNT \
91 1.6 briggs __asm(" .globl _mcount \n" \
92 1.6 briggs " .type _mcount,@function \n" \
93 1.6 briggs "_mcount: \n" \
94 1.6 briggs " stwu 1,-64(1) \n" \
95 1.6 briggs " stw 3,16(1) \n" \
96 1.6 briggs " stw 4,20(1) \n" \
97 1.6 briggs " stw 5,24(1) \n" \
98 1.6 briggs " stw 6,28(1) \n" \
99 1.6 briggs " stw 7,32(1) \n" \
100 1.6 briggs " stw 8,36(1) \n" \
101 1.6 briggs " stw 9,40(1) \n" \
102 1.6 briggs " stw 10,44(1) \n" \
103 1.6 briggs " \n" \
104 1.6 briggs " mflr 4 \n" \
105 1.6 briggs " stw 4,48(1) \n" \
106 1.6 briggs " lwz 3,68(1) \n" \
107 1.6 briggs " bl __mcount" _PLT " \n" \
108 1.6 briggs " lwz 3,68(1) \n" \
109 1.6 briggs " mtlr 3 \n" \
110 1.6 briggs " lwz 4,48(1) \n" \
111 1.6 briggs " mtctr 4 \n" \
112 1.6 briggs " \n" \
113 1.6 briggs " lwz 3,16(1) \n" \
114 1.6 briggs " lwz 4,20(1) \n" \
115 1.6 briggs " lwz 5,24(1) \n" \
116 1.6 briggs " lwz 6,28(1) \n" \
117 1.6 briggs " lwz 7,32(1) \n" \
118 1.6 briggs " lwz 8,36(1) \n" \
119 1.6 briggs " lwz 9,40(1) \n" \
120 1.6 briggs " lwz 10,44(1) \n" \
121 1.6 briggs " addi 1,1,64 \n" \
122 1.6 briggs " bctr \n" \
123 1.6 briggs "_mcount_end: \n" \
124 1.6 briggs " .size _mcount,_mcount_end-_mcount");
125 1.3 thorpej
126 1.7 ross #endif
127 1.7 ross
128 1.3 thorpej #ifdef _KERNEL
129 1.8 matt #ifdef PPC_BOOKE
130 1.8 matt #include <powerpc/booke/cpuvar.h>
131 1.8 matt
132 1.8 matt #define MCOUNT_ENTER do s = wrtee(0); while (/*CONSTCOND*/ 0)
133 1.8 matt #define MCOUNT_EXIT wrtee(s)
134 1.8 matt #else
135 1.10 ryo #include <powerpc/psl.h>
136 1.5 tsubai #define MCOUNT_ENTER \
137 1.5 tsubai __asm volatile("mfmsr %0" : "=r"(s)); \
138 1.5 tsubai if ((s & (PSL_IR | PSL_DR)) != (PSL_IR | PSL_DR)) \
139 1.5 tsubai return; /* XXX */ \
140 1.5 tsubai s &= ~PSL_POW; \
141 1.5 tsubai __asm volatile("mtmsr %0" :: "r"(s & ~PSL_EE))
142 1.5 tsubai
143 1.5 tsubai #define MCOUNT_EXIT \
144 1.5 tsubai __asm volatile("mtmsr %0" :: "r"(s))
145 1.3 thorpej #endif
146 1.8 matt
147 1.8 matt #endif
148