1 /* $OpenBSD: asm.h,v 1.7 2004/10/20 12:49:15 pefo Exp $ */ 2 3 /* 4 * Copyright (c) 2001-2002 Opsycon AB (www.opsycon.se / www.opsycon.com) 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 19 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 */ 28 #ifndef _MIPS64_ASM_H 29 #define _MIPS64_ASM_H 30 31 #include <machine/regdef.h> 32 33 #ifdef NEED_OLD_RM7KFIX 34 #define ITLBNOPFIX nop;nop;nop;nop;nop;nop;nop;nop;nop;nop; 35 #else 36 #define ITLBNOPFIX nop;nop;nop;nop 37 #endif 38 39 #define _MIPS_ISA_MIPS1 1 /* R2000/R3000 */ 40 #define _MIPS_ISA_MIPS2 2 /* R4000/R6000 */ 41 #define _MIPS_ISA_MIPS3 3 /* R4000 */ 42 #define _MIPS_ISA_MIPS4 4 /* TFP (R1x000) */ 43 44 #if !defined(ABICALLS) && !defined(_NO_ABICALLS) 45 #define ABICALLS .abicalls 46 #endif 47 48 #if defined(ABICALLS) && !defined(_KERNEL) 49 ABICALLS 50 #endif 51 52 #define _C_LABEL(x) x /* XXX Obsolete but keep for a while */ 53 54 #if !defined(__MIPSEL__) && !defined(__MIPSEB__) 55 #error "__MIPSEL__ or __MIPSEB__ must be defined" 56 #endif 57 /* 58 * Define how to access unaligned data word 59 */ 60 #if defined(__MIPSEL__) 61 #define LWLO lwl 62 #define LWHI lwr 63 #define SWLO swl 64 #define SWHI swr 65 #define LDLO ldl 66 #define LDHI ldr 67 #define SDLO sdl 68 #define SDHI sdr 69 #endif 70 #if defined(__MIPSEB__) 71 #define LWLO lwr 72 #define LWHI lwl 73 #define SWLO swr 74 #define SWHI swl 75 #define LDLO ldr 76 #define LDHI ldl 77 #define SDLO sdr 78 #define SDHI sdl 79 #endif 80 81 /* 82 * Define programming environment for ABI. 83 */ 84 #if defined(ABICALLS) && !defined(_KERNEL) && !defined(_STANDALONE) 85 86 #ifndef _MIPS_SIM 87 #define _MIPS_SIM 1 88 #define _ABIO32 1 89 #endif 90 #ifndef _MIPS_ISA 91 #define _MIPS_ISA 2 92 #define _MIPS_ISA_MIPS2 2 93 #endif 94 95 #if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32) 96 #define NARGSAVE 4 97 98 #define SETUP_GP \ 99 .set noreorder; \ 100 .cpload t9; \ 101 .set reorder; 102 103 #define SAVE_GP(x) \ 104 .cprestore x 105 106 #define SETUP_GP64(gpoff, name) 107 #define RESTORE_GP64 108 #endif 109 110 #if (_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32) 111 #define NARGSAVE 0 112 113 #define SETUP_GP 114 #define SAVE_GP(x) 115 #define SETUP_GP64(gpoff, name) \ 116 .cpsetup t9, gpoff, name 117 #define RESTORE_GP64 \ 118 .cpreturn 119 #endif 120 121 #define MKFSIZ(narg,locals) (((narg+locals)*REGSZ+31)&(~31)) 122 123 #else /* defined(ABICALLS) && !defined(_KERNEL) */ 124 125 #define NARGSAVE 4 126 #define SETUP_GP 127 #define SAVE_GP(x) 128 129 #define ALIGNSZ 16 /* Stack layout alignment */ 130 #define FRAMESZ(sz) (((sz) + (ALIGNSZ-1)) & ~(ALIGNSZ-1)) 131 132 #endif 133 134 /* 135 * Basic register operations based on selected ISA 136 */ 137 #if (_MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2) 138 #define REGSZ 4 /* 32 bit mode register size */ 139 #define LOGREGSZ 2 /* log rsize */ 140 #define REG_S sw 141 #define REG_L lw 142 #define CF_SZ 24 /* Call frame size */ 143 #define CF_ARGSZ 16 /* Call frame arg size */ 144 #define CF_RA_OFFS 20 /* Call ra save offset */ 145 #endif 146 147 #if (_MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4) 148 #define REGSZ 8 /* 64 bit mode register size */ 149 #define LOGREGSZ 3 /* log rsize */ 150 #define REG_S sd 151 #define REG_L ld 152 #define CF_SZ 48 /* Call frame size (multiple of ALIGNSZ) */ 153 #define CF_ARGSZ 32 /* Call frame arg size */ 154 #define CF_RA_OFFS 40 /* Call ra save offset */ 155 #endif 156 157 #ifndef __LP64__ 158 #define PTR_L lw 159 #define PTR_S sw 160 #define PTR_SUB sub 161 #define PTR_ADD add 162 #define PTR_SUBU subu 163 #define PTR_ADDU addu 164 #define LI li 165 #define LA la 166 #define PTR_SLL sll 167 #define PTR_SRL srl 168 #define PTR_VAL .word 169 #else 170 #define PTR_L ld 171 #define PTR_S sd 172 #define PTR_ADD dadd 173 #define PTR_SUB dsub 174 #define PTR_SUBU dsubu 175 #define PTR_ADDU daddu 176 #define LI dli 177 #define LA dla 178 #define PTR_SLL dsll 179 #define PTR_SRL dsrl 180 #define PTR_VAL .dword 181 #endif 182 183 /* 184 * Define -pg profile entry code. 185 */ 186 #if defined(XGPROF) || defined(XPROF) 187 #define MCOUNT \ 188 PTR_SUBU sp, sp, 32; \ 189 SAVE_GP(16); \ 190 sw ra, 28(sp); \ 191 sw gp, 24(sp); \ 192 .set noat; \ 193 .set noreorder; \ 194 move AT, ra; \ 195 jal _mcount; \ 196 PTR_SUBU sp, sp, 8; \ 197 lw ra, 28(sp); \ 198 PTR_ADDU sp, sp, 32; \ 199 .set reorder; \ 200 .set at; 201 #else 202 #define MCOUNT 203 #endif 204 205 /* 206 * LEAF(x, fsize) 207 * 208 * Declare a leaf routine. 209 */ 210 #define LEAF(x, fsize) \ 211 .align 3; \ 212 .globl x; \ 213 .ent x, 0; \ 214 x: ; \ 215 .frame sp, fsize, ra; \ 216 SETUP_GP \ 217 MCOUNT 218 219 #define ALEAF(x) \ 220 .globl x; \ 221 x: 222 223 /* 224 * NLEAF(x) 225 * 226 * Declare a non-profiled leaf routine. 227 */ 228 #define NLEAF(x, fsize) \ 229 .align 3; \ 230 .globl x; \ 231 .ent x, 0; \ 232 x: ; \ 233 .frame sp, fsize, ra; \ 234 SETUP_GP 235 236 /* 237 * NON_LEAF(x) 238 * 239 * Declare a non-leaf routine (a routine that makes other C calls). 240 */ 241 #define NON_LEAF(x, fsize, retpc) \ 242 .align 3; \ 243 .globl x; \ 244 .ent x, 0; \ 245 x: ; \ 246 .frame sp, fsize, retpc; \ 247 SETUP_GP \ 248 MCOUNT 249 250 /* 251 * NNON_LEAF(x) 252 * 253 * Declare a non-profiled non-leaf routine 254 * (a routine that makes other C calls). 255 */ 256 #define NNON_LEAF(x, fsize, retpc) \ 257 .align 3; \ 258 .globl x; \ 259 .ent x, 0; \ 260 x: ; \ 261 .frame sp, fsize, retpc \ 262 SETUP_GP 263 264 /* 265 * END(x) 266 * 267 * Mark end of a procedure. 268 */ 269 #define END(x) \ 270 .end x 271 272 /* 273 * Macros to panic and printf from assembly language. 274 */ 275 #define PANIC(msg) \ 276 LA a0, 9f; \ 277 jal panic; \ 278 nop ; \ 279 MSG(msg) 280 281 #define PRINTF(msg) \ 282 la a0, 9f; \ 283 jal printf; \ 284 nop ; \ 285 MSG(msg) 286 287 #define MSG(msg) \ 288 .rdata; \ 289 9: .asciiz msg; \ 290 .text 291 292 #define ASMSTR(str) \ 293 .asciiz str; \ 294 .align 3 295 296 #endif /* !_MIPS_ASM_H */ 297