Home | History | Annotate | Download | only in machine
      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 #ifdef __linux__
     44 #define	_MIPS_ISA_MIPS5 5
     45 #define	_MIPS_ISA_MIPS32 6
     46 #define	_MIPS_ISA_MIPS64 7
     47 #else
     48 #define	_MIPS_ISA_MIPS32 32	/* MIPS32 */
     49 #endif
     50 
     51 #if !defined(ABICALLS) && !defined(_NO_ABICALLS)
     52 #define	ABICALLS	.abicalls
     53 #endif
     54 
     55 #if defined(ABICALLS) && !defined(_KERNEL)
     56 	ABICALLS
     57 #endif
     58 
     59 #define _C_LABEL(x) x		/* XXX Obsolete but keep for a while */
     60 
     61 #if !defined(__MIPSEL__) && !defined(__MIPSEB__)
     62 #error "__MIPSEL__ or __MIPSEB__ must be defined"
     63 #endif
     64 /*
     65  * Define how to access unaligned data word
     66  */
     67 #if defined(__MIPSEL__)
     68 #define LWLO    lwl
     69 #define LWHI    lwr
     70 #define	SWLO	swl
     71 #define	SWHI	swr
     72 #define LDLO    ldl
     73 #define LDHI    ldr
     74 #define	SDLO	sdl
     75 #define	SDHI	sdr
     76 #endif
     77 #if defined(__MIPSEB__)
     78 #define LWLO    lwr
     79 #define LWHI    lwl
     80 #define	SWLO	swr
     81 #define	SWHI	swl
     82 #define LDLO    ldr
     83 #define LDHI    ldl
     84 #define	SDLO	sdr
     85 #define	SDHI	sdl
     86 #endif
     87 
     88 /*
     89  *  Define programming environment for ABI.
     90  */
     91 #if defined(ABICALLS) && !defined(_KERNEL) && !defined(_STANDALONE)
     92 
     93 #ifndef _MIPS_SIM
     94 #define _MIPS_SIM 1
     95 #define _ABIO32	1
     96 #endif
     97 #ifndef _MIPS_ISA
     98 #define _MIPS_ISA 2
     99 #define _MIPS_ISA_MIPS2 2
    100 #endif
    101 
    102 #if (_MIPS_SIM == _ABIO32) || (_MIPS_SIM == _ABI32)
    103 #define NARGSAVE	4
    104 
    105 #define	SETUP_GP		\
    106 	.set	noreorder;	\
    107 	.cpload	t9;		\
    108 	.set	reorder;
    109 
    110 #define	SAVE_GP(x)		\
    111 	.cprestore x
    112 
    113 #define	SETUP_GP64(gpoff, name)
    114 #define	RESTORE_GP64
    115 #endif
    116 
    117 #if (_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32)
    118 #define NARGSAVE	0
    119 
    120 #define	SETUP_GP
    121 #define	SAVE_GP(x)
    122 #define	SETUP_GP64(gpoff, name)	\
    123 	.cpsetup t9, gpoff, name
    124 #define	RESTORE_GP64		\
    125 	.cpreturn
    126 #endif
    127 
    128 #define	MKFSIZ(narg,locals) (((narg+locals)*REGSZ+31)&(~31))
    129 
    130 #else /* defined(ABICALLS) && !defined(_KERNEL) */
    131 
    132 #define	NARGSAVE	4
    133 #define	SETUP_GP
    134 #define	SAVE_GP(x)
    135 
    136 #define	ALIGNSZ		16	/* Stack layout alignment */
    137 #define	FRAMESZ(sz)	(((sz) + (ALIGNSZ-1)) & ~(ALIGNSZ-1))
    138 
    139 #endif
    140 
    141 /*
    142  *  Basic register operations based on selected ISA
    143  */
    144 #if (_MIPS_ISA == _MIPS_ISA_MIPS1 || _MIPS_ISA == _MIPS_ISA_MIPS2 || _MIPS_ISA == _MIPS_ISA_MIPS32)
    145 #define REGSZ		4	/* 32 bit mode register size */
    146 #define LOGREGSZ	2	/* log rsize */
    147 #define	REG_S	sw
    148 #define	REG_L	lw
    149 #define	CF_SZ		24	/* Call frame size */
    150 #define	CF_ARGSZ	16	/* Call frame arg size */
    151 #define	CF_RA_OFFS	20	/* Call ra save offset */
    152 #endif
    153 
    154 #if (_MIPS_ISA == _MIPS_ISA_MIPS3 || _MIPS_ISA == _MIPS_ISA_MIPS4)
    155 #define REGSZ		8	/* 64 bit mode register size */
    156 #define LOGREGSZ	3	/* log rsize */
    157 #define	REG_S	sd
    158 #define	REG_L	ld
    159 #define	CF_SZ		48	/* Call frame size (multiple of ALIGNSZ) */
    160 #define	CF_ARGSZ	32	/* Call frame arg size */
    161 #define	CF_RA_OFFS	40	/* Call ra save offset */
    162 #endif
    163 
    164 #define REGSZ_FP	 8	/* 64 bit FP register size */
    165 
    166 #ifndef __LP64__
    167 #define	PTR_L		lw
    168 #define	PTR_S		sw
    169 #define	PTR_SUB		sub
    170 #define	PTR_ADD		add
    171 #define	PTR_SUBU	subu
    172 #define	PTR_ADDU	addu
    173 #define LI		li
    174 #define	LA		la
    175 #define	PTR_SLL		sll
    176 #define	PTR_SRL		srl
    177 #define	PTR_VAL		.word
    178 #else
    179 #define	PTR_L		ld
    180 #define	PTR_S		sd
    181 #define	PTR_ADD		dadd
    182 #define	PTR_SUB		dsub
    183 #define	PTR_SUBU	dsubu
    184 #define	PTR_ADDU	daddu
    185 #define LI		dli
    186 #define LA		dla
    187 #define	PTR_SLL		dsll
    188 #define	PTR_SRL		dsrl
    189 #define	PTR_VAL		.dword
    190 #endif
    191 
    192 /*
    193  * Define -pg profile entry code.
    194  */
    195 #if defined(XGPROF) || defined(XPROF)
    196 #define	MCOUNT			\
    197 	PTR_SUBU sp, sp, 32;	\
    198 	SAVE_GP(16);		\
    199 	sw	ra, 28(sp);	\
    200 	sw	gp, 24(sp);	\
    201 	.set	noat;		\
    202 	.set	noreorder;	\
    203 	move	AT, ra;		\
    204 	jal	_mcount;	\
    205 	PTR_SUBU sp, sp, 8;	\
    206 	lw	ra, 28(sp);	\
    207 	PTR_ADDU sp, sp, 32;	\
    208 	.set reorder;		\
    209 	.set	at;
    210 #else
    211 #define	MCOUNT
    212 #endif
    213 
    214 /*
    215  * LEAF(x, fsize)
    216  *
    217  *	Declare a leaf routine.
    218  */
    219 #define LEAF(x, fsize)		\
    220 	.align	3;		\
    221 	.globl x;		\
    222 	.ent x, 0;		\
    223 x: ;				\
    224 	.frame sp, fsize, ra;	\
    225 	SETUP_GP		\
    226 	MCOUNT
    227 
    228 #define	ALEAF(x)		\
    229 	.globl	x;		\
    230 x:
    231 
    232 /*
    233  * NLEAF(x)
    234  *
    235  *	Declare a non-profiled leaf routine.
    236  */
    237 #define NLEAF(x, fsize)		\
    238 	.align	3;		\
    239 	.globl x;		\
    240 	.ent x, 0;		\
    241 x: ;				\
    242 	.frame sp, fsize, ra;	\
    243 	SETUP_GP
    244 
    245 /*
    246  * NON_LEAF(x)
    247  *
    248  *	Declare a non-leaf routine (a routine that makes other C calls).
    249  */
    250 #define NON_LEAF(x, fsize, retpc) \
    251 	.align	3;		\
    252 	.globl x;		\
    253 	.ent x, 0;		\
    254 x: ;				\
    255 	.frame sp, fsize, retpc; \
    256 	SETUP_GP		\
    257 	MCOUNT
    258 
    259 /*
    260  * NNON_LEAF(x)
    261  *
    262  *	Declare a non-profiled non-leaf routine
    263  *	(a routine that makes other C calls).
    264  */
    265 #define NNON_LEAF(x, fsize, retpc) \
    266 	.align	3;		\
    267 	.globl x;		\
    268 	.ent x, 0;		\
    269 x: ;				\
    270 	.frame sp, fsize, retpc	\
    271 	SETUP_GP
    272 
    273 /*
    274  * END(x)
    275  *
    276  *	Mark end of a procedure.
    277  */
    278 #define END(x) \
    279 	.end x
    280 
    281 /*
    282  * Macros to panic and printf from assembly language.
    283  */
    284 #define PANIC(msg) \
    285 	LA	a0, 9f; \
    286 	jal	panic;	\
    287 	nop	;	\
    288 	MSG(msg)
    289 
    290 #define	PRINTF(msg) \
    291 	la	a0, 9f; \
    292 	jal	printf; \
    293 	nop	;	\
    294 	MSG(msg)
    295 
    296 #define	MSG(msg) \
    297 	.rdata; \
    298 9:	.asciiz	msg; \
    299 	.text
    300 
    301 #define ASMSTR(str) \
    302 	.asciiz str; \
    303 	.align	3
    304 
    305 #endif /* !_MIPS_ASM_H */
    306