Annotation of sys/arch/mips64/include/asm.h, Revision 1.1
1.1 ! nbrk 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 */
CVSweb