xref: /openbsd-src/sys/arch/mips64/include/asm.h (revision a28daedfc357b214be5c701aa8ba8adb29a7f1c2)
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