1 /* $NetBSD: asm.h,v 1.25 2008/04/28 20:23:26 martin Exp $ */ 2 3 /*- 4 * Copyright (c) 1997 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe. 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 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Copyright (c) 1994 Allen Briggs 34 * All rights reserved. 35 * 36 * Gleaned from locore.s and sun3 asm.h which had the following copyrights: 37 * locore.s: 38 * Copyright (c) 1988 University of Utah. 39 * Copyright (c) 1982, 1990 The Regents of the University of California. 40 * sun3/include/asm.h: 41 * Copyright (c) 1993 Adam Glass 42 * Copyright (c) 1990 The Regents of the University of California. 43 * 44 * Redistribution and use in source and binary forms, with or without 45 * modification, are permitted provided that the following conditions 46 * are met: 47 * 1. Redistributions of source code must retain the above copyright 48 * notice, this list of conditions and the following disclaimer. 49 * 2. Redistributions in binary form must reproduce the above copyright 50 * notice, this list of conditions and the following disclaimer in the 51 * documentation and/or other materials provided with the distribution. 52 * 3. All advertising materials mentioning features or use of this software 53 * must display the following acknowledgement: 54 * This product includes software developed by the University of 55 * California, Berkeley and its contributors. 56 * 4. Neither the name of the University nor the names of its contributors 57 * may be used to endorse or promote products derived from this software 58 * without specific prior written permission. 59 * 60 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 61 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 62 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 63 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 64 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 65 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 66 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 67 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 68 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 69 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 70 * SUCH DAMAGE. 71 */ 72 73 #ifndef _M68K_ASM_H_ 74 #define _M68K_ASM_H_ 75 76 #if defined(__ELF__) && defined(PIC) 77 #define PIC_PLT(name) name@PLTPC 78 #else 79 #define PIC_PLT(name) name 80 #endif 81 82 #ifdef __ELF__ 83 # if __STDC__ 84 # define _C_LABEL(name) name 85 # else 86 # define _C_LABEL(name) name 87 #endif /* __STDC__ */ 88 #else /* __ELF__ */ 89 # if __STDC__ 90 # define _C_LABEL(name) _ ## name 91 # else 92 # define _C_LABEL(name) _/**/name 93 # endif /* __STDC__ */ 94 #endif /* __ELF__ */ 95 96 #define _ASM_LABEL(name) name 97 98 #define _ENTRY(name) \ 99 .text; .even; .globl name; .type name,@function; name: 100 101 #ifdef __ELF__ 102 #define MCOUNT_ENTRY __mcount 103 #else 104 #define MCOUNT_ENTRY mcount 105 #endif 106 107 #ifdef GPROF 108 #define _PROF_PROLOG link %a6,#0; jbsr MCOUNT_ENTRY; unlk %a6 109 #else 110 #define _PROF_PROLOG 111 #endif 112 113 #define ENTRY(name) _ENTRY(_C_LABEL(name)) _PROF_PROLOG 114 #define ASENTRY(name) _ENTRY(_ASM_LABEL(name)) _PROF_PROLOG 115 116 #define ENTRY_NOPROFILE(name) _ENTRY(_C_LABEL(name)) 117 #define ASENTRY_NOPROFILE(name) _ENTRY(_ASM_LABEL(name)) 118 119 /* 120 * The m68k ALTENTRY macro is very different than the traditional 121 * implementation used by other NetBSD ports. Usually ALTENTRY 122 * simply provides an alternate function entry point. The m68k 123 * definition takes a second argument and jumps inside the second 124 * function when profiling is enabled. 125 * 126 * The m68k behavior is similar to the ENTRY2 macro found in 127 * solaris' asm_linkage.h. 128 * 129 * Providing ENTRY2 and changing all the code that uses ALTENTRY 130 * to use it would be a desirable change. 131 */ 132 #ifdef PROF 133 #define ALTENTRY(name, rname) ENTRY(name); jra rname+12 134 #else 135 #define ALTENTRY(name, rname) _ENTRY(_C_LABEL(name)) 136 #endif 137 138 #define RCSID(x) .text ; \ 139 .asciz x ; \ 140 .even 141 142 /* 143 * Global variables of whatever sort. 144 */ 145 #define GLOBAL(x) \ 146 .globl _C_LABEL(x) ; \ 147 _C_LABEL(x): 148 149 #define ASGLOBAL(x) \ 150 .globl _ASM_LABEL(x) ; \ 151 _ASM_LABEL(x): 152 153 /* 154 * ...and local variables. 155 */ 156 #define LOCAL(x) \ 157 _C_LABEL(x): 158 159 #define ASLOCAL(x) \ 160 _ASM_LABEL(x): 161 162 /* 163 * Items in the BSS segment. 164 */ 165 #define BSS(name, size) \ 166 .comm _C_LABEL(name),size 167 168 #define ASBSS(name, size) \ 169 .comm _ASM_LABEL(name),size 170 171 #ifdef _KERNEL 172 /* 173 * Shorthand for calling panic(). 174 * Note the side-effect: it uses up the 9: label, so be careful! 175 */ 176 #define PANIC(x) \ 177 pea 9f ; \ 178 jbsr _C_LABEL(panic) ; \ 179 9: .asciz x ; \ 180 .even 181 182 #endif /* _KERNEL */ 183 184 /* 185 * Shorthand for defining vectors for the vector table. 186 */ 187 #define VECTOR(x) \ 188 .long _C_LABEL(x) 189 190 #define ASVECTOR(x) \ 191 .long _ASM_LABEL(x) 192 193 #define VECTOR_UNUSED \ 194 .long 0 195 196 #ifdef __ELF__ 197 #define WEAK_ALIAS(alias,sym) \ 198 .weak alias; \ 199 alias = sym 200 #endif 201 /* 202 * STRONG_ALIAS: create a strong alias. 203 */ 204 #define STRONG_ALIAS(alias,sym) \ 205 .globl alias; \ 206 alias = sym 207 208 #ifdef __STDC__ 209 #define __STRING(x) #x 210 #define WARN_REFERENCES(sym,msg) \ 211 .stabs msg ## ,30,0,0,0 ; \ 212 .stabs __STRING(_ ## sym) ## ,1,0,0,0 213 #else 214 #define __STRING(x) "x" 215 #define WARN_REFERENCES(sym,msg) \ 216 .stabs msg,30,0,0,0 ; \ 217 .stabs __STRING(_/**/sym),1,0,0,0 218 #endif /* __STDC__ */ 219 220 /* 221 * Macros to hide shortcomings in the 68010. 222 */ 223 #ifndef __mc68010__ 224 #define EXTBL(reg) \ 225 extbl reg 226 #else /* __mc68010__ */ 227 #define EXTBL(reg) \ 228 extw reg ; \ 229 extl reg 230 #endif /* __mc68010__ */ 231 232 #endif /* _M68K_ASM_H_ */ 233