1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <asm/asmmacro.h>
16#include <asm/processor.h>
17#include <asm/export.h>
18
19 .data
20pal_entry_point:
21 data8 ia64_pal_default_handler
22 .text
23
24
25
26
27
28
29
30
31
32GLOBAL_ENTRY(ia64_pal_handler_init)
33 alloc r3=ar.pfs,1,0,0,0
34 movl r2=pal_entry_point
35 ;;
36 st8 [r2]=in0
37 br.ret.sptk.many rp
38END(ia64_pal_handler_init)
39
40
41
42
43
44
45GLOBAL_ENTRY(ia64_pal_default_handler)
46 mov r8=-1
47 br.cond.sptk.many rp
48END(ia64_pal_default_handler)
49
50
51
52
53
54
55
56GLOBAL_ENTRY(ia64_pal_call_static)
57 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4)
58 alloc loc1 = ar.pfs,4,5,0,0
59 movl loc2 = pal_entry_point
601: {
61 mov r28 = in0
62 mov r29 = in1
63 mov r8 = ip
64 }
65 ;;
66 ld8 loc2 = [loc2]
67 adds r8 = 1f-1b,r8
68 mov loc4=ar.rsc
69 ;;
70 mov ar.rsc=0
71 mov loc3 = psr
72 mov loc0 = rp
73 .body
74 mov r30 = in2
75
76 mov r31 = in3
77 mov b7 = loc2
78
79 rsm psr.i
80 ;;
81 mov rp = r8
82 br.cond.sptk.many b7
831: mov psr.l = loc3
84 mov ar.rsc = loc4
85 mov ar.pfs = loc1
86 mov rp = loc0
87 ;;
88 srlz.d
89 br.ret.sptk.many b0
90END(ia64_pal_call_static)
91EXPORT_SYMBOL(ia64_pal_call_static)
92
93
94
95
96
97
98
99
100GLOBAL_ENTRY(ia64_pal_call_stacked)
101 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4)
102 alloc loc1 = ar.pfs,4,4,4,0
103 movl loc2 = pal_entry_point
104
105 mov r28 = in0
106 mov out0 = in0
107 mov loc0 = rp
108 .body
109 ;;
110 ld8 loc2 = [loc2]
111 mov out1 = in1
112 mov out2 = in2
113 mov out3 = in3
114 mov loc3 = psr
115 ;;
116 rsm psr.i
117 mov b7 = loc2
118 ;;
119 br.call.sptk.many rp=b7
120.ret0: mov psr.l = loc3
121 mov ar.pfs = loc1
122 mov rp = loc0
123 ;;
124 srlz.d
125 br.ret.sptk.many b0
126END(ia64_pal_call_stacked)
127EXPORT_SYMBOL(ia64_pal_call_stacked)
128
129
130
131
132
133
134
135
136
137
138
139#define PAL_PSR_BITS_TO_CLEAR \
140 (IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | IA64_PSR_DB | IA64_PSR_RT |\
141 IA64_PSR_DD | IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED | \
142 IA64_PSR_DFL | IA64_PSR_DFH)
143
144#define PAL_PSR_BITS_TO_SET \
145 (IA64_PSR_BN)
146
147
148GLOBAL_ENTRY(ia64_pal_call_phys_static)
149 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(4)
150 alloc loc1 = ar.pfs,4,7,0,0
151 movl loc2 = pal_entry_point
1521: {
153 mov r28 = in0
154 mov r8 = ip
155 mov loc0 = rp
156 }
157 .body
158 ;;
159 ld8 loc2 = [loc2]
160 mov r29 = in1
161 mov r30 = in2
162 mov r31 = in3
163 ;;
164 mov loc3 = psr
165 adds r8 = 1f-1b,r8
166 ;;
167 mov loc4=ar.rsc
168 dep.z loc2=loc2,0,61
169 tpa r8=r8
170 ;;
171 mov b7 = loc2
172 mov ar.rsc=0
173 movl r16=PAL_PSR_BITS_TO_CLEAR
174 movl r17=PAL_PSR_BITS_TO_SET
175 ;;
176 or loc3=loc3,r17
177 ;;
178 andcm r16=loc3,r16
179 br.call.sptk.many rp=ia64_switch_mode_phys
180 mov rp = r8
181 mov loc5 = r19
182 mov loc6 = r20
183 br.cond.sptk.many b7
1841:
185 mov ar.rsc=0
186 mov r16=loc3
187 mov r19=loc5
188 mov r20=loc6
189 br.call.sptk.many rp=ia64_switch_mode_virt
190 mov psr.l = loc3
191
192 mov ar.pfs = loc1
193 mov rp = loc0
194 ;;
195 mov ar.rsc=loc4
196 srlz.d
197 br.ret.sptk.many b0
198END(ia64_pal_call_phys_static)
199EXPORT_SYMBOL(ia64_pal_call_phys_static)
200
201
202
203
204
205
206
207
208GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
209 .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(5)
210 alloc loc1 = ar.pfs,5,7,4,0
211 movl loc2 = pal_entry_point
2121: {
213 mov r28 = in0
214 mov loc0 = rp
215 }
216 .body
217 ;;
218 ld8 loc2 = [loc2]
219 mov loc3 = psr
220 ;;
221 mov loc4=ar.rsc
222 dep.z loc2=loc2,0,61
223 ;;
224 mov ar.rsc=0
225 movl r16=PAL_PSR_BITS_TO_CLEAR
226 movl r17=PAL_PSR_BITS_TO_SET
227 ;;
228 or loc3=loc3,r17
229 mov b7 = loc2
230 ;;
231 andcm r16=loc3,r16
232 br.call.sptk.many rp=ia64_switch_mode_phys
233
234 mov out0 = in0
235 mov out1 = in1
236 mov out2 = in2
237 mov out3 = in3
238 mov loc5 = r19
239 mov loc6 = r20
240
241 br.call.sptk.many rp=b7
242
243 mov ar.rsc=0
244 mov r16=loc3
245 mov r19=loc5
246 mov r20=loc6
247 br.call.sptk.many rp=ia64_switch_mode_virt
248
249 mov psr.l = loc3
250 mov ar.pfs = loc1
251 mov rp = loc0
252 ;;
253 mov ar.rsc=loc4
254 srlz.d
255 br.ret.sptk.many b0
256END(ia64_pal_call_phys_stacked)
257EXPORT_SYMBOL(ia64_pal_call_phys_stacked)
258
259
260
261
262
263
264
265
266
267
268
269GLOBAL_ENTRY(ia64_save_scratch_fpregs)
270 alloc r3=ar.pfs,1,0,0,0
271 add r2=16,in0
272 ;;
273 stf.spill [in0] = f10,32
274 stf.spill [r2] = f11,32
275 ;;
276 stf.spill [in0] = f12,32
277 stf.spill [r2] = f13,32
278 ;;
279 stf.spill [in0] = f14,32
280 stf.spill [r2] = f15,32
281 br.ret.sptk.many rp
282END(ia64_save_scratch_fpregs)
283EXPORT_SYMBOL(ia64_save_scratch_fpregs)
284
285
286
287
288
289
290
291GLOBAL_ENTRY(ia64_load_scratch_fpregs)
292 alloc r3=ar.pfs,1,0,0,0
293 add r2=16,in0
294 ;;
295 ldf.fill f10 = [in0],32
296 ldf.fill f11 = [r2],32
297 ;;
298 ldf.fill f12 = [in0],32
299 ldf.fill f13 = [r2],32
300 ;;
301 ldf.fill f14 = [in0],32
302 ldf.fill f15 = [r2],32
303 br.ret.sptk.many rp
304END(ia64_load_scratch_fpregs)
305EXPORT_SYMBOL(ia64_load_scratch_fpregs)
306