1 /* $NetBSD: asm.h,v 1.28 2011/02/12 16:32:36 matt 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) .pushsection ".ident" ; \ 139 .asciz x ; \ 140 .popsection 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 /* 183 * Need a better place for these but these are common across 184 * all m68k ports so let's define just once. 185 */ 186 #define INTERRUPT_SAVEREG moveml #0xC0C0,%sp@- 187 #define INTERRUPT_RESTOREREG moveml %sp@+,#0x0303 188 189 /* 64-bit counter increments */ 190 #define CPUINFO_INCREMENT(n) \ 191 lea _C_LABEL(cpu_info_store)+(n)+4,%a1; \ 192 addq.l #1,(%a1); \ 193 clr.l %d0; /* doesn't change CCR[X] */ \ 194 move.l -(%a1),%d1; /* doesn't change CCR[X] */ \ 195 addx.l %d0,%d1; \ 196 move.l %d1,(%a1) 197 198 /* 64-bit counter increments */ 199 #define CPUINFO_ADD(n, addend) \ 200 lea _C_LABEL(cpu_info_store)+(n)+4,%a1; \ 201 add.l addend,(%a1); \ 202 clr.l %d0; /* doesn't change CCR[X] */ \ 203 move.l -(%a1),%d1; /* doesn't change CCR[X] */ \ 204 addx.l %d0,%d1; \ 205 move.l %d1,(%a1) 206 207 #endif /* _KERNEL */ 208 209 /* 210 * Shorthand for defining vectors for the vector table. 211 */ 212 #define VECTOR(x) \ 213 .long _C_LABEL(x) 214 215 #define ASVECTOR(x) \ 216 .long _ASM_LABEL(x) 217 218 #define VECTOR_UNUSED \ 219 .long 0 220 221 #ifdef __ELF__ 222 #define WEAK_ALIAS(alias,sym) \ 223 .weak alias; \ 224 alias = sym 225 #endif 226 /* 227 * STRONG_ALIAS: create a strong alias. 228 */ 229 #define STRONG_ALIAS(alias,sym) \ 230 .globl alias; \ 231 alias = sym 232 233 #ifdef __STDC__ 234 #define WARN_REFERENCES(sym,msg) \ 235 .pushsection .gnu.warning. ## sym; \ 236 .ascii msg; \ 237 .popsection 238 #else 239 #define WARN_REFERENCES(sym,msg) \ 240 .pushsection .gnu.warning./**/sym; \ 241 .ascii msg; \ 242 .popsection 243 #endif /* __STDC__ */ 244 245 /* 246 * Macros to hide shortcomings in the 68010. 247 */ 248 #ifndef __mc68010__ 249 #define EXTBL(reg) \ 250 extbl reg 251 #else /* __mc68010__ */ 252 #define EXTBL(reg) \ 253 extw reg ; \ 254 extl reg 255 #endif /* __mc68010__ */ 256 257 #endif /* _M68K_ASM_H_ */ 258