|  | /* | 
|  | * arch/ia64/xen/ivt.S | 
|  | * | 
|  | * Copyright (C) 2005 Hewlett-Packard Co | 
|  | *	Dan Magenheimer <dan.magenheimer@hp.com> | 
|  | * | 
|  | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | 
|  | *                    VA Linux Systems Japan K.K. | 
|  | *                    pv_ops. | 
|  | */ | 
|  |  | 
|  | #include <asm/asmmacro.h> | 
|  | #include <asm/kregs.h> | 
|  | #include <asm/pgtable.h> | 
|  |  | 
|  | #include "../kernel/minstate.h" | 
|  |  | 
|  | .section .text,"ax" | 
|  | GLOBAL_ENTRY(xen_event_callback) | 
|  | mov r31=pr		// prepare to save predicates | 
|  | ;; | 
|  | SAVE_MIN_WITH_COVER	// uses r31; defines r2 and r3 | 
|  | ;; | 
|  | movl r3=XSI_PSR_IC | 
|  | mov r14=1 | 
|  | ;; | 
|  | st4 [r3]=r14 | 
|  | ;; | 
|  | adds r3=8,r2		// set up second base pointer for SAVE_REST | 
|  | srlz.i			// ensure everybody knows psr.ic is back on | 
|  | ;; | 
|  | SAVE_REST | 
|  | ;; | 
|  | 1: | 
|  | alloc r14=ar.pfs,0,0,1,0 // must be first in an insn group | 
|  | add out0=16,sp		// pass pointer to pt_regs as first arg | 
|  | ;; | 
|  | br.call.sptk.many b0=xen_evtchn_do_upcall | 
|  | ;; | 
|  | movl r20=XSI_PSR_I_ADDR | 
|  | ;; | 
|  | ld8 r20=[r20] | 
|  | ;; | 
|  | adds r20=-1,r20		// vcpu_info->evtchn_upcall_pending | 
|  | ;; | 
|  | ld1 r20=[r20] | 
|  | ;; | 
|  | cmp.ne p6,p0=r20,r0	// if there are pending events, | 
|  | (p6) br.spnt.few 1b	// call evtchn_do_upcall again. | 
|  | br.sptk.many xen_leave_kernel	// we know ia64_leave_kernel is | 
|  | // paravirtualized as xen_leave_kernel | 
|  | END(xen_event_callback) |