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