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