repo init
[linux-rt-nao.git] / arch / ia64 / include / asm / xen / inst.h
blob19c2ae1d878a0473278b35a198114b860ba52d74
1 /******************************************************************************
2 * arch/ia64/include/asm/xen/inst.h
4 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
5 * VA Linux Systems Japan K.K.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <asm/xen/privop.h>
25 #define ia64_ivt xen_ivt
26 #define DO_SAVE_MIN XEN_DO_SAVE_MIN
28 #define __paravirt_switch_to xen_switch_to
29 #define __paravirt_leave_syscall xen_leave_syscall
30 #define __paravirt_work_processed_syscall xen_work_processed_syscall
31 #define __paravirt_leave_kernel xen_leave_kernel
32 #define __paravirt_pending_syscall_end xen_work_pending_syscall_end
33 #define __paravirt_work_processed_syscall_target \
34 xen_work_processed_syscall
36 #define MOV_FROM_IFA(reg) \
37 movl reg = XSI_IFA; \
38 ;; \
39 ld8 reg = [reg]
41 #define MOV_FROM_ITIR(reg) \
42 movl reg = XSI_ITIR; \
43 ;; \
44 ld8 reg = [reg]
46 #define MOV_FROM_ISR(reg) \
47 movl reg = XSI_ISR; \
48 ;; \
49 ld8 reg = [reg]
51 #define MOV_FROM_IHA(reg) \
52 movl reg = XSI_IHA; \
53 ;; \
54 ld8 reg = [reg]
56 #define MOV_FROM_IPSR(pred, reg) \
57 (pred) movl reg = XSI_IPSR; \
58 ;; \
59 (pred) ld8 reg = [reg]
61 #define MOV_FROM_IIM(reg) \
62 movl reg = XSI_IIM; \
63 ;; \
64 ld8 reg = [reg]
66 #define MOV_FROM_IIP(reg) \
67 movl reg = XSI_IIP; \
68 ;; \
69 ld8 reg = [reg]
71 .macro __MOV_FROM_IVR reg, clob
72 .ifc "\reg", "r8"
73 XEN_HYPER_GET_IVR
74 .exitm
75 .endif
76 .ifc "\clob", "r8"
77 XEN_HYPER_GET_IVR
79 mov \reg = r8
80 .exitm
81 .endif
83 mov \clob = r8
85 XEN_HYPER_GET_IVR
87 mov \reg = r8
89 mov r8 = \clob
90 .endm
91 #define MOV_FROM_IVR(reg, clob) __MOV_FROM_IVR reg, clob
93 .macro __MOV_FROM_PSR pred, reg, clob
94 .ifc "\reg", "r8"
95 (\pred) XEN_HYPER_GET_PSR;
96 .exitm
97 .endif
98 .ifc "\clob", "r8"
99 (\pred) XEN_HYPER_GET_PSR
101 (\pred) mov \reg = r8
102 .exitm
103 .endif
105 (\pred) mov \clob = r8
106 (\pred) XEN_HYPER_GET_PSR
108 (\pred) mov \reg = r8
109 (\pred) mov r8 = \clob
110 .endm
111 #define MOV_FROM_PSR(pred, reg, clob) __MOV_FROM_PSR pred, reg, clob
114 #define MOV_TO_IFA(reg, clob) \
115 movl clob = XSI_IFA; \
116 ;; \
117 st8 [clob] = reg \
119 #define MOV_TO_ITIR(pred, reg, clob) \
120 (pred) movl clob = XSI_ITIR; \
121 ;; \
122 (pred) st8 [clob] = reg
124 #define MOV_TO_IHA(pred, reg, clob) \
125 (pred) movl clob = XSI_IHA; \
126 ;; \
127 (pred) st8 [clob] = reg
129 #define MOV_TO_IPSR(pred, reg, clob) \
130 (pred) movl clob = XSI_IPSR; \
131 ;; \
132 (pred) st8 [clob] = reg; \
135 #define MOV_TO_IFS(pred, reg, clob) \
136 (pred) movl clob = XSI_IFS; \
137 ;; \
138 (pred) st8 [clob] = reg; \
141 #define MOV_TO_IIP(reg, clob) \
142 movl clob = XSI_IIP; \
143 ;; \
144 st8 [clob] = reg
146 .macro ____MOV_TO_KR kr, reg, clob0, clob1
147 .ifc "\clob0", "r9"
148 .error "clob0 \clob0 must not be r9"
149 .endif
150 .ifc "\clob1", "r8"
151 .error "clob1 \clob1 must not be r8"
152 .endif
154 .ifnc "\reg", "r9"
155 .ifnc "\clob1", "r9"
156 mov \clob1 = r9
157 .endif
158 mov r9 = \reg
159 .endif
160 .ifnc "\clob0", "r8"
161 mov \clob0 = r8
162 .endif
163 mov r8 = \kr
165 XEN_HYPER_SET_KR
167 .ifnc "\reg", "r9"
168 .ifnc "\clob1", "r9"
169 mov r9 = \clob1
170 .endif
171 .endif
172 .ifnc "\clob0", "r8"
173 mov r8 = \clob0
174 .endif
175 .endm
177 .macro __MOV_TO_KR kr, reg, clob0, clob1
178 .ifc "\clob0", "r9"
179 ____MOV_TO_KR \kr, \reg, \clob1, \clob0
180 .exitm
181 .endif
182 .ifc "\clob1", "r8"
183 ____MOV_TO_KR \kr, \reg, \clob1, \clob0
184 .exitm
185 .endif
187 ____MOV_TO_KR \kr, \reg, \clob0, \clob1
188 .endm
190 #define MOV_TO_KR(kr, reg, clob0, clob1) \
191 __MOV_TO_KR IA64_KR_ ## kr, reg, clob0, clob1
194 .macro __ITC_I pred, reg, clob
195 .ifc "\reg", "r8"
196 (\pred) XEN_HYPER_ITC_I
197 .exitm
198 .endif
199 .ifc "\clob", "r8"
200 (\pred) mov r8 = \reg
202 (\pred) XEN_HYPER_ITC_I
203 .exitm
204 .endif
206 (\pred) mov \clob = r8
207 (\pred) mov r8 = \reg
209 (\pred) XEN_HYPER_ITC_I
211 (\pred) mov r8 = \clob
213 .endm
214 #define ITC_I(pred, reg, clob) __ITC_I pred, reg, clob
216 .macro __ITC_D pred, reg, clob
217 .ifc "\reg", "r8"
218 (\pred) XEN_HYPER_ITC_D
220 .exitm
221 .endif
222 .ifc "\clob", "r8"
223 (\pred) mov r8 = \reg
225 (\pred) XEN_HYPER_ITC_D
227 .exitm
228 .endif
230 (\pred) mov \clob = r8
231 (\pred) mov r8 = \reg
233 (\pred) XEN_HYPER_ITC_D
235 (\pred) mov r8 = \clob
237 .endm
238 #define ITC_D(pred, reg, clob) __ITC_D pred, reg, clob
240 .macro __ITC_I_AND_D pred_i, pred_d, reg, clob
241 .ifc "\reg", "r8"
242 (\pred_i)XEN_HYPER_ITC_I
244 (\pred_d)XEN_HYPER_ITC_D
246 .exitm
247 .endif
248 .ifc "\clob", "r8"
249 mov r8 = \reg
251 (\pred_i)XEN_HYPER_ITC_I
253 (\pred_d)XEN_HYPER_ITC_D
255 .exitm
256 .endif
258 mov \clob = r8
259 mov r8 = \reg
261 (\pred_i)XEN_HYPER_ITC_I
263 (\pred_d)XEN_HYPER_ITC_D
265 mov r8 = \clob
267 .endm
268 #define ITC_I_AND_D(pred_i, pred_d, reg, clob) \
269 __ITC_I_AND_D pred_i, pred_d, reg, clob
271 .macro __THASH pred, reg0, reg1, clob
272 .ifc "\reg0", "r8"
273 (\pred) mov r8 = \reg1
274 (\pred) XEN_HYPER_THASH
275 .exitm
276 .endc
277 .ifc "\reg1", "r8"
278 (\pred) XEN_HYPER_THASH
280 (\pred) mov \reg0 = r8
282 .exitm
283 .endif
284 .ifc "\clob", "r8"
285 (\pred) mov r8 = \reg1
286 (\pred) XEN_HYPER_THASH
288 (\pred) mov \reg0 = r8
290 .exitm
291 .endif
293 (\pred) mov \clob = r8
294 (\pred) mov r8 = \reg1
295 (\pred) XEN_HYPER_THASH
297 (\pred) mov \reg0 = r8
298 (\pred) mov r8 = \clob
300 .endm
301 #define THASH(pred, reg0, reg1, clob) __THASH pred, reg0, reg1, clob
303 #define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1) \
304 mov clob0 = 1; \
305 movl clob1 = XSI_PSR_IC; \
306 ;; \
307 st4 [clob1] = clob0 \
310 #define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1) \
311 ;; \
312 srlz.d; \
313 mov clob1 = 1; \
314 movl clob0 = XSI_PSR_IC; \
315 ;; \
316 st4 [clob0] = clob1
318 #define RSM_PSR_IC(clob) \
319 movl clob = XSI_PSR_IC; \
320 ;; \
321 st4 [clob] = r0; \
324 /* pred will be clobbered */
325 #define MASK_TO_PEND_OFS (-1)
326 #define SSM_PSR_I(pred, pred_clob, clob) \
327 (pred) movl clob = XSI_PSR_I_ADDR \
328 ;; \
329 (pred) ld8 clob = [clob] \
330 ;; \
331 /* if (pred) vpsr.i = 1 */ \
332 /* if (pred) (vcpu->vcpu_info->evtchn_upcall_mask)=0 */ \
333 (pred) st1 [clob] = r0, MASK_TO_PEND_OFS \
334 ;; \
335 /* if (vcpu->vcpu_info->evtchn_upcall_pending) */ \
336 (pred) ld1 clob = [clob] \
337 ;; \
338 (pred) cmp.ne.unc pred_clob, p0 = clob, r0 \
339 ;; \
340 (pred_clob)XEN_HYPER_SSM_I /* do areal ssm psr.i */
342 #define RSM_PSR_I(pred, clob0, clob1) \
343 movl clob0 = XSI_PSR_I_ADDR; \
344 mov clob1 = 1; \
345 ;; \
346 ld8 clob0 = [clob0]; \
347 ;; \
348 (pred) st1 [clob0] = clob1
350 #define RSM_PSR_I_IC(clob0, clob1, clob2) \
351 movl clob0 = XSI_PSR_I_ADDR; \
352 movl clob1 = XSI_PSR_IC; \
353 ;; \
354 ld8 clob0 = [clob0]; \
355 mov clob2 = 1; \
356 ;; \
357 /* note: clears both vpsr.i and vpsr.ic! */ \
358 st1 [clob0] = clob2; \
359 st4 [clob1] = r0; \
362 #define RSM_PSR_DT \
363 XEN_HYPER_RSM_PSR_DT
365 #define SSM_PSR_DT_AND_SRLZ_I \
366 XEN_HYPER_SSM_PSR_DT
368 #define BSW_0(clob0, clob1, clob2) \
369 ;; \
370 /* r16-r31 all now hold bank1 values */ \
371 mov clob2 = ar.unat; \
372 movl clob0 = XSI_BANK1_R16; \
373 movl clob1 = XSI_BANK1_R16 + 8; \
374 ;; \
375 .mem.offset 0, 0; st8.spill [clob0] = r16, 16; \
376 .mem.offset 8, 0; st8.spill [clob1] = r17, 16; \
377 ;; \
378 .mem.offset 0, 0; st8.spill [clob0] = r18, 16; \
379 .mem.offset 8, 0; st8.spill [clob1] = r19, 16; \
380 ;; \
381 .mem.offset 0, 0; st8.spill [clob0] = r20, 16; \
382 .mem.offset 8, 0; st8.spill [clob1] = r21, 16; \
383 ;; \
384 .mem.offset 0, 0; st8.spill [clob0] = r22, 16; \
385 .mem.offset 8, 0; st8.spill [clob1] = r23, 16; \
386 ;; \
387 .mem.offset 0, 0; st8.spill [clob0] = r24, 16; \
388 .mem.offset 8, 0; st8.spill [clob1] = r25, 16; \
389 ;; \
390 .mem.offset 0, 0; st8.spill [clob0] = r26, 16; \
391 .mem.offset 8, 0; st8.spill [clob1] = r27, 16; \
392 ;; \
393 .mem.offset 0, 0; st8.spill [clob0] = r28, 16; \
394 .mem.offset 8, 0; st8.spill [clob1] = r29, 16; \
395 ;; \
396 .mem.offset 0, 0; st8.spill [clob0] = r30, 16; \
397 .mem.offset 8, 0; st8.spill [clob1] = r31, 16; \
398 ;; \
399 mov clob1 = ar.unat; \
400 movl clob0 = XSI_B1NAT; \
401 ;; \
402 st8 [clob0] = clob1; \
403 mov ar.unat = clob2; \
404 movl clob0 = XSI_BANKNUM; \
405 ;; \
406 st4 [clob0] = r0
409 /* FIXME: THIS CODE IS NOT NaT SAFE! */
410 #define XEN_BSW_1(clob) \
411 mov clob = ar.unat; \
412 movl r30 = XSI_B1NAT; \
413 ;; \
414 ld8 r30 = [r30]; \
415 mov r31 = 1; \
416 ;; \
417 mov ar.unat = r30; \
418 movl r30 = XSI_BANKNUM; \
419 ;; \
420 st4 [r30] = r31; \
421 movl r30 = XSI_BANK1_R16; \
422 movl r31 = XSI_BANK1_R16+8; \
423 ;; \
424 ld8.fill r16 = [r30], 16; \
425 ld8.fill r17 = [r31], 16; \
426 ;; \
427 ld8.fill r18 = [r30], 16; \
428 ld8.fill r19 = [r31], 16; \
429 ;; \
430 ld8.fill r20 = [r30], 16; \
431 ld8.fill r21 = [r31], 16; \
432 ;; \
433 ld8.fill r22 = [r30], 16; \
434 ld8.fill r23 = [r31], 16; \
435 ;; \
436 ld8.fill r24 = [r30], 16; \
437 ld8.fill r25 = [r31], 16; \
438 ;; \
439 ld8.fill r26 = [r30], 16; \
440 ld8.fill r27 = [r31], 16; \
441 ;; \
442 ld8.fill r28 = [r30], 16; \
443 ld8.fill r29 = [r31], 16; \
444 ;; \
445 ld8.fill r30 = [r30]; \
446 ld8.fill r31 = [r31]; \
447 ;; \
448 mov ar.unat = clob
450 #define BSW_1(clob0, clob1) XEN_BSW_1(clob1)
453 #define COVER \
454 XEN_HYPER_COVER
456 #define RFI \
457 XEN_HYPER_RFI; \
458 dv_serialize_data