blob: 6cd52c1303322b658536a96875b88e4ae44cebcf [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 * Copyright (C) 1995-1999 Gary Thomas, Paul Mackerras, Cort Dougan.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 */
4
Kumar Gala5f7c6902005-09-09 15:02:25 -05005#ifndef _ASM_POWERPC_PPC_ASM_H
6#define _ASM_POWERPC_PPC_ASM_H
7
8#ifdef __ASSEMBLY__
Linus Torvalds1da177e2005-04-16 15:20:36 -07009
10/*
11 * Macros for storing registers into and loading registers from
12 * exception frames.
13 */
Kumar Gala5f7c6902005-09-09 15:02:25 -050014#ifdef __powerpc64__
15#define SAVE_GPR(n, base) std n,GPR0+8*(n)(base)
16#define REST_GPR(n, base) ld n,GPR0+8*(n)(base)
17#define SAVE_NVGPRS(base) SAVE_8GPRS(14, base); SAVE_10GPRS(22, base)
18#define REST_NVGPRS(base) REST_8GPRS(14, base); REST_10GPRS(22, base)
19#else
Linus Torvalds1da177e2005-04-16 15:20:36 -070020#define SAVE_GPR(n, base) stw n,GPR0+4*(n)(base)
Linus Torvalds1da177e2005-04-16 15:20:36 -070021#define REST_GPR(n, base) lwz n,GPR0+4*(n)(base)
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#define SAVE_NVGPRS(base) SAVE_GPR(13, base); SAVE_8GPRS(14, base); \
23 SAVE_10GPRS(22, base)
24#define REST_NVGPRS(base) REST_GPR(13, base); REST_8GPRS(14, base); \
25 REST_10GPRS(22, base)
Kumar Gala5f7c6902005-09-09 15:02:25 -050026#endif
27
28
29#define SAVE_2GPRS(n, base) SAVE_GPR(n, base); SAVE_GPR(n+1, base)
30#define SAVE_4GPRS(n, base) SAVE_2GPRS(n, base); SAVE_2GPRS(n+2, base)
31#define SAVE_8GPRS(n, base) SAVE_4GPRS(n, base); SAVE_4GPRS(n+4, base)
32#define SAVE_10GPRS(n, base) SAVE_8GPRS(n, base); SAVE_2GPRS(n+8, base)
33#define REST_2GPRS(n, base) REST_GPR(n, base); REST_GPR(n+1, base)
34#define REST_4GPRS(n, base) REST_2GPRS(n, base); REST_2GPRS(n+2, base)
35#define REST_8GPRS(n, base) REST_4GPRS(n, base); REST_4GPRS(n+4, base)
36#define REST_10GPRS(n, base) REST_8GPRS(n, base); REST_2GPRS(n+8, base)
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
38#define SAVE_FPR(n, base) stfd n,THREAD_FPR0+8*(n)(base)
39#define SAVE_2FPRS(n, base) SAVE_FPR(n, base); SAVE_FPR(n+1, base)
40#define SAVE_4FPRS(n, base) SAVE_2FPRS(n, base); SAVE_2FPRS(n+2, base)
41#define SAVE_8FPRS(n, base) SAVE_4FPRS(n, base); SAVE_4FPRS(n+4, base)
42#define SAVE_16FPRS(n, base) SAVE_8FPRS(n, base); SAVE_8FPRS(n+8, base)
43#define SAVE_32FPRS(n, base) SAVE_16FPRS(n, base); SAVE_16FPRS(n+16, base)
44#define REST_FPR(n, base) lfd n,THREAD_FPR0+8*(n)(base)
45#define REST_2FPRS(n, base) REST_FPR(n, base); REST_FPR(n+1, base)
46#define REST_4FPRS(n, base) REST_2FPRS(n, base); REST_2FPRS(n+2, base)
47#define REST_8FPRS(n, base) REST_4FPRS(n, base); REST_4FPRS(n+4, base)
48#define REST_16FPRS(n, base) REST_8FPRS(n, base); REST_8FPRS(n+8, base)
49#define REST_32FPRS(n, base) REST_16FPRS(n, base); REST_16FPRS(n+16, base)
50
51#define SAVE_VR(n,b,base) li b,THREAD_VR0+(16*(n)); stvx n,b,base
Kumar Gala5f7c6902005-09-09 15:02:25 -050052#define SAVE_2VRS(n,b,base) SAVE_VR(n,b,base); SAVE_VR(n+1,b,base)
53#define SAVE_4VRS(n,b,base) SAVE_2VRS(n,b,base); SAVE_2VRS(n+2,b,base)
54#define SAVE_8VRS(n,b,base) SAVE_4VRS(n,b,base); SAVE_4VRS(n+4,b,base)
55#define SAVE_16VRS(n,b,base) SAVE_8VRS(n,b,base); SAVE_8VRS(n+8,b,base)
56#define SAVE_32VRS(n,b,base) SAVE_16VRS(n,b,base); SAVE_16VRS(n+16,b,base)
Linus Torvalds1da177e2005-04-16 15:20:36 -070057#define REST_VR(n,b,base) li b,THREAD_VR0+(16*(n)); lvx n,b,base
Kumar Gala5f7c6902005-09-09 15:02:25 -050058#define REST_2VRS(n,b,base) REST_VR(n,b,base); REST_VR(n+1,b,base)
59#define REST_4VRS(n,b,base) REST_2VRS(n,b,base); REST_2VRS(n+2,b,base)
60#define REST_8VRS(n,b,base) REST_4VRS(n,b,base); REST_4VRS(n+4,b,base)
61#define REST_16VRS(n,b,base) REST_8VRS(n,b,base); REST_8VRS(n+8,b,base)
62#define REST_32VRS(n,b,base) REST_16VRS(n,b,base); REST_16VRS(n+16,b,base)
Linus Torvalds1da177e2005-04-16 15:20:36 -070063
64#define SAVE_EVR(n,s,base) evmergehi s,s,n; stw s,THREAD_EVR0+4*(n)(base)
Kumar Gala5f7c6902005-09-09 15:02:25 -050065#define SAVE_2EVRS(n,s,base) SAVE_EVR(n,s,base); SAVE_EVR(n+1,s,base)
66#define SAVE_4EVRS(n,s,base) SAVE_2EVRS(n,s,base); SAVE_2EVRS(n+2,s,base)
67#define SAVE_8EVRS(n,s,base) SAVE_4EVRS(n,s,base); SAVE_4EVRS(n+4,s,base)
68#define SAVE_16EVRS(n,s,base) SAVE_8EVRS(n,s,base); SAVE_8EVRS(n+8,s,base)
69#define SAVE_32EVRS(n,s,base) SAVE_16EVRS(n,s,base); SAVE_16EVRS(n+16,s,base)
Linus Torvalds1da177e2005-04-16 15:20:36 -070070#define REST_EVR(n,s,base) lwz s,THREAD_EVR0+4*(n)(base); evmergelo n,s,n
Kumar Gala5f7c6902005-09-09 15:02:25 -050071#define REST_2EVRS(n,s,base) REST_EVR(n,s,base); REST_EVR(n+1,s,base)
72#define REST_4EVRS(n,s,base) REST_2EVRS(n,s,base); REST_2EVRS(n+2,s,base)
73#define REST_8EVRS(n,s,base) REST_4EVRS(n,s,base); REST_4EVRS(n+4,s,base)
74#define REST_16EVRS(n,s,base) REST_8EVRS(n,s,base); REST_8EVRS(n+8,s,base)
75#define REST_32EVRS(n,s,base) REST_16EVRS(n,s,base); REST_16EVRS(n+16,s,base)
Linus Torvalds1da177e2005-04-16 15:20:36 -070076
Kumar Gala5f7c6902005-09-09 15:02:25 -050077/* Macros to adjust thread priority for Iseries hardware multithreading */
Becky Brucefeaf7cf2005-09-22 14:20:04 -050078#define HMT_VERY_LOW or 31,31,31 # very low priority\n"
Kumar Gala5f7c6902005-09-09 15:02:25 -050079#define HMT_LOW or 1,1,1
Becky Brucefeaf7cf2005-09-22 14:20:04 -050080#define HMT_MEDIUM_LOW or 6,6,6 # medium low priority\n"
Kumar Gala5f7c6902005-09-09 15:02:25 -050081#define HMT_MEDIUM or 2,2,2
Becky Brucefeaf7cf2005-09-22 14:20:04 -050082#define HMT_MEDIUM_HIGH or 5,5,5 # medium high priority\n"
Kumar Gala5f7c6902005-09-09 15:02:25 -050083#define HMT_HIGH or 3,3,3
84
85/* handle instructions that older assemblers may not know */
86#define RFCI .long 0x4c000066 /* rfci instruction */
87#define RFDI .long 0x4c00004e /* rfdi instruction */
88#define RFMCI .long 0x4c00004c /* rfmci instruction */
89
90/*
91 * LOADADDR( rn, name )
92 * loads the address of 'name' into 'rn'
93 *
94 * LOADBASE( rn, name )
95 * loads the address (less the low 16 bits) of 'name' into 'rn'
96 * suitable for base+disp addressing
97 */
98#ifdef __powerpc64__
99#define LOADADDR(rn,name) \
100 lis rn,name##@highest; \
101 ori rn,rn,name##@higher; \
102 rldicr rn,rn,32,31; \
103 oris rn,rn,name##@h; \
104 ori rn,rn,name##@l
105
Paul Mackerrasb85a0462005-10-06 10:59:19 +1000106#define LOADBASE(rn,name) \
107 .section .toc,"aw"; \
1081: .tc name[TC],name; \
109 .previous; \
110 ld rn,1b@toc(r2)
Kumar Gala5f7c6902005-09-09 15:02:25 -0500111
Paul Mackerrasb85a0462005-10-06 10:59:19 +1000112#define OFF(name) 0
Kumar Gala5f7c6902005-09-09 15:02:25 -0500113
114#define SET_REG_TO_CONST(reg, value) \
115 lis reg,(((value)>>48)&0xFFFF); \
116 ori reg,reg,(((value)>>32)&0xFFFF); \
117 rldicr reg,reg,32,31; \
118 oris reg,reg,(((value)>>16)&0xFFFF); \
119 ori reg,reg,((value)&0xFFFF);
120
121#define SET_REG_TO_LABEL(reg, label) \
122 lis reg,(label)@highest; \
123 ori reg,reg,(label)@higher; \
124 rldicr reg,reg,32,31; \
125 oris reg,reg,(label)@h; \
126 ori reg,reg,(label)@l;
Paul Mackerrasb85a0462005-10-06 10:59:19 +1000127
128/* operations for longs and pointers */
129#define LDL ld
130#define STL std
131#define CMPI cmpdi
132
133#else /* 32-bit */
134#define LOADBASE(rn,name) \
135 lis rn,name@ha
136
137#define OFF(name) name@l
138
139/* operations for longs and pointers */
140#define LDL lwz
141#define STL stw
142#define CMPI cmpwi
143
Kumar Gala5f7c6902005-09-09 15:02:25 -0500144#endif
145
146/* various errata or part fixups */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147#ifdef CONFIG_PPC601_SYNC_FIX
148#define SYNC \
149BEGIN_FTR_SECTION \
150 sync; \
151 isync; \
152END_FTR_SECTION_IFSET(CPU_FTR_601)
153#define SYNC_601 \
154BEGIN_FTR_SECTION \
155 sync; \
156END_FTR_SECTION_IFSET(CPU_FTR_601)
157#define ISYNC_601 \
158BEGIN_FTR_SECTION \
159 isync; \
160END_FTR_SECTION_IFSET(CPU_FTR_601)
161#else
162#define SYNC
163#define SYNC_601
164#define ISYNC_601
165#endif
166
Kumar Gala5f7c6902005-09-09 15:02:25 -0500167
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168#ifndef CONFIG_SMP
169#define TLBSYNC
170#else /* CONFIG_SMP */
171/* tlbsync is not implemented on 601 */
172#define TLBSYNC \
173BEGIN_FTR_SECTION \
174 tlbsync; \
175 sync; \
176END_FTR_SECTION_IFCLR(CPU_FTR_601)
177#endif
178
Kumar Gala5f7c6902005-09-09 15:02:25 -0500179
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180/*
181 * This instruction is not implemented on the PPC 603 or 601; however, on
182 * the 403GCX and 405GP tlbia IS defined and tlbie is not.
183 * All of these instructions exist in the 8xx, they have magical powers,
184 * and they must be used.
185 */
186
187#if !defined(CONFIG_4xx) && !defined(CONFIG_8xx)
188#define tlbia \
189 li r4,1024; \
190 mtctr r4; \
191 lis r4,KERNELBASE@h; \
1920: tlbie r4; \
193 addi r4,r4,0x1000; \
194 bdnz 0b
195#endif
196
Kumar Gala5f7c6902005-09-09 15:02:25 -0500197
198#ifdef CONFIG_IBM405_ERR77
199#define PPC405_ERR77(ra,rb) dcbt ra, rb;
200#define PPC405_ERR77_SYNC sync;
201#else
202#define PPC405_ERR77(ra,rb)
203#define PPC405_ERR77_SYNC
204#endif
205
206
207#ifdef CONFIG_IBM440EP_ERR42
208#define PPC440EP_ERR42 isync
209#else
210#define PPC440EP_ERR42
211#endif
212
213
214#if defined(CONFIG_BOOKE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215#define tophys(rd,rs) \
216 addis rd,rs,0
217
218#define tovirt(rd,rs) \
219 addis rd,rs,0
220
Kumar Gala5f7c6902005-09-09 15:02:25 -0500221#elif defined(CONFIG_PPC64)
222/* PPPBBB - DRENG If KERNELBASE is always 0xC0...,
223 * Then we can easily do this with one asm insn. -Peter
224 */
225#define tophys(rd,rs) \
226 lis rd,((KERNELBASE>>48)&0xFFFF); \
227 rldicr rd,rd,32,31; \
228 sub rd,rs,rd
229
230#define tovirt(rd,rs) \
231 lis rd,((KERNELBASE>>48)&0xFFFF); \
232 rldicr rd,rd,32,31; \
233 add rd,rs,rd
234#else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235/*
236 * On APUS (Amiga PowerPC cpu upgrade board), we don't know the
237 * physical base address of RAM at compile time.
238 */
239#define tophys(rd,rs) \
2400: addis rd,rs,-KERNELBASE@h; \
241 .section ".vtop_fixup","aw"; \
242 .align 1; \
243 .long 0b; \
244 .previous
245
246#define tovirt(rd,rs) \
2470: addis rd,rs,KERNELBASE@h; \
248 .section ".ptov_fixup","aw"; \
249 .align 1; \
250 .long 0b; \
251 .previous
Kumar Gala5f7c6902005-09-09 15:02:25 -0500252#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253
254/*
255 * On 64-bit cpus, we use the rfid instruction instead of rfi, but
256 * we then have to make sure we preserve the top 32 bits except for
257 * the 64-bit mode bit, which we clear.
258 */
Kumar Gala5f7c6902005-09-09 15:02:25 -0500259#if defined(CONFIG_PPC64BRIDGE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260#define FIX_SRR1(ra, rb) \
261 mr rb,ra; \
262 mfmsr ra; \
263 clrldi ra,ra,1; /* turn off 64-bit mode */ \
264 rldimi ra,rb,0,32
265#define RFI .long 0x4c000024 /* rfid instruction */
266#define MTMSRD(r) .long (0x7c000164 + ((r) << 21)) /* mtmsrd */
267#define CLR_TOP32(r) rlwinm (r),(r),0,0,31 /* clear top 32 bits */
Kumar Gala5f7c6902005-09-09 15:02:25 -0500268#elif defined(CONFIG_PPC64)
269/* Insert the high 32 bits of the MSR into what will be the new
270 MSR (via SRR1 and rfid) This preserves the MSR.SF and MSR.ISF
271 bits. */
272
273#define FIX_SRR1(ra, rb) \
274 mr rb,ra; \
275 mfmsr ra; \
276 rldimi ra,rb,0,32
277
278#define CLR_TOP32(r) rlwinm (r),(r),0,0,31 /* clear top 32 bits */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700279
280#else
281#define FIX_SRR1(ra, rb)
282#ifndef CONFIG_40x
283#define RFI rfi
284#else
285#define RFI rfi; b . /* Prevent prefetch past rfi */
286#endif
287#define MTMSRD(r) mtmsr r
288#define CLR_TOP32(r)
Matt Porterc9cf73a2005-07-31 22:34:52 -0700289#endif
290
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291/* The boring bits... */
292
293/* Condition Register Bit Fields */
294
295#define cr0 0
296#define cr1 1
297#define cr2 2
298#define cr3 3
299#define cr4 4
300#define cr5 5
301#define cr6 6
302#define cr7 7
303
304
305/* General Purpose Registers (GPRs) */
306
307#define r0 0
308#define r1 1
309#define r2 2
310#define r3 3
311#define r4 4
312#define r5 5
313#define r6 6
314#define r7 7
315#define r8 8
316#define r9 9
317#define r10 10
318#define r11 11
319#define r12 12
320#define r13 13
321#define r14 14
322#define r15 15
323#define r16 16
324#define r17 17
325#define r18 18
326#define r19 19
327#define r20 20
328#define r21 21
329#define r22 22
330#define r23 23
331#define r24 24
332#define r25 25
333#define r26 26
334#define r27 27
335#define r28 28
336#define r29 29
337#define r30 30
338#define r31 31
339
340
341/* Floating Point Registers (FPRs) */
342
343#define fr0 0
344#define fr1 1
345#define fr2 2
346#define fr3 3
347#define fr4 4
348#define fr5 5
349#define fr6 6
350#define fr7 7
351#define fr8 8
352#define fr9 9
353#define fr10 10
354#define fr11 11
355#define fr12 12
356#define fr13 13
357#define fr14 14
358#define fr15 15
359#define fr16 16
360#define fr17 17
361#define fr18 18
362#define fr19 19
363#define fr20 20
364#define fr21 21
365#define fr22 22
366#define fr23 23
367#define fr24 24
368#define fr25 25
369#define fr26 26
370#define fr27 27
371#define fr28 28
372#define fr29 29
373#define fr30 30
374#define fr31 31
375
Kumar Gala5f7c6902005-09-09 15:02:25 -0500376/* AltiVec Registers (VPRs) */
377
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378#define vr0 0
379#define vr1 1
380#define vr2 2
381#define vr3 3
382#define vr4 4
383#define vr5 5
384#define vr6 6
385#define vr7 7
386#define vr8 8
387#define vr9 9
388#define vr10 10
389#define vr11 11
390#define vr12 12
391#define vr13 13
392#define vr14 14
393#define vr15 15
394#define vr16 16
395#define vr17 17
396#define vr18 18
397#define vr19 19
398#define vr20 20
399#define vr21 21
400#define vr22 22
401#define vr23 23
402#define vr24 24
403#define vr25 25
404#define vr26 26
405#define vr27 27
406#define vr28 28
407#define vr29 29
408#define vr30 30
409#define vr31 31
410
Kumar Gala5f7c6902005-09-09 15:02:25 -0500411/* SPE Registers (EVPRs) */
412
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413#define evr0 0
414#define evr1 1
415#define evr2 2
416#define evr3 3
417#define evr4 4
418#define evr5 5
419#define evr6 6
420#define evr7 7
421#define evr8 8
422#define evr9 9
423#define evr10 10
424#define evr11 11
425#define evr12 12
426#define evr13 13
427#define evr14 14
428#define evr15 15
429#define evr16 16
430#define evr17 17
431#define evr18 18
432#define evr19 19
433#define evr20 20
434#define evr21 21
435#define evr22 22
436#define evr23 23
437#define evr24 24
438#define evr25 25
439#define evr26 26
440#define evr27 27
441#define evr28 28
442#define evr29 29
443#define evr30 30
444#define evr31 31
445
446/* some stab codes */
447#define N_FUN 36
448#define N_RSYM 64
449#define N_SLINE 68
450#define N_SO 100
Kumar Gala5f7c6902005-09-09 15:02:25 -0500451
452#define ASM_CONST(x) x
453#else
454 #define __ASM_CONST(x) x##UL
455 #define ASM_CONST(x) __ASM_CONST(x)
456#endif /* __ASSEMBLY__ */
457
458#endif /* _ASM_POWERPC_PPC_ASM_H */