ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-ppc64 / ppc_asm.h
1 /*
2  * arch/ppc64/kernel/ppc_asm.h
3  *
4  * Definitions used by various bits of low-level assembly code on PowerPC.
5  *
6  * Copyright (C) 1995-1999 Gary Thomas, Paul Mackerras, Cort Dougan.
7  *
8  *  This program is free software; you can redistribute it and/or
9  *  modify it under the terms of the GNU General Public License
10  *  as published by the Free Software Foundation; either version
11  *  2 of the License, or (at your option) any later version.
12  */
13
14 #ifndef _PPC64_PPC_ASM_H
15 #define _PPC64_PPC_ASM_H
16 /*
17  * Macros for storing registers into and loading registers from
18  * exception frames.
19  */
20 #define SAVE_GPR(n, base)       std     n,GPR0+8*(n)(base)
21 #define SAVE_2GPRS(n, base)     SAVE_GPR(n, base); SAVE_GPR(n+1, base)
22 #define SAVE_4GPRS(n, base)     SAVE_2GPRS(n, base); SAVE_2GPRS(n+2, base)
23 #define SAVE_8GPRS(n, base)     SAVE_4GPRS(n, base); SAVE_4GPRS(n+4, base)
24 #define SAVE_10GPRS(n, base)    SAVE_8GPRS(n, base); SAVE_2GPRS(n+8, base)
25 #define REST_GPR(n, base)       ld      n,GPR0+8*(n)(base)
26 #define REST_2GPRS(n, base)     REST_GPR(n, base); REST_GPR(n+1, base)
27 #define REST_4GPRS(n, base)     REST_2GPRS(n, base); REST_2GPRS(n+2, base)
28 #define REST_8GPRS(n, base)     REST_4GPRS(n, base); REST_4GPRS(n+4, base)
29 #define REST_10GPRS(n, base)    REST_8GPRS(n, base); REST_2GPRS(n+8, base)
30
31 #define SAVE_FPR(n, base)       stfd    n,THREAD_FPR0+8*(n)(base)
32 #define SAVE_2FPRS(n, base)     SAVE_FPR(n, base); SAVE_FPR(n+1, base)
33 #define SAVE_4FPRS(n, base)     SAVE_2FPRS(n, base); SAVE_2FPRS(n+2, base)
34 #define SAVE_8FPRS(n, base)     SAVE_4FPRS(n, base); SAVE_4FPRS(n+4, base)
35 #define SAVE_16FPRS(n, base)    SAVE_8FPRS(n, base); SAVE_8FPRS(n+8, base)
36 #define SAVE_32FPRS(n, base)    SAVE_16FPRS(n, base); SAVE_16FPRS(n+16, base)
37 #define REST_FPR(n, base)       lfd     n,THREAD_FPR0+8*(n)(base)
38 #define REST_2FPRS(n, base)     REST_FPR(n, base); REST_FPR(n+1, base)
39 #define REST_4FPRS(n, base)     REST_2FPRS(n, base); REST_2FPRS(n+2, base)
40 #define REST_8FPRS(n, base)     REST_4FPRS(n, base); REST_4FPRS(n+4, base)
41 #define REST_16FPRS(n, base)    REST_8FPRS(n, base); REST_8FPRS(n+8, base)
42 #define REST_32FPRS(n, base)    REST_16FPRS(n, base); REST_16FPRS(n+16, base)
43
44 #define SAVE_VR(n,b,base)       li b,THREAD_VR0+(16*(n));  stvx n,b,base
45 #define SAVE_2VRS(n,b,base)     SAVE_VR(n,b,base); SAVE_VR(n+1,b,base)
46 #define SAVE_4VRS(n,b,base)     SAVE_2VRS(n,b,base); SAVE_2VRS(n+2,b,base)
47 #define SAVE_8VRS(n,b,base)     SAVE_4VRS(n,b,base); SAVE_4VRS(n+4,b,base)
48 #define SAVE_16VRS(n,b,base)    SAVE_8VRS(n,b,base); SAVE_8VRS(n+8,b,base)
49 #define SAVE_32VRS(n,b,base)    SAVE_16VRS(n,b,base); SAVE_16VRS(n+16,b,base)
50 #define REST_VR(n,b,base)       li b,THREAD_VR0+(16*(n)); lvx n,b,base
51 #define REST_2VRS(n,b,base)     REST_VR(n,b,base); REST_VR(n+1,b,base)
52 #define REST_4VRS(n,b,base)     REST_2VRS(n,b,base); REST_2VRS(n+2,b,base)
53 #define REST_8VRS(n,b,base)     REST_4VRS(n,b,base); REST_4VRS(n+4,b,base)
54 #define REST_16VRS(n,b,base)    REST_8VRS(n,b,base); REST_8VRS(n+8,b,base)
55 #define REST_32VRS(n,b,base)    REST_16VRS(n,b,base); REST_16VRS(n+16,b,base)
56
57 #define CHECKANYINT(ra,rb)                      \
58         mfspr   rb,SPRG3;               /* Get Paca address */\
59         ld      ra,PACALPPACA+LPPACAANYINT(rb); /* Get pending interrupt flags */\
60         cmpldi  0,ra,0;
61
62 /* Macros to adjust thread priority for Iseries hardware multithreading */
63 #define HMT_LOW         or 1,1,1
64 #define HMT_MEDIUM      or 2,2,2
65 #define HMT_HIGH        or 3,3,3
66
67 /* Insert the high 32 bits of the MSR into what will be the new
68    MSR (via SRR1 and rfid)  This preserves the MSR.SF and MSR.ISF
69    bits. */
70
71 #define FIX_SRR1(ra, rb)        \
72         mr      rb,ra;          \
73         mfmsr   ra;             \
74         rldimi  ra,rb,0,32
75
76 #define CLR_TOP32(r)    rlwinm  (r),(r),0,0,31  /* clear top 32 bits */
77
78 /* 
79  * LOADADDR( rn, name )
80  *   loads the address of 'name' into 'rn'
81  *
82  * LOADBASE( rn, name )
83  *   loads the address (less the low 16 bits) of 'name' into 'rn'
84  *   suitable for base+disp addressing
85  */
86 #define LOADADDR(rn,name) \
87         lis     rn,name##@highest;      \
88         ori     rn,rn,name##@higher;    \
89         rldicr  rn,rn,32,31;            \
90         oris    rn,rn,name##@h;         \
91         ori     rn,rn,name##@l
92
93 #define LOADBASE(rn,name) \
94         lis     rn,name@highest;        \
95         ori     rn,rn,name@higher;      \
96         rldicr  rn,rn,32,31;            \
97         oris    rn,rn,name@ha
98
99
100 #define SET_REG_TO_CONST(reg, value)                    \
101         lis     reg,(((value)>>48)&0xFFFF);             \
102         ori     reg,reg,(((value)>>32)&0xFFFF);         \
103         rldicr  reg,reg,32,31;                          \
104         oris    reg,reg,(((value)>>16)&0xFFFF);         \
105         ori     reg,reg,((value)&0xFFFF);
106
107 #define SET_REG_TO_LABEL(reg, label)                    \
108         lis     reg,(label)@highest;                    \
109         ori     reg,reg,(label)@higher;                 \
110         rldicr  reg,reg,32,31;                          \
111         oris    reg,reg,(label)@h;                      \
112         ori     reg,reg,(label)@l;
113
114
115 /* PPPBBB - DRENG  If KERNELBASE is always 0xC0...,
116  * Then we can easily do this with one asm insn. -Peter
117  */
118 #define tophys(rd,rs)                           \
119         lis     rd,((KERNELBASE>>48)&0xFFFF);   \
120         rldicr  rd,rd,32,31;                    \
121         sub     rd,rs,rd
122
123 #define tovirt(rd,rs)                           \
124         lis     rd,((KERNELBASE>>48)&0xFFFF);   \
125         rldicr  rd,rd,32,31;                    \
126         add     rd,rs,rd
127
128 /* Condition Register Bit Fields */
129
130 #define cr0     0
131 #define cr1     1
132 #define cr2     2
133 #define cr3     3
134 #define cr4     4
135 #define cr5     5
136 #define cr6     6
137 #define cr7     7
138
139
140 /* General Purpose Registers (GPRs) */
141
142 #define r0      0
143 #define r1      1
144 #define r2      2
145 #define r3      3
146 #define r4      4
147 #define r5      5
148 #define r6      6
149 #define r7      7
150 #define r8      8
151 #define r9      9
152 #define r10     10
153 #define r11     11
154 #define r12     12
155 #define r13     13
156 #define r14     14
157 #define r15     15
158 #define r16     16
159 #define r17     17
160 #define r18     18
161 #define r19     19
162 #define r20     20
163 #define r21     21
164 #define r22     22
165 #define r23     23
166 #define r24     24
167 #define r25     25
168 #define r26     26
169 #define r27     27
170 #define r28     28
171 #define r29     29
172 #define r30     30
173 #define r31     31
174
175
176 /* Floating Point Registers (FPRs) */
177
178 #define fr0     0
179 #define fr1     1
180 #define fr2     2
181 #define fr3     3
182 #define fr4     4
183 #define fr5     5
184 #define fr6     6
185 #define fr7     7
186 #define fr8     8
187 #define fr9     9
188 #define fr10    10
189 #define fr11    11
190 #define fr12    12
191 #define fr13    13
192 #define fr14    14
193 #define fr15    15
194 #define fr16    16
195 #define fr17    17
196 #define fr18    18
197 #define fr19    19
198 #define fr20    20
199 #define fr21    21
200 #define fr22    22
201 #define fr23    23
202 #define fr24    24
203 #define fr25    25
204 #define fr26    26
205 #define fr27    27
206 #define fr28    28
207 #define fr29    29
208 #define fr30    30
209 #define fr31    31
210
211 #define vr0     0
212 #define vr1     1
213 #define vr2     2
214 #define vr3     3
215 #define vr4     4
216 #define vr5     5
217 #define vr6     6
218 #define vr7     7
219 #define vr8     8
220 #define vr9     9
221 #define vr10    10
222 #define vr11    11
223 #define vr12    12
224 #define vr13    13
225 #define vr14    14
226 #define vr15    15
227 #define vr16    16
228 #define vr17    17
229 #define vr18    18
230 #define vr19    19
231 #define vr20    20
232 #define vr21    21
233 #define vr22    22
234 #define vr23    23
235 #define vr24    24
236 #define vr25    25
237 #define vr26    26
238 #define vr27    27
239 #define vr28    28
240 #define vr29    29
241 #define vr30    30
242 #define vr31    31
243
244 #endif /* _PPC64_PPC_ASM_H */