| 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) |