asm.h revision 1.17.8.1 1 1.17.8.1 yamt /* $NetBSD: asm.h,v 1.17.8.1 2006/06/21 14:55:03 yamt Exp $ */
2 1.1 ws
3 1.1 ws /*
4 1.1 ws * Copyright (C) 1995, 1996 Wolfgang Solfrank.
5 1.1 ws * Copyright (C) 1995, 1996 TooLs GmbH.
6 1.1 ws * All rights reserved.
7 1.1 ws *
8 1.1 ws * Redistribution and use in source and binary forms, with or without
9 1.1 ws * modification, are permitted provided that the following conditions
10 1.1 ws * are met:
11 1.1 ws * 1. Redistributions of source code must retain the above copyright
12 1.1 ws * notice, this list of conditions and the following disclaimer.
13 1.1 ws * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 ws * notice, this list of conditions and the following disclaimer in the
15 1.1 ws * documentation and/or other materials provided with the distribution.
16 1.1 ws * 3. All advertising materials mentioning features or use of this software
17 1.1 ws * must display the following acknowledgement:
18 1.1 ws * This product includes software developed by TooLs GmbH.
19 1.1 ws * 4. The name of TooLs GmbH may not be used to endorse or promote products
20 1.1 ws * derived from this software without specific prior written permission.
21 1.1 ws *
22 1.1 ws * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
23 1.1 ws * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 1.1 ws * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 1.1 ws * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 1.1 ws * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 1.1 ws * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28 1.1 ws * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 1.1 ws * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30 1.1 ws * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31 1.1 ws * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 1.1 ws */
33 1.1 ws
34 1.1 ws #ifndef _PPC_ASM_H_
35 1.1 ws #define _PPC_ASM_H_
36 1.1 ws
37 1.1 ws #ifdef PIC
38 1.1 ws #define PIC_PROLOGUE XXX
39 1.1 ws #define PIC_EPILOGUE XXX
40 1.4 tsubai #define PIC_PLT(x) x@plt
41 1.1 ws #ifdef __STDC__
42 1.1 ws #define PIC_GOT(x) XXX
43 1.1 ws #define PIC_GOTOFF(x) XXX
44 1.1 ws #else /* not __STDC__ */
45 1.1 ws #define PIC_GOT(x) XXX
46 1.1 ws #define PIC_GOTOFF(x) XXX
47 1.1 ws #endif /* __STDC__ */
48 1.1 ws #else
49 1.1 ws #define PIC_PROLOGUE
50 1.1 ws #define PIC_EPILOGUE
51 1.1 ws #define PIC_PLT(x) x
52 1.1 ws #define PIC_GOT(x) x
53 1.1 ws #define PIC_GOTOFF(x) x
54 1.1 ws #endif
55 1.1 ws
56 1.3 thorpej #define _C_LABEL(x) x
57 1.1 ws #define _ASM_LABEL(x) x
58 1.1 ws
59 1.3 thorpej #define _GLOBAL(x) \
60 1.3 thorpej .data; .align 2; .globl x; x:
61 1.3 thorpej
62 1.1 ws #define _ENTRY(x) \
63 1.1 ws .text; .align 2; .globl x; .type x,@function; x:
64 1.1 ws
65 1.2 jtc #ifdef GPROF
66 1.6 tsubai # define _PROF_PROLOGUE mflr 0; stw 0,4(1); bl _mcount
67 1.1 ws #else
68 1.1 ws # define _PROF_PROLOGUE
69 1.1 ws #endif
70 1.1 ws
71 1.1 ws #define ENTRY(y) _ENTRY(_C_LABEL(y)); _PROF_PROLOGUE
72 1.9 thorpej #define ENTRY_NOPROFILE(y) _ENTRY(_C_LABEL(y))
73 1.9 thorpej
74 1.1 ws #define ASENTRY(y) _ENTRY(_ASM_LABEL(y)); _PROF_PROLOGUE
75 1.3 thorpej #define GLOBAL(y) _GLOBAL(_C_LABEL(y))
76 1.1 ws
77 1.1 ws #define ASMSTR .asciz
78 1.1 ws
79 1.1 ws #define RCSID(x) .text; .asciz x
80 1.7 kleink
81 1.7 kleink #ifdef __ELF__
82 1.7 kleink #define WEAK_ALIAS(alias,sym) \
83 1.7 kleink .weak alias; \
84 1.7 kleink alias = sym
85 1.7 kleink #endif
86 1.17.8.1 yamt /*
87 1.17.8.1 yamt * STRONG_ALIAS: create a strong alias.
88 1.17.8.1 yamt */
89 1.17.8.1 yamt #define STRONG_ALIAS(alias,sym) \
90 1.17.8.1 yamt .globl alias; \
91 1.17.8.1 yamt alias = sym
92 1.5 thorpej
93 1.5 thorpej #ifdef __STDC__
94 1.5 thorpej #define WARN_REFERENCES(_sym,_msg) \
95 1.5 thorpej .section .gnu.warning. ## _sym ; .ascii _msg ; .text
96 1.5 thorpej #else
97 1.5 thorpej #define WARN_REFERENCES(_sym,_msg) \
98 1.5 thorpej .section .gnu.warning./**/_sym ; .ascii _msg ; .text
99 1.5 thorpej #endif /* __STDC__ */
100 1.12 matt
101 1.12 matt #ifdef _KERNEL
102 1.12 matt /*
103 1.12 matt * Get cpu_info pointer for current processor. Always in SPRG0. *ALWAYS*
104 1.12 matt */
105 1.12 matt #define GET_CPUINFO(r) mfsprg r,0
106 1.12 matt /*
107 1.12 matt * IN:
108 1.12 matt * R4[er] = first free byte beyond end/esym.
109 1.12 matt *
110 1.12 matt * OUT:
111 1.12 matt * R1[sp] = new kernel stack
112 1.12 matt * R4[er] = kernelend
113 1.12 matt */
114 1.12 matt
115 1.12 matt #define INIT_CPUINFO(er,sp,tmp1,tmp2) \
116 1.12 matt li tmp1,PGOFSET; \
117 1.12 matt add er,er,tmp1; \
118 1.12 matt andc er,er,tmp1; /* page align */ \
119 1.12 matt lis tmp1,_C_LABEL(cpu_info)@ha; \
120 1.12 matt addi tmp1,tmp1,_C_LABEL(cpu_info)@l; \
121 1.15 matt mtsprg0 tmp1; /* save for later use */ \
122 1.12 matt addi er,er,INTSTK; \
123 1.15 matt stptr er,CI_INTSTK(tmp1); \
124 1.15 matt stptr er,CI_IDLE_PCB(tmp1); \
125 1.12 matt addi er,er,USPACE; /* space for idle_u */ \
126 1.17 simonb lis tmp2,_C_LABEL(emptyidlespin)@h; \
127 1.17 simonb ori tmp2,tmp2,_C_LABEL(emptyidlespin)@l; \
128 1.16 matt stptr tmp2,CI_IDLESPIN(tmp1); \
129 1.12 matt li tmp2,-1; \
130 1.15 matt stint tmp2,CI_INTRDEPTH(tmp1); \
131 1.12 matt li tmp2,0; \
132 1.15 matt stptr tmp2,-CALLFRAMELEN(er); /* terminate idle stack chain */\
133 1.12 matt lis tmp1,_C_LABEL(proc0paddr)@ha; \
134 1.15 matt stptr er,_C_LABEL(proc0paddr)@l(tmp1); \
135 1.12 matt addi er,er,USPACE; /* stackpointer for proc0 */ \
136 1.12 matt addi sp,er,-FRAMELEN; /* stackpointer for proc0 */ \
137 1.12 matt /* er = end of mem reserved for kernel */ \
138 1.15 matt stptru tmp2,-CALLFRAMELEN(sp) /* end of stack chain */
139 1.12 matt
140 1.12 matt #endif
141 1.8 simonb
142 1.8 simonb /* Condition Register Bit Fields */
143 1.8 simonb
144 1.11 matt #if !defined(_NOREGNAMES)
145 1.10 matt #if defined(_KERNEL) || defined(_STANDALONE)
146 1.8 simonb #define cr0 0
147 1.8 simonb #define cr1 1
148 1.8 simonb #define cr2 2
149 1.8 simonb #define cr3 3
150 1.8 simonb #define cr4 4
151 1.8 simonb #define cr5 5
152 1.8 simonb #define cr6 6
153 1.8 simonb #define cr7 7
154 1.10 matt #endif
155 1.8 simonb
156 1.8 simonb /* General Purpose Registers (GPRs) */
157 1.8 simonb
158 1.10 matt #if defined(_KERNEL) || defined(_STANDALONE)
159 1.8 simonb #define r0 0
160 1.8 simonb #define r1 1
161 1.8 simonb #define r2 2
162 1.8 simonb #define r3 3
163 1.8 simonb #define r4 4
164 1.8 simonb #define r5 5
165 1.8 simonb #define r6 6
166 1.8 simonb #define r7 7
167 1.8 simonb #define r8 8
168 1.8 simonb #define r9 9
169 1.8 simonb #define r10 10
170 1.8 simonb #define r11 11
171 1.8 simonb #define r12 12
172 1.8 simonb #define r13 13
173 1.8 simonb #define r14 14
174 1.8 simonb #define r15 15
175 1.8 simonb #define r16 16
176 1.8 simonb #define r17 17
177 1.8 simonb #define r18 18
178 1.8 simonb #define r19 19
179 1.8 simonb #define r20 20
180 1.8 simonb #define r21 21
181 1.8 simonb #define r22 22
182 1.8 simonb #define r23 23
183 1.8 simonb #define r24 24
184 1.8 simonb #define r25 25
185 1.8 simonb #define r26 26
186 1.8 simonb #define r27 27
187 1.8 simonb #define r28 28
188 1.8 simonb #define r29 29
189 1.8 simonb #define r30 30
190 1.8 simonb #define r31 31
191 1.10 matt #endif
192 1.8 simonb
193 1.8 simonb /* Floating Point Registers (FPRs) */
194 1.8 simonb
195 1.10 matt #if defined(_KERNEL) || defined(_STANDALONE)
196 1.8 simonb #define fr0 0
197 1.8 simonb #define fr1 1
198 1.8 simonb #define fr2 2
199 1.8 simonb #define fr3 3
200 1.8 simonb #define fr4 4
201 1.8 simonb #define fr5 5
202 1.8 simonb #define fr6 6
203 1.8 simonb #define fr7 7
204 1.8 simonb #define fr8 8
205 1.8 simonb #define fr9 9
206 1.8 simonb #define fr10 10
207 1.8 simonb #define fr11 11
208 1.8 simonb #define fr12 12
209 1.8 simonb #define fr13 13
210 1.8 simonb #define fr14 14
211 1.8 simonb #define fr15 15
212 1.8 simonb #define fr16 16
213 1.8 simonb #define fr17 17
214 1.8 simonb #define fr18 18
215 1.8 simonb #define fr19 19
216 1.8 simonb #define fr20 20
217 1.8 simonb #define fr21 21
218 1.8 simonb #define fr22 22
219 1.8 simonb #define fr23 23
220 1.8 simonb #define fr24 24
221 1.8 simonb #define fr25 25
222 1.8 simonb #define fr26 26
223 1.8 simonb #define fr27 27
224 1.8 simonb #define fr28 28
225 1.8 simonb #define fr29 29
226 1.8 simonb #define fr30 30
227 1.8 simonb #define fr31 31
228 1.10 matt #endif
229 1.11 matt #endif /* !_NOREGNAMES */
230 1.13 matt
231 1.13 matt /*
232 1.13 matt * Add some psuedo instructions to made sharing of assembly versions of
233 1.13 matt * ILP32 and LP64 code possible.
234 1.13 matt */
235 1.13 matt #define ldint lwz /* not needed but for completeness */
236 1.13 matt #define ldintu lwzu /* not needed but for completeness */
237 1.13 matt #define stint stw /* not needed but for completeness */
238 1.13 matt #define stintu stwu /* not needed but for completeness */
239 1.13 matt #ifndef _LP64
240 1.13 matt #define ldlong lwz /* load "C" long */
241 1.13 matt #define ldlongu lwzu /* load "C" long with udpate */
242 1.13 matt #define stlong stw /* load "C" long */
243 1.13 matt #define stlongu stwu /* load "C" long with udpate */
244 1.13 matt #define ldptr lwz /* load "C" pointer */
245 1.13 matt #define ldptru lwzu /* load "C" pointer with udpate */
246 1.13 matt #define stptr stw /* load "C" pointer */
247 1.13 matt #define stptru stwu /* load "C" pointer with udpate */
248 1.13 matt #define ldreg lwz /* load PPC general register */
249 1.13 matt #define ldregu lwzu /* load PPC general register with udpate */
250 1.13 matt #define streg stw /* load PPC general register */
251 1.13 matt #define stregu stwu /* load PPC general register with udpate */
252 1.13 matt #define SZREG 4 /* 4 byte registers */
253 1.13 matt #else
254 1.13 matt #define ldlong ld /* load "C" long */
255 1.13 matt #define ldlongu ldu /* load "C" long with update */
256 1.13 matt #define stlong std /* store "C" long */
257 1.13 matt #define stlongu stdu /* store "C" long with update */
258 1.13 matt #define ldptr ld /* load "C" pointer */
259 1.13 matt #define ldptru ldu /* load "C" pointer with update */
260 1.13 matt #define stptr std /* store "C" pointer */
261 1.13 matt #define stptru stdu /* store "C" pointer with update */
262 1.13 matt #define ldreg ld /* load PPC general register */
263 1.13 matt #define ldregu ldu /* load PPC general register with update */
264 1.13 matt #define streg std /* store PPC general register */
265 1.13 matt #define stregu stdu /* store PPC general register with update */
266 1.14 matt /* redefined this to force an error on PPC64 to catch their use. */
267 1.14 matt #define lmw lmd /* load multiple PPC general registers */
268 1.14 matt #define stmw stmd /* store multiple PPC general registers */
269 1.13 matt #define SZREG 8 /* 8 byte registers */
270 1.13 matt #endif
271 1.1 ws
272 1.1 ws #endif /* !_PPC_ASM_H_ */
273