[IA64] Simplify lazy cover algorithm
authorawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Fri, 12 Jan 2007 19:11:11 +0000 (12:11 -0700)
committerawilliam@xenbuild2.aw <awilliam@xenbuild2.aw>
Fri, 12 Jan 2007 19:11:11 +0000 (12:11 -0700)
Signed-off-by: Anthony Xu <anthony.xu@intel.com>
linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c
linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h
linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h
xen/arch/ia64/asm-xsi-offsets.c
xen/arch/ia64/xen/faults.c
xen/arch/ia64/xen/hyperprivop.S
xen/arch/ia64/xen/vcpu.c
xen/include/public/arch-ia64.h

index 7bee9111c67a4351cd399af2b13ce8e09374acf2..604ad3b8f287770895879f9ec55be270c1ba9a96 100644 (file)
@@ -280,7 +280,6 @@ void foo(void)
        DEFINE_MAPPED_REG_OFS(XSI_IHA_OFS, iha);
        DEFINE_MAPPED_REG_OFS(XSI_ITIR_OFS, itir);
        DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled);
-       DEFINE_MAPPED_REG_OFS(XSI_INCOMPL_REGFR_OFS, incomplete_regframe);
        DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum);
        DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]);
        DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]);
index b3902a6a807cfc9ff201b76c243d50a40bd43aff..75ec49f886e993fe74102dca85c068372ada5064 100644 (file)
 .mem.offset 8,0; st8.spill [r17]=r11,24;                                                       \
         ;;                                                                                     \
        /* xen special handling for possibly lazy cover */                                      \
-       movl r8=XSI_INCOMPL_REGFR;                                                              \
-       ;;                                                                                      \
-       ld4 r30=[r8];                                                                           \
-       ;;                                                                                      \
-       /* set XSI_INCOMPL_REGFR 0 */                                                           \
-       st4 [r8]=r0;                                                                            \
-       cmp.eq  p6,p7=r30,r0;                                                                   \
-       ;; /* not sure if this stop bit is necessary */                                         \
-(p6)   adds r8=XSI_PRECOVER_IFS-XSI_INCOMPL_REGFR,r8;                                          \
-(p7)   adds r8=XSI_IFS-XSI_INCOMPL_REGFR,r8;                                                   \
+       movl r8=XSI_PRECOVER_IFS;                                                               \
        ;;                                                                                      \
        ld8 r30=[r8];                                                                           \
        ;;                                                                                      \
index a0c2828b63e2b89e0d62cab1160fd68fd9b9f7c9..4270894a1e56cbf99951bfdd49ab3256eacb9a14 100644 (file)
@@ -49,7 +49,6 @@
 
 #define XSI_IFS                        (XSI_BASE + XSI_IFS_OFS)
 #define XSI_PRECOVER_IFS       (XSI_BASE + XSI_PRECOVER_IFS_OFS)
-#define XSI_INCOMPL_REGFR      (XSI_BASE + XSI_INCOMPL_REGFR_OFS)
 #define XSI_IFA                        (XSI_BASE + XSI_IFA_OFS)
 #define XSI_ISR                        (XSI_BASE + XSI_ISR_OFS)
 #define XSI_IIM                        (XSI_BASE + XSI_IIM_OFS)
index c4bfdf2a3c0757d5bb9d3555aedb6b2a857288b2..f9d22358f2ebefd61df8b5ba60739ddf4361f3f1 100755 (executable)
@@ -62,7 +62,6 @@ void foo(void)
        DEFINE_MAPPED_REG_OFS(XSI_ITV_OFS, itv);
        DEFINE_MAPPED_REG_OFS(XSI_PTA_OFS, pta);
        DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled);
-       DEFINE_MAPPED_REG_OFS(XSI_INCOMPL_REGFR_OFS, incomplete_regframe);
        DEFINE_MAPPED_REG_OFS(XSI_METAPHYS_OFS, metaphysical_mode);
        DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum);
        DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]);
index 7cf641b6fe5e33deac34361ab46c965eb43394c3..53a2545b22b734525c44575e1f8c301094cadd95 100644 (file)
@@ -88,7 +88,6 @@ void reflect_interruption(unsigned long isr, struct pt_regs *regs,
        PSCB(v, isr) = isr;
        PSCB(v, iip) = regs->cr_iip;
        PSCB(v, ifs) = 0;
-       PSCB(v, incomplete_regframe) = 0;
 
        regs->cr_iip = ((unsigned long)PSCBX(v, iva) + vector) & ~0xffUL;
        regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET;
@@ -155,7 +154,6 @@ void reflect_event(void)
        PSCB(v, isr) = isr;
        PSCB(v, iip) = regs->cr_iip;
        PSCB(v, ifs) = 0;
-       PSCB(v, incomplete_regframe) = 0;
 
        regs->cr_iip = v->arch.event_callback_ip;
        regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET;
@@ -185,7 +183,6 @@ static int handle_lazy_cover(struct vcpu *v, struct pt_regs *regs)
 {
        if (!PSCB(v, interrupt_collection_enabled)) {
                PSCB(v, ifs) = regs->cr_ifs;
-               PSCB(v, incomplete_regframe) = 1;
                regs->cr_ifs = 0;
                perfc_incrc(lazy_cover);
                return 1;       // retry same instruction with cr.ifs off
index 9d6d4187842cbbc54d4ad9682167e31c56dc3ec0..ca86b0432a6f6146c1a892ad3c123834edbf58de 100644 (file)
@@ -192,7 +192,6 @@ END(fast_hyperprivop)
 //     and isr.ri to cr.isr.ri (all other bits zero)
 //  - cover and set shared_mem precover_ifs to cr.ifs
 //             ^^^ MISSED THIS FOR fast_break??
-//  - set shared_mem ifs and incomplete_regframe to 0
 //  - set shared_mem interrupt_delivery_enabled to 0
 //  - set shared_mem interrupt_collection_enabled to 0
 //  - set r31 to SHAREDINFO_ADDR
@@ -272,11 +271,9 @@ ENTRY(hyper_ssm_i)
        st1 [r22]=r20
        st4 [r18]=r0
        // cover and set shared_mem precover_ifs to cr.ifs
-       // set shared_mem ifs and incomplete_regframe to 0
+       // set shared_mem ifs to 0
        cover ;;
        mov r20=cr.ifs;;
-       adds r21=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r21]=r0 ;;
        adds r21=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        st8 [r21]=r0 ;;
        adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
@@ -459,11 +456,9 @@ GLOBAL_ENTRY(fast_tick_reflect)
        st1 [r22]=r20;;
        st4 [r18]=r0;;
        // cover and set shared_mem precover_ifs to cr.ifs
-       // set shared_mem ifs and incomplete_regframe to 0
+       // set shared_mem ifs to 0
        cover ;;
        mov r20=cr.ifs;;
-       adds r21=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r21]=r0 ;;
        adds r21=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        st8 [r21]=r0 ;;
        adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
@@ -645,11 +640,9 @@ ENTRY(fast_reflect)
        st1 [r24]=r22
        st4 [r18]=r0;;
        // cover and set shared_mem precover_ifs to cr.ifs
-       // set shared_mem ifs and incomplete_regframe to 0
+       // set shared_mem ifs to 0
        cover ;;
        mov r24=cr.ifs;;
-       adds r21=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r21]=r0 ;;
        adds r21=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        st8 [r21]=r0 ;;
        adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
@@ -1082,8 +1075,6 @@ ENTRY(hyper_rfi)
 just_do_rfi:
        // r18=&vpsr.i|vpsr.ic, r21==vpsr, r22=vcr.iip
        mov cr.iip=r22;;
-       adds r20=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r20]=r0 ;;
        adds r20=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        ld8 r20=[r20];;
        dep r20=0,r20,38,25;; // ensure ifs has no reserved bits set
@@ -1259,20 +1250,16 @@ ENTRY(rfi_with_interrupt)
        st1 [r22]=r20
        st4 [r18]=r0;;
        // cover and set shared_mem precover_ifs to cr.ifs
-       // set shared_mem ifs and incomplete_regframe to 0
+       // set shared_mem ifs to 0
 #if 0
        cover ;;
        mov r20=cr.ifs;;
-       adds r22=XSI_INCOMPL_REG_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r22]=r0 ;;
        adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        st8 [r22]=r0 ;;
        adds r22=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        st8 [r22]=r20 ;;
        // leave cr.ifs alone for later rfi
 #else
-       adds r22=XSI_INCOMPL_REG_OFS-XSI_PSR_IC_OFS,r18 ;;
-       st4 [r22]=r0 ;;
        adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;;
        ld8 r20=[r22];;
        st8 [r22]=r0 ;;
@@ -1334,13 +1321,9 @@ ENTRY(hyper_cover)
        mov r25=cr.iip;;
        // skip test for vpsr.ic.. it's a prerequisite for hyperprivops
        cover ;;
-       adds r20=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;;
-       mov r30=cr.ifs;;
-       adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18
-       ld4 r21=[r20] ;;
-       cmp.eq p6,p7=r21,r0 ;;
-(p6)   st8 [r22]=r30;;
-(p7)   st4 [r20]=r0;;
+       mov r30=cr.ifs
+       adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18;;
+       st8 [r22]=r30;;
        mov cr.ifs=r0;;
        // adjust return address to skip over break instruction
        extr.u r26=r24,41,2 ;;
index 0eceeb38ae533a1f48cae5c20fb06e06f4657f18..dff7259d43631b30ee8eea26fcb0aa3d81037ca7 100644 (file)
@@ -613,7 +613,6 @@ IA64FAULT vcpu_get_ifs(VCPU * vcpu, u64 * pval)
        //PSCB(vcpu,ifs) = PSCB(vcpu)->regs.cr_ifs;
        //*pval = PSCB(vcpu,regs).cr_ifs;
        *pval = PSCB(vcpu, ifs);
-       PSCB(vcpu, incomplete_regframe) = 0;
        return IA64_NO_FAULT;
 }
 
@@ -1362,7 +1361,6 @@ IA64FAULT vcpu_rfi(VCPU * vcpu)
                printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n");
                return IA64_ILLOP_FAULT;
        }
-       PSCB(vcpu, incomplete_regframe) = 0;    // is this necessary?
 
        ifs = PSCB(vcpu, ifs);
        if (ifs > 0x8000000000000000UL) {
@@ -1397,10 +1395,7 @@ IA64FAULT vcpu_cover(VCPU * vcpu)
        REGS *regs = vcpu_regs(vcpu);
 
        if (!PSCB(vcpu, interrupt_collection_enabled)) {
-               if (!PSCB(vcpu, incomplete_regframe))
-                       PSCB(vcpu, ifs) = regs->cr_ifs;
-               else
-                       PSCB(vcpu, incomplete_regframe) = 0;
+               PSCB(vcpu, ifs) = regs->cr_ifs;
        }
        regs->cr_ifs = 0;
        return IA64_NO_FAULT;
index 7425cafd94da7f4365678c1b7755f47884a49541..ac8292d2a0ddf734bc49bdf6650f4117e3fc0d84 100644 (file)
@@ -287,10 +287,9 @@ struct mapped_regs {
              */
             unsigned char *interrupt_mask_addr;
             int pending_interruption;
-            int incomplete_regframe; // see SDM vol2 6.8
             unsigned char vpsr_pp;
-            unsigned char reserved5_2[7];
-            unsigned long reserved5_1[3];
+            unsigned char reserved5_2[3];
+            unsigned long reserved5_1[4];
             int metaphysical_mode; // 1 = use metaphys mapping, 0 = use virtual
             int banknum; // 0 or 1, which virtual register bank is active
             unsigned long rrs[8]; // region registers