ia64/pv_ops/xen: paravirtualize ivt.S for xen.
[linux-2.6.git] / arch / ia64 / xen / xenivt.S
1 /*
2  * arch/ia64/xen/ivt.S
3  *
4  * Copyright (C) 2005 Hewlett-Packard Co
5  *      Dan Magenheimer <dan.magenheimer@hp.com>
6  *
7  * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
8  *                    VA Linux Systems Japan K.K.
9  *                    pv_ops.
10  */
11
12 #include <asm/asmmacro.h>
13 #include <asm/kregs.h>
14 #include <asm/pgtable.h>
15
16 #include "../kernel/minstate.h"
17
18         .section .text,"ax"
19 GLOBAL_ENTRY(xen_event_callback)
20         mov r31=pr              // prepare to save predicates
21         ;;
22         SAVE_MIN_WITH_COVER     // uses r31; defines r2 and r3
23         ;;
24         movl r3=XSI_PSR_IC
25         mov r14=1
26         ;;
27         st4 [r3]=r14
28         ;;
29         adds r3=8,r2            // set up second base pointer for SAVE_REST
30         srlz.i                  // ensure everybody knows psr.ic is back on
31         ;;
32         SAVE_REST
33         ;;
34 1:
35         alloc r14=ar.pfs,0,0,1,0 // must be first in an insn group
36         add out0=16,sp          // pass pointer to pt_regs as first arg
37         ;;
38         br.call.sptk.many b0=xen_evtchn_do_upcall
39         ;;
40         movl r20=XSI_PSR_I_ADDR
41         ;;
42         ld8 r20=[r20]
43         ;;
44         adds r20=-1,r20         // vcpu_info->evtchn_upcall_pending
45         ;;
46         ld1 r20=[r20]
47         ;;
48         cmp.ne p6,p0=r20,r0     // if there are pending events,
49         (p6) br.spnt.few 1b     // call evtchn_do_upcall again.
50         br.sptk.many xen_leave_kernel   // we know ia64_leave_kernel is
51                                         // paravirtualized as xen_leave_kernel
52 END(xen_event_callback)