2 * Support routines for Xen hypercalls
4 * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
7 #include <asm/processor.h>
8 #include <asm/asmmacro.h>
10 /* To clear vpsr.ic, vpsr.i needs to be cleared first */
11 #define XEN_CLEAR_PSR_IC \
13 movl r15=XSI_PSR_I_ADDR; \
25 /* First restore vpsr.ic, and then vpsr.i */
26 #define XEN_RESTORE_PSR_IC \
31 GLOBAL_ENTRY(xen_get_ivr)
32 movl r8=running_on_xen;;
36 (p7) br.ret.sptk.many rp
48 GLOBAL_ENTRY(xen_get_tpr)
49 movl r8=running_on_xen;;
53 (p7) br.ret.sptk.many rp
65 GLOBAL_ENTRY(xen_set_tpr)
66 movl r8=running_on_xen;;
70 (p7) br.ret.sptk.many rp
85 movl r8=running_on_xen;;
89 (p7) br.ret.sptk.many rp
103 GLOBAL_ENTRY(xen_thash)
104 movl r8=running_on_xen;;
108 (p7) br.ret.sptk.many rp
122 GLOBAL_ENTRY(xen_set_itm)
123 movl r8=running_on_xen;;
126 (p7) mov cr.itm=r32;;
127 (p7) br.ret.sptk.many rp
141 GLOBAL_ENTRY(xen_ptcga)
142 movl r8=running_on_xen;;
145 (p7) ptc.ga r32,r33;;
146 (p7) br.ret.sptk.many rp
161 GLOBAL_ENTRY(xen_get_rr)
162 movl r8=running_on_xen;;
165 (p7) mov r8=rr[r32];;
166 (p7) br.ret.sptk.many rp
180 GLOBAL_ENTRY(xen_set_rr)
181 movl r8=running_on_xen;;
184 (p7) mov rr[r32]=r33;;
185 (p7) br.ret.sptk.many rp
200 GLOBAL_ENTRY(xen_set_kr)
201 movl r8=running_on_xen;;
204 (p7) br.cond.spnt.few 1f;
209 (p7) br.ret.sptk.many rp;;
213 (p7) br.ret.sptk.many rp;;
217 (p7) br.ret.sptk.many rp;;
221 (p7) br.ret.sptk.many rp;;
225 (p7) br.ret.sptk.many rp;;
229 (p7) br.ret.sptk.many rp;;
233 (p7) br.ret.sptk.many rp;;
237 (p7) br.ret.sptk.many rp;;
252 movl r8=running_on_xen;;
256 (p7) br.ret.sptk.many rp
269 GLOBAL_ENTRY(xen_get_cpuid)
270 movl r8=running_on_xen;;
273 (p7) mov r8=cpuid[r32];;
274 (p7) br.ret.sptk.many rp
287 GLOBAL_ENTRY(xen_get_pmd)
288 movl r8=running_on_xen;;
291 (p7) mov r8=pmd[r32];;
292 (p7) br.ret.sptk.many rp
305 #ifdef CONFIG_IA32_SUPPORT
306 GLOBAL_ENTRY(xen_get_eflag)
307 movl r8=running_on_xen;;
311 (p7) br.ret.sptk.many rp
324 // some bits aren't set if pl!=0, see SDM vol1 3.1.8
325 GLOBAL_ENTRY(xen_set_eflag)
326 movl r8=running_on_xen;;
330 (p7) br.ret.sptk.many rp
344 GLOBAL_ENTRY(xen_send_ipi)
354 #ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
355 // Those are vdso specialized.
356 // In fsys mode, call, ret can't be used.
357 GLOBAL_ENTRY(xen_rsm_be_i)
364 brl.cond.sptk .vdso_rsm_be_i_ret
368 GLOBAL_ENTRY(xen_get_psr)
375 or r29=r8,r25 // vpsr.ic was cleared for hyperprivop
377 brl.cond.sptk .vdso_get_psr_ret
381 // see xen_ssm_i() in privop.h
382 // r22 = &vcpu->evtchn_mask
384 // r24 = &vcpu->pending_interruption
389 #define XEN_SET_PSR_I \
394 cmp.ne.unc p14,p0=r0,r31; \
396 (p14) cmp.ne.unc p11,p0=r0,r25; \
398 (p11) st4 [r22]=r20; \
399 (p11) st4 [r23]=r0; \
400 (p11) XEN_HYPER_SSM_I;
402 GLOBAL_ENTRY(xen_ssm_i_0)
404 brl.cond.sptk .vdso_ssm_i_0_ret
408 GLOBAL_ENTRY(xen_ssm_i_1)
410 brl.cond.sptk .vdso_ssm_i_1_ret