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