Commit | Line | Data |
---|---|---|
5142ec46 IY |
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) |