[IA64] Enable fast hyperprivop for ssm.i and rfi
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Thu, 4 Jan 2007 23:14:22 +0000 (16:14 -0700)
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Thu, 4 Jan 2007 23:14:22 +0000 (16:14 -0700)
Signed-off-by: Anthony Xu <anthony.xu@intel.com>
xen/arch/ia64/asm-offsets.c
xen/arch/ia64/xen/hyperprivop.S

index e0f502f662162ee074aca21ef4ec4feeee2cad73..efd68306d0c84efdbdb2afa9a064d40c9829e6a4 100644 (file)
@@ -60,6 +60,7 @@ void foo(void)
        DEFINE(IA64_VCPU_META_SAVED_RR0_OFFSET, offsetof (struct vcpu, arch.metaphysical_saved_rr0));
        DEFINE(IA64_VCPU_BREAKIMM_OFFSET, offsetof (struct vcpu, arch.breakimm));
        DEFINE(IA64_VCPU_IVA_OFFSET, offsetof (struct vcpu, arch.iva));
+       DEFINE(IA64_VCPU_EVENT_CALLBACK_IP_OFFSET, offsetof (struct vcpu, arch.event_callback_ip));
        DEFINE(IA64_VCPU_IRR0_OFFSET, offsetof (struct vcpu, arch.irr[0]));
        DEFINE(IA64_VCPU_IRR3_OFFSET, offsetof (struct vcpu, arch.irr[3]));
        DEFINE(IA64_VCPU_INSVC3_OFFSET, offsetof (struct vcpu, arch.insvc[3]));
index 763f66b07238463392742e9516980fb7752d3da4..9d6d4187842cbbc54d4ad9682167e31c56dc3ec0 100644 (file)
 # define FAST_BREAK
 # undef FAST_ACCESS_REFLECT    //XXX TODO fast_access_reflect
                                //    doesn't support dom0 vp yet.
-//# define FAST_RFI
+# define FAST_RFI
 // TODO: Since we use callback to deliver interrupt, 
 //       FAST_SSM_I needs to be rewritten.
-//# define FAST_SSM_I
+# define FAST_SSM_I
 # define FAST_PTC_GA
 # undef RFI_TO_INTERRUPT // not working yet
 #endif
@@ -282,13 +282,11 @@ ENTRY(hyper_ssm_i)
        adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        st8 [r21]=r20 ;;
        // leave cr.ifs alone for later rfi
-       // set iip to go to domain IVA break instruction vector
+       // set iip to go to event callback handler
        movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
        ld8 r22=[r22];;
-       adds r22=IA64_VCPU_IVA_OFFSET,r22;;
-       ld8 r23=[r22];;
-       movl r24=0x3000;;
-       add r24=r24,r23;;
+       adds r22=IA64_VCPU_EVENT_CALLBACK_IP_OFFSET,r22;;
+       ld8 r24=[r22];;
        mov cr.iip=r24;;
        // OK, now all set to go except for switch to virtual bank0
        mov r30=r2
@@ -1027,8 +1025,12 @@ ENTRY(hyper_rfi)
        adds r20=XSI_IPSR_OFS-XSI_PSR_IC_OFS,r18 ;;
        ld8 r21=[r20];;         // r21 = vcr.ipsr
        extr.u r22=r21,IA64_PSR_I_BIT,1 ;;
-       mov r30=r22     
+       mov r30=r22;;
        // r30 determines whether we might deliver an immediate extint
+#ifndef RFI_TO_INTERRUPT // see beginning of file
+       cmp.ne p6,p0=r30,r0
+(p6)   br.cond.spnt.few dispatch_break_fault ;;
+#endif
 1:
        adds r20=XSI_IPSR_OFS-XSI_PSR_IC_OFS,r18 ;;
        ld8 r21=[r20];;         // r21 = vcr.ipsr
@@ -1063,10 +1065,6 @@ ENTRY(hyper_rfi)
        cmp.ltu p0,p7=r22,r23 ;;        // if !(iip<low) &&
 (p7)   cmp.geu p0,p7=r22,r24 ;;        //    !(iip>=high)
 (p7)   br.spnt.few dispatch_break_fault ;;
-#ifndef RFI_TO_INTERRUPT // see beginning of file
-       cmp.ne p6,p0=r30,r0
-(p6)   br.cond.spnt.few dispatch_break_fault ;;
-#endif
 
 1:     // OK now, let's do an rfi.
 #ifdef FAST_HYPERPRIVOP_CNT