1 /*
2 * Copyright (C) 1999 Hewlett-Packard (Frank Rowand)
3 * Copyright (C) 1999 Philipp Rumpf <prumpf@tux.org>
4 * Copyright (C) 1999 SuSE GmbH
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #ifndef _PARISC_ASSEMBLY_H
22 #define _PARISC_ASSEMBLY_H
23
24 #if defined(__LP64__) && defined(__ASSEMBLY__)
25 /* the 64-bit pa gnu assembler unfortunately defaults to .level 1.1 or 2.0 so
26 * work around that for now... */
27 .level 2.0w
28 #endif
29
30 #include <asm/offset.h>
31 #include <asm/page.h>
32
33 #include <asm/asmregs.h>
34
35 sp = 30
36 gp = 27
37 ipsw = 22
38
39 #if __PAGE_OFFSET == 0xc0000000
40 .macro tophys gr
41 zdep \gr, 31, 30, \gr
42 .endm
43
44 .macro tovirt gr
45 depi 3,1,2,\gr
46 .endm
47 #else
48 #error unknown __PAGE_OFFSET
49 #endif
50
51 .macro delay value
52 ldil L%\value, 1
53 ldo R%\value(1), 1
54 addib,UV,n -1,1,.
55 addib,NUV,n -1,1,.+8
56 nop
57 .endm
58
59 .macro debug value
60 .endm
61
62 #ifdef __LP64__
63 # define LDIL_FIXUP(reg) depdi 0,31,32,reg
64 #else
65 # define LDIL_FIXUP(reg)
66 #endif
67
68 /* load 32-bit 'value' into 'reg' compensating for the ldil
69 * sign-extension when running in wide mode.
70 * WARNING!! neither 'value' nor 'reg' can be expressions
71 * containing '.'!!!! */
72 .macro load32 value, reg
73 ldil L%\value, \reg
74 ldo R%\value(\reg), \reg
75 LDIL_FIXUP(\reg)
76 .endm
77
78 #ifdef __LP64__
79 #define LDREG ldd
80 #define STREG std
81 #define RP_OFFSET 16
82 #else
83 #define LDREG ldw
84 #define STREG stw
85 #define RP_OFFSET 20
86 #endif
87
88 .macro loadgp
89 #ifdef __LP64__
90 ldil L%__gp, %r27
91 ldo R%__gp(%r27), %r27
92 LDIL_FIXUP(%r27)
93 #else
94 ldil L%$global$, %r27
95 ldo R%$global$(%r27), %r27
96 #endif
97 .endm
98
99 #define SAVE_SP(r, where) mfsp r, %r1 ! STREG %r1, where
100 #define REST_SP(r, where) LDREG where, %r1 ! mtsp %r1, r
101 #define SAVE_CR(r, where) mfctl r, %r1 ! STREG %r1, where
102 #define REST_CR(r, where) LDREG where, %r1 ! mtctl %r1, r
103
104 .macro save_general regs
105 STREG %r2, PT_GR2 (\regs)
106 STREG %r3, PT_GR3 (\regs)
107 STREG %r4, PT_GR4 (\regs)
108 STREG %r5, PT_GR5 (\regs)
109 STREG %r6, PT_GR6 (\regs)
110 STREG %r7, PT_GR7 (\regs)
111 STREG %r8, PT_GR8 (\regs)
112 STREG %r9, PT_GR9 (\regs)
113 STREG %r10, PT_GR10(\regs)
114 STREG %r11, PT_GR11(\regs)
115 STREG %r12, PT_GR12(\regs)
116 STREG %r13, PT_GR13(\regs)
117 STREG %r14, PT_GR14(\regs)
118 STREG %r15, PT_GR15(\regs)
119 STREG %r16, PT_GR16(\regs)
120 STREG %r17, PT_GR17(\regs)
121 STREG %r18, PT_GR18(\regs)
122 STREG %r19, PT_GR19(\regs)
123 STREG %r20, PT_GR20(\regs)
124 STREG %r21, PT_GR21(\regs)
125 STREG %r22, PT_GR22(\regs)
126 STREG %r23, PT_GR23(\regs)
127 STREG %r24, PT_GR24(\regs)
128 STREG %r25, PT_GR25(\regs)
129 /* r26 is clobbered by cr19 and assumed to be saved before hand */
130 STREG %r27, PT_GR27(\regs)
131 STREG %r28, PT_GR28(\regs)
132 /* r29 is already saved and points to PT_xxx struct */
133 /* r30 stack pointer saved in get_stack */
134 STREG %r31, PT_GR31(\regs)
135 .endm
136
137 .macro rest_general regs
138 LDREG PT_GR2 (\regs), %r2
139 LDREG PT_GR3 (\regs), %r3
140 LDREG PT_GR4 (\regs), %r4
141 LDREG PT_GR5 (\regs), %r5
142 LDREG PT_GR6 (\regs), %r6
143 LDREG PT_GR7 (\regs), %r7
144 LDREG PT_GR8 (\regs), %r8
145 LDREG PT_GR9 (\regs), %r9
146 LDREG PT_GR10(\regs), %r10
147 LDREG PT_GR11(\regs), %r11
148 LDREG PT_GR12(\regs), %r12
149 LDREG PT_GR13(\regs), %r13
150 LDREG PT_GR14(\regs), %r14
151 LDREG PT_GR15(\regs), %r15
152 LDREG PT_GR16(\regs), %r16
153 LDREG PT_GR17(\regs), %r17
154 LDREG PT_GR18(\regs), %r18
155 LDREG PT_GR19(\regs), %r19
156 LDREG PT_GR20(\regs), %r20
157 LDREG PT_GR21(\regs), %r21
158 LDREG PT_GR22(\regs), %r22
159 LDREG PT_GR23(\regs), %r23
160 LDREG PT_GR24(\regs), %r24
161 LDREG PT_GR25(\regs), %r25
162 LDREG PT_GR26(\regs), %r26
163 LDREG PT_GR27(\regs), %r27
164 LDREG PT_GR28(\regs), %r28
165 /* r30 stack pointer restored in rest_stack */
166 LDREG PT_GR31(\regs), %r31
167 .endm
168
169 .macro save_fp regs
170 fstd,ma %fr0, 8(\regs)
171 fstd,ma %fr1, 8(\regs)
172 fstd,ma %fr2, 8(\regs)
173 fstd,ma %fr3, 8(\regs)
174 fstd,ma %fr4, 8(\regs)
175 fstd,ma %fr5, 8(\regs)
176 fstd,ma %fr6, 8(\regs)
177 fstd,ma %fr7, 8(\regs)
178 fstd,ma %fr8, 8(\regs)
179 fstd,ma %fr9, 8(\regs)
180 fstd,ma %fr10, 8(\regs)
181 fstd,ma %fr11, 8(\regs)
182 fstd,ma %fr12, 8(\regs)
183 fstd,ma %fr13, 8(\regs)
184 fstd,ma %fr14, 8(\regs)
185 fstd,ma %fr15, 8(\regs)
186 fstd,ma %fr16, 8(\regs)
187 fstd,ma %fr17, 8(\regs)
188 fstd,ma %fr18, 8(\regs)
189 fstd,ma %fr19, 8(\regs)
190 fstd,ma %fr20, 8(\regs)
191 fstd,ma %fr21, 8(\regs)
192 fstd,ma %fr22, 8(\regs)
193 fstd,ma %fr23, 8(\regs)
194 fstd,ma %fr24, 8(\regs)
195 fstd,ma %fr25, 8(\regs)
196 fstd,ma %fr26, 8(\regs)
197 fstd,ma %fr27, 8(\regs)
198 fstd,ma %fr28, 8(\regs)
199 fstd,ma %fr29, 8(\regs)
200 fstd,ma %fr30, 8(\regs)
201 fstd %fr31, 0(\regs)
202 .endm
203
204 .macro rest_fp regs
205 fldd 0(\regs), %fr31
206 fldd,mb -8(\regs), %fr30
207 fldd,mb -8(\regs), %fr29
208 fldd,mb -8(\regs), %fr28
209 fldd,mb -8(\regs), %fr27
210 fldd,mb -8(\regs), %fr26
211 fldd,mb -8(\regs), %fr25
212 fldd,mb -8(\regs), %fr24
213 fldd,mb -8(\regs), %fr23
214 fldd,mb -8(\regs), %fr22
215 fldd,mb -8(\regs), %fr21
216 fldd,mb -8(\regs), %fr20
217 fldd,mb -8(\regs), %fr19
218 fldd,mb -8(\regs), %fr18
219 fldd,mb -8(\regs), %fr17
220 fldd,mb -8(\regs), %fr16
221 fldd,mb -8(\regs), %fr15
222 fldd,mb -8(\regs), %fr14
223 fldd,mb -8(\regs), %fr13
224 fldd,mb -8(\regs), %fr12
225 fldd,mb -8(\regs), %fr11
226 fldd,mb -8(\regs), %fr10
227 fldd,mb -8(\regs), %fr9
228 fldd,mb -8(\regs), %fr8
229 fldd,mb -8(\regs), %fr7
230 fldd,mb -8(\regs), %fr6
231 fldd,mb -8(\regs), %fr5
232 fldd,mb -8(\regs), %fr4
233 fldd,mb -8(\regs), %fr3
234 fldd,mb -8(\regs), %fr2
235 fldd,mb -8(\regs), %fr1
236 fldd,mb -8(\regs), %fr0
237 .endm
238
239 #ifdef __LP64__
240 .macro callee_save
241 ldo 144(%r30), %r30
242 std %r3, -144(%r30)
243 std %r4, -136(%r30)
244 std %r5, -128(%r30)
245 std %r6, -120(%r30)
246 std %r7, -112(%r30)
247 std %r8, -104(%r30)
248 std %r9, -96(%r30)
249 std %r10, -88(%r30)
250 std %r11, -80(%r30)
251 std %r12, -72(%r30)
252 std %r13, -64(%r30)
253 std %r14, -56(%r30)
254 std %r15, -48(%r30)
255 std %r16, -40(%r30)
256 std %r17, -32(%r30)
257 std %r18, -24(%r30)
258 .endm
259
260 .macro callee_rest
261 ldd -24(%r30), %r18
262 ldd -32(%r30), %r17
263 ldd -40(%r30), %r16
264 ldd -48(%r30), %r15
265 ldd -56(%r30), %r14
266 ldd -64(%r30), %r13
267 ldd -72(%r30), %r12
268 ldd -80(%r30), %r11
269 ldd -88(%r30), %r10
270 ldd -96(%r30), %r9
271 ldd -104(%r30), %r8
272 ldd -112(%r30), %r7
273 ldd -120(%r30), %r6
274 ldd -128(%r30), %r5
275 ldd -136(%r30), %r4
276 ldd -144(%r30), %r3
277 ldo -144(%r30), %r30
278 .endm
279
280 #else /* __LP64__ */
281
282 .macro callee_save
283 ldo 128(30), 30
284 stw 3, -128(30)
285 stw 4, -124(30)
286 stw 5, -120(30)
287 stw 6, -116(30)
288 stw 7, -112(30)
289 stw 8, -108(30)
290 stw 9, -104(30)
291 stw 10, -100(30)
292 stw 11, -96(30)
293 stw 12, -92(30)
294 stw 13, -88(30)
295 stw 14, -84(30)
296 stw 15, -80(30)
297 stw 16, -76(30)
298 stw 17, -72(30)
299 stw 18, -68(30)
300 .endm
301
302 .macro callee_rest
303 ldw -68(30), 18
304 ldw -72(30), 17
305 ldw -76(30), 16
306 ldw -80(30), 15
307 ldw -84(30), 14
308 ldw -88(30), 13
309 ldw -92(30), 12
310 ldw -96(30), 11
311 ldw -100(30), 10
312 ldw -104(30), 9
313 ldw -108(30), 8
314 ldw -112(30), 7
315 ldw -116(30), 6
316 ldw -120(30), 5
317 ldw -124(30), 4
318 ldw -128(30), 3
319 ldo -128(30), 30
320 .endm
321 #endif /* __LP64__ */
322
323 .macro save_specials regs
324
325 SAVE_SP (%sr0, PT_SR0 (\regs))
326 SAVE_SP (%sr1, PT_SR1 (\regs))
327 SAVE_SP (%sr2, PT_SR2 (\regs))
328 SAVE_SP (%sr3, PT_SR3 (\regs))
329 SAVE_SP (%sr4, PT_SR4 (\regs))
330 SAVE_SP (%sr5, PT_SR5 (\regs))
331 SAVE_SP (%sr6, PT_SR6 (\regs))
332 SAVE_SP (%sr7, PT_SR7 (\regs))
333
334 SAVE_CR (%cr17, PT_IASQ0(\regs))
335 mtctl %r0, %cr17
336 SAVE_CR (%cr17, PT_IASQ1(\regs))
337
338 SAVE_CR (%cr18, PT_IAOQ0(\regs))
339 mtctl %r0, %cr18
340 SAVE_CR (%cr18, PT_IAOQ1(\regs))
341
342 SAVE_CR (%cr11, PT_SAR (\regs))
343 SAVE_CR (%cr22, PT_PSW (\regs))
344 SAVE_CR (%cr19, PT_IIR (\regs))
345 SAVE_CR (%cr28, PT_GR1 (\regs))
346 SAVE_CR (%cr31, PT_GR29 (\regs))
347
348 STREG %r26, PT_GR26 (\regs)
349 mfctl %cr29, %r26
350 .endm
351
352 .macro rest_specials regs
353
354 REST_SP (%sr0, PT_SR0 (\regs))
355 REST_SP (%sr1, PT_SR1 (\regs))
356 REST_SP (%sr2, PT_SR2 (\regs))
357 REST_SP (%sr3, PT_SR3 (\regs))
358 REST_SP (%sr4, PT_SR4 (\regs))
359 REST_SP (%sr5, PT_SR5 (\regs))
360 REST_SP (%sr6, PT_SR6 (\regs))
361 REST_SP (%sr7, PT_SR7 (\regs))
362
363 REST_CR (%cr17, PT_IASQ0(\regs))
364 REST_CR (%cr17, PT_IASQ1(\regs))
365
366 REST_CR (%cr18, PT_IAOQ0(\regs))
367 REST_CR (%cr18, PT_IAOQ1(\regs))
368
369 REST_CR (%cr11, PT_SAR (\regs))
370
371 REST_CR (%cr22, PT_PSW (\regs))
372 .endm
373
374 #endif
375
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.