Isaku Yamahata | 5142ec4 | 2008-10-17 11:18:03 +0900 | [diff] [blame] | 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) |