master
1/* $NetBSD: profile.h,v 1.25 2021/02/18 20:37:02 skrll Exp $ */
2
3/*
4 * Copyright (c) 1992, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Ralph Campbell.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 * @(#)profile.h 8.1 (Berkeley) 6/10/93
35 */
36
37#ifndef _MIPS_PROFILE_H_
38#define _MIPS_PROFILE_H_
39
40#if defined(_KERNEL_OPT)
41#include "opt_gprof.h"
42#endif
43
44#ifdef _KERNEL
45 /*
46 * Declare non-profiled _splhigh() /_splx() entrypoints for _mcount.
47 * see MCOUNT_ENTER and MCOUNT_EXIT.
48 */
49#define _KERNEL_MCOUNT_DECL \
50 int splhigh_noprof(void); \
51 void splx_noprof(int);
52#else /* !_KERNEL */
53/* Make __mcount static. */
54#define _KERNEL_MCOUNT_DECL static
55#endif /* !_KERNEL */
56
57#ifdef _KERNEL
58# define _PROF_CPLOAD ""
59#else
60# define _PROF_CPLOAD ".cpload $25;"
61#endif
62
63
64#define _MCOUNT_DECL \
65 _KERNEL_MCOUNT_DECL \
66 void __attribute__((unused)) __mcount
67
68#ifdef __mips_o32 /* 32-bit version */
69#define MCOUNT \
70 __asm(".globl _mcount;" \
71 ".type _mcount,@function;" \
72 "_mcount:;" \
73 ".set noreorder;" \
74 ".set noat;" \
75 _PROF_CPLOAD \
76 "addu $29,$29,-16;" \
77 "sw $4,8($29);" \
78 "sw $5,12($29);" \
79 "sw $6,16($29);" \
80 "sw $7,20($29);" \
81 "sw $1,0($29);" \
82 "sw $31,4($29);" \
83 "move $5,$31;" \
84 "move $4,$1;" \
85 "jal __mcount;" \
86 " nop;" \
87 "lw $4,8($29);" \
88 "lw $5,12($29);" \
89 "lw $6,16($29);" \
90 "lw $7,20($29);" \
91 "lw $31,4($29);" \
92 "lw $1,0($29);" \
93 "addu $29,$29,24;" \
94 "j $31;" \
95 " move $31,$1;" \
96 ".set reorder;" \
97 ".set at");
98#else /* 64-bit */
99#ifdef __mips_o64
100# error yeahnah
101#endif
102#define MCOUNT \
103 __asm(".globl _mcount;" \
104 ".type _mcount,@function;" \
105 "_mcount:;" \
106 ".set noreorder;" \
107 ".set noat;" \
108 _PROF_CPLOAD \
109 "daddu $29,$29,-80;"\
110 "sd $4,16($29);" \
111 "sd $5,24($29);" \
112 "sd $6,32($29);" \
113 "sd $7,40($29);" \
114 "sd $8,48($29);" \
115 "sd $9,56($29);" \
116 "sd $10,64($29);" \
117 "sd $11,72($29);" \
118 "sd $1,0($29);" \
119 "sd $31,8($29);" \
120 "move $5,$31;" \
121 "move $4,$1;" \
122 "jal __mcount;" \
123 " nop;" \
124 "ld $4,16($29);" \
125 "ld $5,24($29);" \
126 "ld $6,32($29);" \
127 "ld $7,40($29);" \
128 "ld $8,48($29);" \
129 "ld $9,56($29);" \
130 "ld $10,64($29);" \
131 "ld $11,72($29);" \
132 "ld $31,8($29);" \
133 "ld $1,0($29);" \
134 "daddu $29,$29,80;" \
135 "j $31;" \
136 " move $31,$1;" \
137 ".set reorder;" \
138 ".set at");
139#endif /* 64-bit */
140
141#ifdef _KERNEL
142/*
143 * The following two macros do splhigh and splx respectively.
144 * We use versions of _splraise() and _splset that don't
145 * including profiling support.
146 */
147
148#define MCOUNT_ENTER s = splhigh_noprof()
149
150#define MCOUNT_EXIT splx_noprof(s)
151#endif /* _KERNEL */
152
153#endif /* _MIPS_PROFILE_H_ */