WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] Merge vcpu phase 2

# HG changeset patch
# User djm@xxxxxxxxxxxxxxx
# Node ID 7f9acc83ffcd499ea66894aa9deed65211ff7063
# Parent  8d133d172bfdd1321a852ee70f316289f676ed47
Merge vcpu phase 2
Signed-off-by Anthony Xu <Anthony.xu@xxxxxxxxx>
1. Add r4,r5,r6,r7,eml_unat,rfi_pfs six members at the end of pt_regs, 
   thus VMM for non-VT domain doesn't need to save/restore SWITCH_STACK
   just in case VMM may need modify guest r4,r5,r6,r7 value, eml_unat is saved
   in case VMM may need modify guest unat, rfi_pfs is used to emulate guest rfi
   instruction for VT domain, and is used as dummy member for alignment of F6,
   F7 etc. in pt_regs for non-VT domain. And add code to save/restore r4,r5,r6,
   r7,eml_unat in minstate.h and entry.s for non-VT domain. and remove code to
   save/restore SWITCH_STACK in ivt.S for non-VT domain.
2. Originally guest banked registers of VT domain are saved directly in VPD. Now
   Guest banked registers of VT domain are saved to pt_regs at the entry of VMM,
   just for consistence with non-VT domain, vmx_vcpu_bsw0 and vmx_vcpu_bsw1 are 
   rewriten for accomodating this change.
3. After above changes, all guest registers and nat bits are saved at same place
   both for VTI domain and for non-VTI domain, so vcpu_get/set_gr and 
rse_get/set_gr
   are merged, and all these functions can handle guest nats.
4. Merged vcpu_bsw0 and vcpu_bsw1, Now VMM used vgr[16],vbgr[16],vnat,vbnat in 
mapped_regs_t
   struct (is also vpd) to emuate guest banking switch operation.
5. Removed some CONFIG_VTIs and cleaned up some unused structure members and 
codes.

Note: Credit accidentally omitted from merge vcpu phase 1, included here:

This patch is based on ver 6723. And definitely I can boot dom0 with this patch.
Following things are done in this patch.
1. Merge structure pt_reg.
2. Though vcpu_info structure has been merged, non-vt domain used pointer
   vcpu->vcpu_info->arch.privregs, and vt domain used pointer
   vcpu->arch.arch_vmx.vpd, the value of these two pointers are different,
   that means vt and non-vt domain still use different privileged registers
   pages, in this case, we can't merge vcpu.c, so I merged these two pointer,
   and put it at vcpu->arch.privregs. vcpu->vcpu_info->arch.privregs and
   vcpu->arch.arch_vmx.vpd  will not exist. Why put it at vcpu->arch.privregs?
   1. There will be one less pointer unreferenced when accessing this
      privileged registers page.
   2. vcpu->vcpu_info can be accessed by guest, but guest can't access
      privileged registers page through this address, guest can access
      this privileged page only through another special mapping. So there
      is no need to expose this pointer to guest by putting it in
      vcpu->vcpu_info structure. All accesses to this page is through
      VCPU(vcpu,y) macro,
3. Merged following functions.
      Vcpu_set/get_(interruption control registers from cr16 to cr25),
        corresponding functions vmx_vcpu_set/get_*** will not exist.
      Vcpu->arch.arch_vmx.in_service[4] will not exist, we will all use
      vcpu->arch.insvc[4]
4. Cleaned up some unused structure members and codes.

Signed-off-by Anthony Xu <Anthony.xu@xxxxxxxxx>

diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/asm-offsets.c
--- a/xen/arch/ia64/asm-offsets.c       Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/asm-offsets.c       Mon Sep 19 17:08:20 2005
@@ -138,17 +138,6 @@
        DEFINE(IA64_PT_REGS_R14_OFFSET, offsetof (struct pt_regs, r14));
        DEFINE(IA64_PT_REGS_R2_OFFSET, offsetof (struct pt_regs, r2));
        DEFINE(IA64_PT_REGS_R3_OFFSET, offsetof (struct pt_regs, r3));
-#ifdef CONFIG_VTI
-       DEFINE(IA64_PT_REGS_R4_OFFSET, offsetof (struct pt_regs, r4));
-       DEFINE(IA64_PT_REGS_R5_OFFSET, offsetof (struct pt_regs, r5));
-       DEFINE(IA64_PT_REGS_R6_OFFSET, offsetof (struct pt_regs, r6));
-       DEFINE(IA64_PT_REGS_R7_OFFSET, offsetof (struct pt_regs, r7));
-       DEFINE(IA64_PT_REGS_CR_IIPA_OFFSET, offsetof (struct pt_regs, cr_iipa));
-       DEFINE(IA64_PT_REGS_CR_ISR_OFFSET, offsetof (struct pt_regs, cr_isr));
-       DEFINE(IA64_PT_REGS_EML_UNAT_OFFSET, offsetof (struct pt_regs, 
eml_unat));
-       DEFINE(IA64_PT_REGS_RFI_PFS_OFFSET, offsetof (struct pt_regs, rfi_pfs));
-       DEFINE(SWITCH_MPTA_OFFSET,offsetof(struct vcpu ,arch.arch_vmx.mpta));
-#endif  //CONFIG_VTI
        DEFINE(IA64_PT_REGS_R16_OFFSET, offsetof (struct pt_regs, r16));
        DEFINE(IA64_PT_REGS_R17_OFFSET, offsetof (struct pt_regs, r17));
        DEFINE(IA64_PT_REGS_R18_OFFSET, offsetof (struct pt_regs, r18));
@@ -172,6 +161,19 @@
        DEFINE(IA64_PT_REGS_F9_OFFSET, offsetof (struct pt_regs, f9));
        DEFINE(IA64_PT_REGS_F10_OFFSET, offsetof (struct pt_regs, f10));
        DEFINE(IA64_PT_REGS_F11_OFFSET, offsetof (struct pt_regs, f11));
+       DEFINE(IA64_PT_REGS_R4_OFFSET, offsetof (struct pt_regs, r4));
+       DEFINE(IA64_PT_REGS_R5_OFFSET, offsetof (struct pt_regs, r5));
+       DEFINE(IA64_PT_REGS_R6_OFFSET, offsetof (struct pt_regs, r6));
+       DEFINE(IA64_PT_REGS_R7_OFFSET, offsetof (struct pt_regs, r7));
+       DEFINE(IA64_PT_REGS_EML_UNAT_OFFSET, offsetof (struct pt_regs, 
eml_unat));
+       DEFINE(IA64_PT_REGS_RFI_PFS_OFFSET, offsetof (struct pt_regs, rfi_pfs));
+    DEFINE(IA64_VCPU_IIPA_OFFSET, offsetof (struct vcpu, 
arch.arch_vmx.cr_iipa));
+    DEFINE(IA64_VCPU_ISR_OFFSET, offsetof (struct vcpu, arch.arch_vmx.cr_isr));
+    DEFINE(IA64_VCPU_CAUSE_OFFSET, offsetof (struct vcpu, 
arch.arch_vmx.cause));
+    DEFINE(IA64_VCPU_OPCODE_OFFSET, offsetof (struct vcpu, 
arch.arch_vmx.opcode));
+       DEFINE(SWITCH_MPTA_OFFSET,offsetof(struct vcpu ,arch.arch_vmx.mpta));
+    DEFINE(IA64_PT_REGS_R16_SLOT, (((offsetof(struct pt_regs, 
r16)-sizeof(struct pt_regs))>>3)&0x3f));
+       DEFINE(IA64_VCPU_FLAGS_OFFSET,offsetof(struct vcpu 
,arch.arch_vmx.flags));
 
        BLANK();
 
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/linux-xen/entry.S
--- a/xen/arch/ia64/linux-xen/entry.S   Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/linux-xen/entry.S   Mon Sep 19 17:08:20 2005
@@ -633,10 +633,19 @@
        // new domains are cloned but not exec'ed so switch to user mode here
        cmp.ne pKStk,pUStk=r0,r0
 #ifdef CONFIG_VTI
-       br.cond.spnt ia64_leave_hypervisor
+    br.cond.spnt ia64_leave_hypervisor
 #else // CONFIG_VTI
-       br.cond.spnt ia64_leave_kernel
+    br.cond.spnt ia64_leave_kernel
 #endif // CONFIG_VTI
+
+//    adds r16 = IA64_VCPU_FLAGS_OFFSET, r13
+//    ;;
+//    ld8 r16 = [r16]
+//    ;;
+//    cmp.ne p6,p7 = r16, r0
+//     (p6) br.cond.spnt ia64_leave_hypervisor
+//     (p7) br.cond.spnt ia64_leave_kernel
+//    ;;
 #else
 .ret8:
        adds r2=TI_FLAGS+IA64_TASK_SIZE,r13
@@ -875,10 +884,16 @@
 #ifdef XEN
        alloc loc0=ar.pfs,0,1,1,0
        adds out0=16,r12
-       ;;
+    adds r7 = PT(EML_UNAT)+16,r12
+       ;;
+    ld8 r7 = [r7]
 (p6)   br.call.sptk.many b0=deliver_pending_interrupt
+    ;;
        mov ar.pfs=loc0
+    mov ar.unat=r7  /* load eml_unat  */
        mov r31=r0
+
+
 #else
        adds r17=TI_FLAGS+IA64_TASK_SIZE,r13
        ;;
@@ -957,6 +972,23 @@
        ldf.fill f6=[r2],PT(F7)-PT(F6)
        ;;
        ldf.fill f7=[r2],PT(F11)-PT(F7)
+#ifdef XEN
+       ldf.fill f8=[r3],PT(R5)-PT(F8)
+       ;;
+       ldf.fill f11=[r2],PT(R4)-PT(F11)
+       mov ar.ccv=r15
+       ;;
+       ld8.fill r4=[r2],16
+       ld8.fill r5=[r3],16
+       ;;
+       ld8.fill r6=[r2]
+       ld8.fill r7=[r3]
+       ;;
+       srlz.d  // ensure that inter. collection is off (VHPT is don't care, 
since text is pinned)
+    ;;
+       bsw.0                   // switch back to bank 0 (no stop bit required 
beforehand...)
+       ;;
+#else
        ldf.fill f8=[r3],32
        ;;
        srlz.d  // ensure that inter. collection is off (VHPT is don't care, 
since text is pinned)
@@ -965,6 +997,7 @@
        ldf.fill f11=[r2]
        bsw.0                   // switch back to bank 0 (no stop bit required 
beforehand...)
        ;;
+#endif
 #ifdef XEN
 (pUStk) movl r18=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;;
 (pUStk) ld8 r18=[r18]
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/linux-xen/entry.h
--- a/xen/arch/ia64/linux-xen/entry.h   Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/linux-xen/entry.h   Mon Sep 19 17:08:20 2005
@@ -23,19 +23,8 @@
 
 #define PT(f)          (IA64_PT_REGS_##f##_OFFSET)
 #define SW(f)          (IA64_SWITCH_STACK_##f##_OFFSET)
-
-#ifdef XEN
-#ifdef CONFIG_VTI
-#define PRED_EMUL              2 /* Need to save r4-r7 for inst emulation */
-#define PRED_NON_EMUL          3 /* No need to save r4-r7 for normal path */
-#define PRED_BN0               6 /* Guest is in bank 0 */
-#define PRED_BN1               7 /* Guest is in bank 1 */
-# define pEml          PASTE(p,PRED_EMUL)
-# define pNonEml       PASTE(p,PRED_NON_EMUL)
-# define pBN0          PASTE(p,PRED_BN0)
-# define pBN1          PASTE(p,PRED_BN1)
+#ifdef  XEN
 #define VPD(f)      (VPD_##f##_START_OFFSET)
-#endif // CONFIG_VTI
 #endif
 
 #define PT_REGS_SAVES(off)                     \
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/linux-xen/minstate.h
--- a/xen/arch/ia64/linux-xen/minstate.h        Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/linux-xen/minstate.h        Mon Sep 19 17:08:20 2005
@@ -241,16 +241,25 @@
        stf.spill [r2]=f8,32;                   \
        stf.spill [r3]=f9,32;                   \
        ;;                                      \
-       stf.spill [r2]=f10;                     \
-       stf.spill [r3]=f11;                     \
-       adds r25=PT(B7)-PT(F11),r3;             \
-       ;;                                      \
+       stf.spill [r2]=f10,32;                  \
+       stf.spill [r3]=f11,24;                  \
+       ;;                                      \
+.mem.offset 0,0; st8.spill [r2]=r4,16;         \
+.mem.offset 8,0; st8.spill [r3]=r5,16;         \
+       ;;                                      \
+.mem.offset 0,0; st8.spill [r2]=r6,16;         \
+.mem.offset 8,0; st8.spill [r3]=r7;            \
+    adds r25=PT(B7)-PT(R7),r3;     \
+    ;;                  \
        st8 [r24]=r18,16;       /* b6 */        \
        st8 [r25]=r19,16;       /* b7 */        \
        ;;                                      \
        st8 [r24]=r9;           /* ar.csd */    \
+    mov r26=ar.unat;            \
+       ;;      \
        st8 [r25]=r10;          /* ar.ssd */    \
-       ;;
+    st8 [r2]=r26;       /* eml_unat */ \
+    ;;
 
 #define SAVE_MIN_WITH_COVER    DO_SAVE_MIN(cover, mov r30=cr.ifs,)
 #define SAVE_MIN_WITH_COVER_R19        DO_SAVE_MIN(cover, mov r30=cr.ifs, mov 
r15=r19)
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/linux-xen/unaligned.c
--- a/xen/arch/ia64/linux-xen/unaligned.c       Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/linux-xen/unaligned.c       Mon Sep 19 17:08:20 2005
@@ -201,7 +201,8 @@
 
        RPT(r1), RPT(r2), RPT(r3),
 
-#if defined(XEN) && defined(CONFIG_VTI)
+//#if defined(XEN) && defined(CONFIG_VTI)
+#if defined(XEN)
        RPT(r4), RPT(r5), RPT(r6), RPT(r7),
 #else   //CONFIG_VTI
        RSW(r4), RSW(r5), RSW(r6), RSW(r7),
@@ -295,7 +296,8 @@
        return reg;
 }
 
-#if defined(XEN) && defined(CONFIG_VTI)
+//#if defined(XEN) && defined(CONFIG_VTI)
+#if defined(XEN)
 void
 set_rse_reg (struct pt_regs *regs, unsigned long r1, unsigned long val, 
unsigned long nat)
 {
@@ -402,12 +404,14 @@
         bspstore = ia64_get_bspstore();
     }
     *val=*addr;
-    if(bspstore < rnat_addr){
-        *nat=!!(ia64_get_rnat()&nat_mask);
-    }else{
-        *nat = !!((*rnat_addr)&nat_mask);
+    if(nat){
+        if(bspstore < rnat_addr){
+            *nat=!!(ia64_get_rnat()&nat_mask);
+        }else{
+            *nat = !!((*rnat_addr)&nat_mask);
+        }
+        ia64_set_rsc(old_rsc);
     }
-    ia64_set_rsc(old_rsc);
 }
 
 #else // CONFIG_VTI
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c  Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/mmio.c  Mon Sep 19 17:08:20 2005
@@ -419,10 +419,10 @@
         size=(inst.M1.x6&0x3);
         if((inst.M1.x6>>2)>0xb){      // write
             dir=IOREQ_WRITE;     //write
-            vmx_vcpu_get_gr(vcpu,inst.M4.r2,&data);
+            vcpu_get_gr_nat(vcpu,inst.M4.r2,&data);
         }else if((inst.M1.x6>>2)<0xb){   //  read
             dir=IOREQ_READ;
-            vmx_vcpu_get_gr(vcpu,inst.M1.r1,&value);
+            vcpu_get_gr_nat(vcpu,inst.M1.r1,&value);
         }
     }
     // Integer Load + Reg update
@@ -430,11 +430,11 @@
         inst_type = SL_INTEGER;
         dir = IOREQ_READ;     //write
         size = (inst.M2.x6&0x3);
-        vmx_vcpu_get_gr(vcpu,inst.M2.r1,&value);
-        vmx_vcpu_get_gr(vcpu,inst.M2.r3,&temp);
-        vmx_vcpu_get_gr(vcpu,inst.M2.r2,&post_update);
+        vcpu_get_gr_nat(vcpu,inst.M2.r1,&value);
+        vcpu_get_gr_nat(vcpu,inst.M2.r3,&temp);
+        vcpu_get_gr_nat(vcpu,inst.M2.r2,&post_update);
         temp += post_update;
-        vmx_vcpu_set_gr(vcpu,inst.M2.r3,temp,0);
+        vcpu_set_gr(vcpu,inst.M2.r3,temp,0);
     }
     // Integer Load/Store + Imm update
     else if(inst.M3.major==5){
@@ -442,25 +442,25 @@
         size=(inst.M3.x6&0x3);
         if((inst.M5.x6>>2)>0xb){      // write
             dir=IOREQ_WRITE;     //write
-            vmx_vcpu_get_gr(vcpu,inst.M5.r2,&data);
-            vmx_vcpu_get_gr(vcpu,inst.M5.r3,&temp);
+            vcpu_get_gr_nat(vcpu,inst.M5.r2,&data);
+            vcpu_get_gr_nat(vcpu,inst.M5.r3,&temp);
             post_update = (inst.M5.i<<7)+inst.M5.imm7;
             if(inst.M5.s)
                 temp -= post_update;
             else
                 temp += post_update;
-            vmx_vcpu_set_gr(vcpu,inst.M5.r3,temp,0);
+            vcpu_set_gr(vcpu,inst.M5.r3,temp,0);
 
         }else if((inst.M3.x6>>2)<0xb){   //  read
             dir=IOREQ_READ;
-            vmx_vcpu_get_gr(vcpu,inst.M3.r1,&value);
-            vmx_vcpu_get_gr(vcpu,inst.M3.r3,&temp);
+            vcpu_get_gr_nat(vcpu,inst.M3.r1,&value);
+            vcpu_get_gr_nat(vcpu,inst.M3.r3,&temp);
             post_update = (inst.M3.i<<7)+inst.M3.imm7;
             if(inst.M3.s)
                 temp -= post_update;
             else
                 temp += post_update;
-            vmx_vcpu_set_gr(vcpu,inst.M3.r3,temp,0);
+            vcpu_set_gr(vcpu,inst.M3.r3,temp,0);
 
         }
     }
@@ -488,7 +488,7 @@
             data = (value & 0xffffffff00000000U) | (data & 0xffffffffU);
 
         if(inst_type==SL_INTEGER){       //gp
-            vmx_vcpu_set_gr(vcpu,inst.M1.r1,data,0);
+            vcpu_set_gr(vcpu,inst.M1.r1,data,0);
         }else{
             panic("Don't support ldfd now !");
 /*            switch(inst.M6.f1){
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/pal_emul.c
--- a/xen/arch/ia64/vmx/pal_emul.c      Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/pal_emul.c      Mon Sep 19 17:08:20 2005
@@ -24,18 +24,18 @@
 get_pal_parameters (VCPU *vcpu, UINT64 *gr29,
                        UINT64 *gr30, UINT64 *gr31) {
 
-       vmx_vcpu_get_gr(vcpu,29,gr29);
-       vmx_vcpu_get_gr(vcpu,30,gr30); 
-       vmx_vcpu_get_gr(vcpu,31,gr31);
+       vcpu_get_gr_nat(vcpu,29,gr29);
+       vcpu_get_gr_nat(vcpu,30,gr30); 
+       vcpu_get_gr_nat(vcpu,31,gr31);
 }
 
 static void
 set_pal_result (VCPU *vcpu,struct ia64_pal_retval result) {
 
-       vmx_vcpu_set_gr(vcpu,8, result.status,0);
-       vmx_vcpu_set_gr(vcpu,9, result.v0,0);
-       vmx_vcpu_set_gr(vcpu,10, result.v1,0);
-       vmx_vcpu_set_gr(vcpu,11, result.v2,0);
+       vcpu_set_gr(vcpu,8, result.status,0);
+       vcpu_set_gr(vcpu,9, result.v0,0);
+       vcpu_set_gr(vcpu,10, result.v1,0);
+       vcpu_set_gr(vcpu,11, result.v2,0);
 }
 
 
@@ -45,7 +45,7 @@
        struct ia64_pal_retval result;
 
        get_pal_parameters (vcpu, &gr29, &gr30, &gr31);
-       vmx_vcpu_get_gr(vcpu,28,&gr28);
+       vcpu_get_gr_nat(vcpu,28,&gr28);
 
        /* Always call Host Pal in int=1 */
        gr30 = gr30 &(~(0x2UL));
@@ -236,7 +236,7 @@
        struct ia64_pal_retval result;
 
 
-       vmx_vcpu_get_gr(vcpu,28,&gr28);  //bank1
+       vcpu_get_gr_nat(vcpu,28,&gr28);  //bank1
 
        switch (gr28) {
                case PAL_CACHE_FLUSH:
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmmu.c  Mon Sep 19 17:08:20 2005
@@ -713,7 +713,7 @@
     hcb = vmx_vcpu_get_vtlb(vcpu);
     vrr=vmx_vcpu_rr(vcpu,vadr);
     regs=vcpu_regs(vcpu);
-    pt_isr.val=regs->cr_isr;
+    pt_isr.val=VMX(vcpu,cr_isr);
     visr.val=0;
     visr.ei=pt_isr.ei;
     visr.ir=pt_isr.ir;
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_entry.S
--- a/xen/arch/ia64/vmx/vmx_entry.S     Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_entry.S     Mon Sep 19 17:08:20 2005
@@ -83,7 +83,6 @@
        ;;
        adds r21=PT(PR)+16,r12
        ;;
-
        lfetch [r21],PT(CR_IPSR)-PT(PR)
        adds r2=PT(B6)+16,r12
        adds r3=PT(R16)+16,r12
@@ -216,138 +215,90 @@
     ;;
     alloc loc0=ar.pfs,0,1,1,0
     adds out0=16,r12
-    ;;
+    adds r7 = PT(EML_UNAT)+16,r12
+    ;;
+    ld8 r7 = [r7]
     br.call.sptk.many b0=leave_hypervisor_tail
     ;;
     mov ar.pfs=loc0
-    adds r8=IA64_VPD_BASE_OFFSET,r13
-    ;;
-    ld8 r8=[r8]
-    ;;
-    adds r9=VPD(VPSR),r8
-    ;;
-    ld8 r9=[r9]
-    ;;
-    tbit.z pBN0,pBN1=r9,IA64_PSR_BN_BIT
-    ;;
-(pBN0) add r7=VPD(VBNAT),r8;
-(pBN1) add r7=VPD(VNAT),r8;
-    ;;
-    ld8 r7=[r7]
-    ;;
     mov ar.unat=r7
-(pBN0) add r4=VPD(VBGR),r8;
-(pBN1) add r4=VPD(VGR),r8;
-(pBN0) add r5=VPD(VBGR)+0x8,r8;
-(pBN1) add r5=VPD(VGR)+0x8,r8;
-    ;;
-    ld8.fill r16=[r4],16
-    ld8.fill r17=[r5],16
-    ;;
-    ld8.fill r18=[r4],16
-    ld8.fill r19=[r5],16
-    ;;
-    ld8.fill r20=[r4],16
-    ld8.fill r21=[r5],16
-    ;;
-    ld8.fill r22=[r4],16
-    ld8.fill r23=[r5],16
-    ;;
-    ld8.fill r24=[r4],16
-    ld8.fill r25=[r5],16
-    ;;
-    ld8.fill r26=[r4],16
-    ld8.fill r27=[r5],16
-    ;;
-    ld8.fill r28=[r4],16
-    ld8.fill r29=[r5],16
-    ;;
-    ld8.fill r30=[r4],16
-    ld8.fill r31=[r5],16
+    adds r20=PT(PR)+16,r12
+    ;;
+    lfetch [r20],PT(CR_IPSR)-PT(PR)
+    adds r2 = PT(B6)+16,r12
+    adds r3 = PT(B7)+16,r12
+    ;;
+    lfetch [r20]
+    ;;
+    ld8 r24=[r2],16        /* B6 */
+    ld8 r25=[r3],16        /* B7 */
+    ;;
+    ld8 r26=[r2],16        /* ar_csd */
+    ld8 r27=[r3],16        /* ar_ssd */
+    mov b6 = r24
+    ;;
+    ld8.fill r8=[r2],16
+    ld8.fill r9=[r3],16
+    mov b7 = r25
+    ;;
+    mov ar.csd = r26
+    mov ar.ssd = r27
+    ;;
+    ld8.fill r10=[r2],PT(R15)-PT(R10)
+    ld8.fill r11=[r3],PT(R14)-PT(R11)
+    ;;
+    ld8.fill r15=[r2],PT(R16)-PT(R15)
+    ld8.fill r14=[r3],PT(R17)-PT(R14)
+    ;;
+    ld8.fill r16=[r2],16
+    ld8.fill r17=[r3],16
+    ;;
+    ld8.fill r18=[r2],16
+    ld8.fill r19=[r3],16
+    ;;
+    ld8.fill r20=[r2],16
+    ld8.fill r21=[r3],16
+    ;;
+    ld8.fill r22=[r2],16
+    ld8.fill r23=[r3],16
+    ;;
+    ld8.fill r24=[r2],16
+    ld8.fill r25=[r3],16
+    ;;
+    ld8.fill r26=[r2],16
+    ld8.fill r27=[r3],16
+    ;;
+    ld8.fill r28=[r2],16
+    ld8.fill r29=[r3],16
+    ;;
+    ld8.fill r30=[r2],PT(F6)-PT(R30)
+    ld8.fill r31=[r3],PT(F7)-PT(R31)
+    ;;
+    rsm psr.i | psr.ic  // initiate turning off of interrupt and interruption 
collection
+    invala          // invalidate ALAT
+    ;;
+    ldf.fill f6=[r2],32
+    ldf.fill f7=[r3],32
+    ;;
+    ldf.fill f8=[r2],32
+    ldf.fill f9=[r3],32
+    ;;
+    ldf.fill f10=[r2],32
+    ldf.fill f11=[r3],24
+    ;;
+    ld8.fill r4=[r2],16    //load r4
+    ld8.fill r5=[r3],16    //load r5
+    ;;
+    ld8.fill r6=[r2]    //load r6
+    ld8.fill r7=[r3]    //load r7
+    ;;
+    srlz.i          // ensure interruption collection is off
     ;;
     bsw.0
     ;;
-    mov r18=r8      //vpd
-    mov r19=r9      //vpsr
-    adds r20=PT(PR)+16,r12
-    ;;
-    lfetch [r20],PT(CR_IPSR)-PT(PR)
-    adds r16=PT(B6)+16,r12
-    adds r17=PT(B7)+16,r12
-    ;;
-    lfetch [r20]
+    adds r16 = PT(CR_IPSR)+16,r12
+    adds r17 = PT(CR_IIP)+16,r12
     mov r21=r13                // get current
-    ;;
-    ld8 r30=[r16],16      // load b6
-    ld8 r31=[r17],16      // load b7
-    add r20=PT(EML_UNAT)+16,r12
-    ;;
-    ld8 r29=[r20]       //load ar_unat
-    mov b6=r30
-    mov b7=r31
-    ld8 r30=[r16],16    //load ar_csd
-    ld8 r31=[r17],16    //load ar_ssd
-    ;;
-    mov ar.unat=r29
-    mov ar.csd=r30
-    mov ar.ssd=r31
-    ;;
-    ld8.fill r8=[r16],16    //load r8
-    ld8.fill r9=[r17],16    //load r9
-    ;;
-    ld8.fill r10=[r16],PT(R1)-PT(R10)    //load r10
-    ld8.fill r11=[r17],PT(R12)-PT(R11)    //load r11
-    ;;
-    ld8.fill r1=[r16],16    //load r1
-    ld8.fill r12=[r17],16    //load r12
-    ;;
-    ld8.fill r13=[r16],16    //load r13
-    ld8 r30=[r17],16    //load ar_fpsr
-    ;;
-    ld8.fill r15=[r16],16    //load r15
-    ld8.fill r14=[r17],16    //load r14
-    mov ar.fpsr=r30
-    ;;
-    ld8.fill r2=[r16],16    //load r2
-    ld8.fill r3=[r17],16    //load r3
-    ;;
-/*
-(pEml) ld8.fill r4=[r16],16    //load r4
-(pEml) ld8.fill r5=[r17],16    //load r5
-    ;;
-(pEml) ld8.fill r6=[r16],PT(AR_CCV)-PT(R6)   //load r6
-(pEml) ld8.fill r7=[r17],PT(F7)-PT(R7)   //load r7
-    ;;
-(pNonEml) adds r16=PT(AR_CCV)-PT(R4),r16
-(pNonEml) adds r17=PT(F7)-PT(R5),r17
-    ;;
-*/
-    ld8.fill r4=[r16],16    //load r4
-    ld8.fill r5=[r17],16    //load r5
-     ;;
-    ld8.fill r6=[r16],PT(AR_CCV)-PT(R6)   //load r6
-    ld8.fill r7=[r17],PT(F7)-PT(R7)   //load r7
-    ;;
-
-    ld8 r30=[r16],PT(F6)-PT(AR_CCV)
-    rsm psr.i | psr.ic  // initiate turning off of interrupt and interruption 
collection
-    ;;
-    srlz.i          // ensure interruption collection is off
-    ;;
-    invala          // invalidate ALAT
-    ;;
-    ldf.fill f6=[r16],32
-    ldf.fill f7=[r17],32
-    ;;
-    ldf.fill f8=[r16],32
-    ldf.fill f9=[r17],32
-    ;;
-    ldf.fill f10=[r16]
-    ldf.fill f11=[r17]
-    ;;
-    mov ar.ccv=r30
-    adds r16=PT(CR_IPSR)-PT(F10),r16
-    adds r17=PT(CR_IIP)-PT(F11),r17
     ;;
     ld8 r31=[r16],16    // load cr.ipsr
     ld8 r30=[r17],16    // load cr.iip
@@ -358,13 +309,26 @@
     ld8 r27=[r16],16    // load ar.pfs
     ld8 r26=[r17],16    // load ar.rsc
     ;;
-    ld8 r25=[r16],16    // load ar.rnat (may be garbage)
-    ld8 r24=[r17],16// load ar.bspstore (may be garbage)
+    ld8 r25=[r16],16    // load ar.rnat
+    ld8 r24=[r17],16    // load ar.bspstore
     ;;
     ld8 r23=[r16],16    // load predicates
-    ld8 r22=[r17],PT(RFI_PFS)-PT(B0)    // load b0
+    ld8 r22=[r17],16    // load b0
     ;;
     ld8 r20=[r16],16    // load ar.rsc value for "loadrs"
+    ld8.fill r1=[r17],16    //load r1
+    ;;
+    ld8.fill r12=[r16],16    //load r12
+    ld8.fill r13=[r17],PT(R2)-PT(R13)    //load r13
+    ;;
+    ld8 r19=[r16],PT(R3)-PT(AR_FPSR)    //load ar_fpsr
+    ld8.fill r2=[r17],PT(AR_CCV)-PT(R2)    //load r2
+    ;;
+    ld8.fill r3=[r16]    //load r3
+    ld8 r18=[r17],PT(RFI_PFS)-PT(AR_CCV)           //load ar_ccv
+    ;;
+    mov ar.fpsr=r19
+    mov ar.ccv=r18
     ;;
 //rbs_switch
     // loadrs has already been shifted
@@ -389,7 +353,13 @@
     ;;
 vmx_dorfirfi_back:
     mov ar.pfs=r27
-
+    adds r18=IA64_VPD_BASE_OFFSET,r21
+    ;;
+    ld8 r18=[r18]   //vpd
+    ;;
+    adds r19=VPD(VPSR),r18
+    ;;
+    ld8 r19=[r19]        //vpsr
 //vsa_sync_write_start
     movl r20=__vsa_base
     ;;
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_hypercall.c
--- a/xen/arch/ia64/vmx/vmx_hypercall.c Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c Mon Sep 19 17:08:20 2005
@@ -35,7 +35,7 @@
 void hyper_not_support(void)
 {
     VCPU *vcpu=current;
-    vmx_vcpu_set_gr(vcpu, 8, -1, 0);
+    vcpu_set_gr(vcpu, 8, -1, 0);
     vmx_vcpu_increment_iip(vcpu);
 }
 
@@ -43,12 +43,12 @@
 {
     VCPU *vcpu=current;
     u64 r32,r33,r34,r35,ret;
-    vmx_vcpu_get_gr(vcpu,16,&r32);
-    vmx_vcpu_get_gr(vcpu,17,&r33);
-    vmx_vcpu_get_gr(vcpu,18,&r34);
-    vmx_vcpu_get_gr(vcpu,19,&r35);
+    vcpu_get_gr_nat(vcpu,16,&r32);
+    vcpu_get_gr_nat(vcpu,17,&r33);
+    vcpu_get_gr_nat(vcpu,18,&r34);
+    vcpu_get_gr_nat(vcpu,19,&r35);
     ret=do_mmu_update((mmu_update_t*)r32,r33,r34,r35);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
     vmx_vcpu_increment_iip(vcpu);
 }
 
@@ -65,18 +65,18 @@
     if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) {
        panic("PREEMPT happen in multicall\n"); // Not support yet
     } else {
-       vmx_vcpu_set_gr(vcpu, 15, op, 0);
+       vcpu_set_gr(vcpu, 15, op, 0);
        for ( i = 0; i < nr_args; i++) {
            switch (i) {
-           case 0: vmx_vcpu_set_gr(vcpu, 16, va_arg(args, unsigned long), 0);
-                   break;
-           case 1: vmx_vcpu_set_gr(vcpu, 17, va_arg(args, unsigned long), 0);
-                   break;
-           case 2: vmx_vcpu_set_gr(vcpu, 18, va_arg(args, unsigned long), 0);
-                   break;
-           case 3: vmx_vcpu_set_gr(vcpu, 19, va_arg(args, unsigned long), 0);
-                   break;
-           case 4: vmx_vcpu_set_gr(vcpu, 20, va_arg(args, unsigned long), 0);
+           case 0: vcpu_set_gr(vcpu, 16, va_arg(args, unsigned long), 0);
+                   break;
+           case 1: vcpu_set_gr(vcpu, 17, va_arg(args, unsigned long), 0);
+                   break;
+           case 2: vcpu_set_gr(vcpu, 18, va_arg(args, unsigned long), 0);
+                   break;
+           case 3: vcpu_set_gr(vcpu, 19, va_arg(args, unsigned long), 0);
+                   break;
+           case 4: vcpu_set_gr(vcpu, 20, va_arg(args, unsigned long), 0);
                    break;
            default: panic("Too many args for hypercall continuation\n");
                    break;
@@ -93,15 +93,15 @@
     VCPU *vcpu=current;
     u64 r32,r33,r34,r35,r36;
     u64 ret;
-    vmx_vcpu_get_gr(vcpu,16,&r32);
-    vmx_vcpu_get_gr(vcpu,17,&r33);
-    vmx_vcpu_get_gr(vcpu,18,&r34);
-    vmx_vcpu_get_gr(vcpu,19,&r35);
-    vmx_vcpu_get_gr(vcpu,20,&r36);
+    vcpu_get_gr_nat(vcpu,16,&r32);
+    vcpu_get_gr_nat(vcpu,17,&r33);
+    vcpu_get_gr_nat(vcpu,18,&r34);
+    vcpu_get_gr_nat(vcpu,19,&r35);
+    vcpu_get_gr_nat(vcpu,20,&r36);
 //    ret=do_dom_mem_op(r32,(u64 *)r33,r34,r35,r36);
     ret = 0;
     printf("do_dom_mem return value: %lx\n", ret);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
 
     /* Hard to define a special return value to indicate hypercall restart.
      * So just add a new mark, which is SMP safe
@@ -117,9 +117,9 @@
 {
     VCPU *vcpu=current;
     u64 r32,ret;
-    vmx_vcpu_get_gr(vcpu,16,&r32);
+    vcpu_get_gr_nat(vcpu,16,&r32);
     ret=do_sched_op(r32);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
 
     vmx_vcpu_increment_iip(vcpu);
 }
@@ -128,9 +128,9 @@
 {
     VCPU *vcpu=current;
     u64 r32,ret;
-    vmx_vcpu_get_gr(vcpu,16,&r32);
+    vcpu_get_gr_nat(vcpu,16,&r32);
     ret=do_dom0_op((dom0_op_t *)r32);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
 
     vmx_vcpu_increment_iip(vcpu);
 }
@@ -139,9 +139,9 @@
 {
     VCPU *vcpu=current;
     u64 r32,ret;
-    vmx_vcpu_get_gr(vcpu,16,&r32);
+    vcpu_get_gr_nat(vcpu,16,&r32);
     ret=do_event_channel_op((evtchn_op_t *)r32);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
     vmx_vcpu_increment_iip(vcpu);
 }
 
@@ -149,9 +149,9 @@
 {
     VCPU *vcpu=current;
     u64 r32,ret;
-    vmx_vcpu_get_gr(vcpu,16,&r32);
+    vcpu_get_gr_nat(vcpu,16,&r32);
     ret=do_xen_version((int )r32);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
     vmx_vcpu_increment_iip(vcpu);
 }
 
@@ -174,10 +174,10 @@
 //TODO:
     VCPU *vcpu=current;
     u64 va,lock, ret;
-    vmx_vcpu_get_gr(vcpu,16,&va);
-    vmx_vcpu_get_gr(vcpu,17,&lock);
+    vcpu_get_gr_nat(vcpu,16,&va);
+    vcpu_get_gr_nat(vcpu,17,&lock);
     ret=do_lock_page(vcpu, va, lock);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
 
     vmx_vcpu_increment_iip(vcpu);
 }
@@ -213,10 +213,10 @@
 {
     VCPU *vcpu=current;
     u64 gpa,ret;
-    vmx_vcpu_get_gr(vcpu,16,&gpa);
+    vcpu_get_gr_nat(vcpu,16,&gpa);
 
     ret=do_set_shared_page(vcpu, gpa);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
 
     vmx_vcpu_increment_iip(vcpu);
 }
@@ -226,11 +226,11 @@
 {
     VCPU *vcpu=current;
     u64 r32,r33,r34,ret;
-    vmx_vcpu_get_gr(vcpu,16,&r32);
-    vmx_vcpu_get_gr(vcpu,17,&r33);
-    vmx_vcpu_get_gr(vcpu,18,&r34);
+    vcpu_get_gr_nat(vcpu,16,&r32);
+    vcpu_get_gr_nat(vcpu,17,&r33);
+    vcpu_get_gr_nat(vcpu,18,&r34);
 
     ret=do_grant_table_op((unsigned int)r32, (void *)r33, (unsigned int)r34);
-    vmx_vcpu_set_gr(vcpu, 8, ret, 0);
+    vcpu_set_gr(vcpu, 8, ret, 0);
 }
 */
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_interrupt.c
--- a/xen/arch/ia64/vmx/vmx_interrupt.c Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_interrupt.c Mon Sep 19 17:08:20 2005
@@ -37,11 +37,8 @@
     IA64_PSR vpsr;
     REGS * regs = vcpu_regs(vcpu);
     vpsr.val = vmx_vcpu_get_psr(vcpu);
-
+    vcpu_bsw0(vcpu);
     if(vpsr.ic){
-       extern void vmx_dorfirfi(void);
-       if (regs->cr_iip == *(unsigned long *)vmx_dorfirfi)
-               panic("COLLECT interruption for vmx_dorfirfi\n");
 
         /* Sync mpsr id/da/dd/ss/ed bits to vipsr
          * since after guest do rfi, we still want these bits on in
@@ -65,7 +62,7 @@
         vifs &= ~IA64_IFS_V;
         vcpu_set_ifs(vcpu, vifs);
 
-        vcpu_set_iipa(vcpu, regs->cr_iipa);
+        vcpu_set_iipa(vcpu, VMX(vcpu,cr_iipa));
     }
 
     vdcr = VCPU(vcpu,dcr);
@@ -88,6 +85,7 @@
     vmx_vcpu_set_psr(vcpu, vpsr.val);
 
 }
+
 int
 inject_guest_interruption(VCPU *vcpu, u64 vec)
 {
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_ivt.S
--- a/xen/arch/ia64/vmx/vmx_ivt.S       Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_ivt.S       Mon Sep 19 17:08:20 2005
@@ -690,9 +690,14 @@
 
/////////////////////////////////////////////////////////////////////////////////////////
 // 0x6100 Entry 37 (size 16 bundles) Virtualization Fault
 ENTRY(vmx_virtualization_fault)
-       VMX_DBG_FAULT(37)
        mov r31=pr
     mov r19=37
+    adds r16 = IA64_VCPU_CAUSE_OFFSET,r21
+    adds r17 = IA64_VCPU_OPCODE_OFFSET,r21
+    ;;
+    st8 [r16] = r24
+    st8 [r17] = r25
+    ;;
     br.sptk vmx_dispatch_virtualization_fault
 END(vmx_virtualization_fault)
 
@@ -897,44 +902,45 @@
      *  r31:    contains saved predicates (pr)
      */
     VMX_SAVE_MIN_WITH_COVER_R19
-    alloc r14=ar.pfs,0,0,4,0
+    alloc r14=ar.pfs,0,0,5,0
     mov out0=cr.ifa
     mov out1=cr.isr
     mov out2=cr.iim
     mov out3=r15
-
+    adds r3=8,r2                // set up second base pointer
+    ;;
     ssm psr.ic
     ;;
     srlz.i                  // guarantee that interruption collection is on
     ;;
     (p15) ssm psr.i               // restore psr.i
-    adds r3=16,r2                // set up second base pointer
+    movl r14=ia64_leave_hypervisor
     ;;
     VMX_SAVE_REST
-    movl r14=ia64_leave_hypervisor
-    ;;
     mov rp=r14
+    ;;
+    adds out4=16,r12
     br.call.sptk.many b6=vmx_reflect_interruption
 END(vmx_dispatch_reflection)
 
 ENTRY(vmx_dispatch_virtualization_fault)
     VMX_SAVE_MIN_WITH_COVER_R19
     ;;
-    alloc r14=ar.pfs,0,0,3,0        // now it's safe (must be first in insn 
group!)
+    alloc r14=ar.pfs,0,0,2,0        // now it's safe (must be first in insn 
group!)
     mov out0=r13        //vcpu
-    mov out1=r4         //cause
-    mov out2=r5         //opcode
+    adds r3=8,r2                // set up second base pointer
+    ;;
     ssm psr.ic
     ;;
     srlz.i                  // guarantee that interruption collection is on
     ;;
     (p15) ssm psr.i               // restore psr.i
-    adds r3=16,r2                // set up second base pointer
+    movl r14=ia64_leave_hypervisor
     ;;
     VMX_SAVE_REST
-    movl r14=ia64_leave_hypervisor
-    ;;
     mov rp=r14
+    ;;
+    adds out1=16,sp         //regs
     br.call.sptk.many b6=vmx_emulate
 END(vmx_dispatch_virtualization_fault)
 
@@ -949,7 +955,7 @@
     srlz.i                  // guarantee that interruption collection is on
     ;;
     (p15) ssm psr.i               // restore psr.i
-    adds r3=16,r2                // set up second base pointer
+    adds r3=8,r2                // set up second base pointer
     ;;
     VMX_SAVE_REST
     movl r14=ia64_leave_hypervisor
@@ -961,21 +967,21 @@
 ENTRY(vmx_dispatch_tlb_miss)
     VMX_SAVE_MIN_WITH_COVER_R19
     alloc r14=ar.pfs,0,0,3,0
-    mov out0=r13
+    mov out0=cr.ifa
     mov out1=r15
-    mov out2=cr.ifa
-
+    adds r3=8,r2                // set up second base pointer
+    ;;
     ssm psr.ic
     ;;
     srlz.i                  // guarantee that interruption collection is on
     ;;
     (p15) ssm psr.i               // restore psr.i
-    adds r3=16,r2                // set up second base pointer
+    movl r14=ia64_leave_hypervisor
     ;;
     VMX_SAVE_REST
-    movl r14=ia64_leave_hypervisor
-    ;;
     mov rp=r14
+    ;;
+    adds out2=16,r12
     br.call.sptk.many b6=vmx_hpw_miss
 END(vmx_dispatch_tlb_miss)
 
@@ -986,21 +992,21 @@
     ;;
     alloc r14=ar.pfs,0,0,4,0 // now it's safe (must be first in insn group!)
     mov out0=cr.ifa
-    adds out1=16,sp
     mov out2=cr.isr     // FIXME: pity to make this slow access twice
     mov out3=cr.iim     // FIXME: pity to make this slow access twice
-
+    adds r3=8,r2                // set up second base pointer
+    ;;
     ssm psr.ic
     ;;
     srlz.i                  // guarantee that interruption collection is on
     ;;
     (p15)ssm psr.i               // restore psr.i
-    adds r3=16,r2                // set up second base pointer
+    movl r14=ia64_leave_hypervisor
     ;;
     VMX_SAVE_REST
-    movl r14=ia64_leave_hypervisor
-    ;;
     mov rp=r14
+    ;;
+    adds out1=16,sp
     br.call.sptk.many b6=vmx_ia64_handle_break
     ;;
 END(vmx_dispatch_break_fault)
@@ -1013,7 +1019,7 @@
     srlz.i                  // guarantee that interruption collection is on
     ;;
     (p15) ssm psr.i               // restore psr.i
-    adds r3=16,r2                // set up second base pointer
+    adds r3=8,r2                // set up second base pointer
     ;;
     VMX_SAVE_REST
     ;;
@@ -1038,19 +1044,19 @@
        ;;
        alloc r14=ar.pfs,0,0,2,0 // must be first in an insn group
        mov out0=cr.ivr         // pass cr.ivr as first arg
+       adds r3=8,r2            // set up second base pointer for SAVE_REST
+    ;;
+       ssm psr.ic
+       ;;
+    srlz.i
+    ;;
+    (p15) ssm psr.i
+       movl r14=ia64_leave_hypervisor
+       ;;
+       VMX_SAVE_REST
+       mov rp=r14
+       ;;
        add out1=16,sp          // pass pointer to pt_regs as second arg
-
-       ssm psr.ic
-       ;;
-    srlz.i
-    ;;
-    (p15) ssm psr.i
-       adds r3=16,r2           // set up second base pointer for SAVE_REST
-       ;;
-       VMX_SAVE_REST
-       movl r14=ia64_leave_hypervisor
-       ;;
-       mov rp=r14
        br.call.sptk.many b6=vmx_ia64_handle_irq
 END(vmx_dispatch_interrupt)
 
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_minstate.h
--- a/xen/arch/ia64/vmx/vmx_minstate.h  Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_minstate.h  Mon Sep 19 17:08:20 2005
@@ -65,7 +65,6 @@
     ld8 r25=[r25];      /* read vpd base */     \
     ld8 r20=[r20];      /* read entry point */  \
     ;;      \
-    mov r6=r25;     \
     add r20=PAL_VPS_SYNC_READ,r20;  \
     ;;  \
 { .mii;  \
@@ -80,21 +79,19 @@
     br.cond.sptk b0;        /*  call the service */ \
     ;;              \
 };           \
-    ld8 r7=[r22];   \
+    ld8 r17=[r22];   \
     /* deposite ipsr bit cpl into vpd.vpsr, since epc will change */    \
     extr.u r30=r16, IA64_PSR_CPL0_BIT, 2;   \
     ;;      \
-    dep r7=r30, r7, IA64_PSR_CPL0_BIT, 2;   \
-    ;;      \
+    dep r17=r30, r17, IA64_PSR_CPL0_BIT, 2;   \
     extr.u r30=r16, IA64_PSR_BE_BIT, 5;   \
     ;;      \
-    dep r7=r30, r7, IA64_PSR_BE_BIT, 5;   \
-    ;;      \
+    dep r17=r30, r17, IA64_PSR_BE_BIT, 5;   \
     extr.u r30=r16, IA64_PSR_RI_BIT, 2;   \
     ;;      \
-    dep r7=r30, r7, IA64_PSR_RI_BIT, 2;   \
-    ;;      \
-    st8 [r22]=r7;      \
+    dep r17=r30, r17, IA64_PSR_RI_BIT, 2;   \
+    ;;      \
+    st8 [r22]=r17;      \
     ;;
 
 
@@ -156,12 +153,14 @@
     VMX_MINSTATE_GET_CURRENT(r16);  /* M (or M;;I) */                   \
     mov r27=ar.rsc;         /* M */                         \
     mov r20=r1;         /* A */                         \
-    mov r26=ar.unat;        /* M */                         \
+    mov r25=ar.unat;        /* M */                         \
     mov r29=cr.ipsr;        /* M */                         \
+    mov r26=ar.pfs;         /* I */                     \
     mov r18=cr.isr;         \
     COVER;              /* B;; (or nothing) */                  \
     ;;                                          \
     tbit.z p6,p0=r29,IA64_PSR_VM_BIT;       \
+    ;;      \
     tbit.nz.or p6,p0 = r18,39; \
     ;;        \
 (p6) br.sptk.few vmx_panic;        \
@@ -193,7 +192,6 @@
 .mem.offset 0,0; st8.spill [r16]=r10,24;                            \
 .mem.offset 8,0; st8.spill [r17]=r11,24;                            \
         ;;                                          \
-    mov r8=ar.pfs;         /* I */                         \
     mov r9=cr.iip;         /* M */                         \
     mov r10=ar.fpsr;        /* M */                         \
         ;;                      \
@@ -201,8 +199,8 @@
     st8 [r17]=r30,16;   /* save cr.ifs */                       \
     sub r18=r18,r22;    /* r18=RSE.ndirty*8 */                      \
     ;;          \
-    st8 [r16]=r26,16;   /* save ar.unat */                      \
-    st8 [r17]=r8,16;    /* save ar.pfs */                       \
+    st8 [r16]=r25,16;   /* save ar.unat */                      \
+    st8 [r17]=r26,16;    /* save ar.pfs */                       \
     shl r18=r18,16;     /* compute ar.rsc to be used for "loadrs" */           
 \
     ;;                                          \
     st8 [r16]=r27,16;   /* save ar.rsc */                       \
@@ -227,32 +225,18 @@
     ;;                                          \
 .mem.offset 0,0; st8.spill [r16]=r2,16;                             \
 .mem.offset 8,0; st8.spill [r17]=r3,16;                             \
-    adds r2=PT(F6),r1;                         \
-    ;;                                          \
- .mem.offset 0,0; st8.spill [r16]=r4,16;                             \
- .mem.offset 8,0; st8.spill [r17]=r5,16;                             \
-    ;;          \
- .mem.offset 0,0; st8.spill [r16]=r6,16;     \
- .mem.offset 8,0; st8.spill [r17]=r7,16;     \
-    mov r20=ar.ccv;      \
+    adds r2=IA64_PT_REGS_R16_OFFSET,r1;                         \
+     ;;  \
+    adds r16=IA64_VCPU_IIPA_OFFSET,r13;                       \
+    adds r17=IA64_VCPU_ISR_OFFSET,r13;                       \
+    mov r26=cr.iipa;  \
+    mov r27=cr.isr;   \
+    ;;      \
+    st8 [r16]=r26;      \
+    st8 [r17]=r27;      \
     ;;  \
-  mov r18=cr.iipa;  \
-  mov r4=cr.isr;   \
-  mov r22=ar.unat;    \
-    ;;  \
-  st8 [r16]=r18,16;      \
-  st8 [r17]=r4;      \
-    ;;      \
-    adds r16=PT(EML_UNAT),r1;   \
-    adds r17=PT(AR_CCV),r1;                 \
-    ;;                      \
-    st8 [r16]=r22,8;     \
-    st8 [r17]=r20;       \
-    mov r4=r24;         \
-    mov r5=r25;         \
-     ;;  \
-    st8 [r16]=r0;  \
     EXTRA;                                          \
+    mov r8=ar.ccv;          \
     mov r9=ar.csd;                                      \
     mov r10=ar.ssd;                                     \
     movl r11=FPSR_DEFAULT;   /* L-unit */                           \
@@ -268,9 +252,7 @@
  *  psr.ic: on
  *  r2: points to &pt_regs.f6
  *  r3: points to &pt_regs.f7
- *  r4,r5,scrach
- *  r6: points to vpd
- *  r7: vpsr
+ *  r8: contents of ar.ccv
  *  r9: contents of ar.csd
  *  r10:    contents of ar.ssd
  *  r11:    FPSR_DEFAULT
@@ -278,46 +260,35 @@
  * Registers r14 and r15 are guaranteed not to be touched by SAVE_REST.
  */
 #define VMX_SAVE_REST               \
-    tbit.z pBN0,pBN1=r7,IA64_PSR_BN_BIT;  /* guest bank0 or bank1 ? */      \
-    ;;      \
-(pBN0) add r4=VPD(VBGR),r6;     \
-(pBN0) add r5=VPD(VBGR)+0x8,r6;     \
-(pBN0) add r7=VPD(VBNAT),r6;     \
-    ;;      \
-(pBN1) add r5=VPD(VGR)+0x8,r6;      \
-(pBN1) add r4=VPD(VGR),r6;      \
-(pBN1) add r7=VPD(VNAT),r6;      \
-    ;;      \
-.mem.offset 0,0; st8.spill [r4]=r16,16;     \
-.mem.offset 8,0; st8.spill [r5]=r17,16;     \
-    ;;                  \
-.mem.offset 0,0; st8.spill [r4]=r18,16;     \
-.mem.offset 8,0; st8.spill [r5]=r19,16;     \
-    ;;                  \
-.mem.offset 0,0; st8.spill [r4]=r20,16;     \
-.mem.offset 8,0; st8.spill [r5]=r21,16;     \
-    ;;                  \
-.mem.offset 0,0; st8.spill [r4]=r22,16;     \
-.mem.offset 8,0; st8.spill [r5]=r23,16;     \
-    ;;                  \
-.mem.offset 0,0; st8.spill [r4]=r24,16;     \
-.mem.offset 8,0; st8.spill [r5]=r25,16;     \
-    ;;                  \
-.mem.offset 0,0; st8.spill [r4]=r26,16;     \
-.mem.offset 8,0; st8.spill [r5]=r27,16;     \
-    ;;                  \
-.mem.offset 0,0; st8.spill [r4]=r28,16;     \
-.mem.offset 8,0; st8.spill [r5]=r29,16;     \
-    mov r26=b6;         \
-    ;;                  \
-.mem.offset 0,0; st8.spill [r4]=r30,16;     \
-.mem.offset 8,0; st8.spill [r5]=r31,16;     \
-    mov r27=b7;     \
-    ;;                  \
-    mov r30=ar.unat;    \
-    ;;      \
-    st8 [r7]=r30;       \
-    mov ar.fpsr=r11;    /* M-unit */    \
+.mem.offset 0,0; st8.spill [r2]=r16,16;     \
+.mem.offset 8,0; st8.spill [r3]=r17,16;     \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r18,16;     \
+.mem.offset 8,0; st8.spill [r3]=r19,16;     \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r20,16;     \
+.mem.offset 8,0; st8.spill [r3]=r21,16;     \
+    mov r18=b6;         \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r22,16;     \
+.mem.offset 8,0; st8.spill [r3]=r23,16;     \
+    mov r19=b7;     \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r24,16;     \
+.mem.offset 8,0; st8.spill [r3]=r25,16;     \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r26,16;     \
+.mem.offset 8,0; st8.spill [r3]=r27,16;     \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r28,16;     \
+.mem.offset 8,0; st8.spill [r3]=r29,16;     \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r30,16;     \
+.mem.offset 8,0; st8.spill [r3]=r31,32;     \
+    ;;                  \
+    mov ar.fpsr=r11;     \
+    st8 [r2]=r8,8;       \
+    adds r24=PT(B6)-PT(F7),r3;      \
     ;;                  \
     stf.spill [r2]=f6,32;           \
     stf.spill [r3]=f7,32;           \
@@ -325,17 +296,24 @@
     stf.spill [r2]=f8,32;           \
     stf.spill [r3]=f9,32;           \
     ;;                  \
-    stf.spill [r2]=f10;         \
-    stf.spill [r3]=f11;         \
-    ;;                  \
-    adds r2=PT(B6)-PT(F10),r2;      \
-    adds r3=PT(B7)-PT(F11),r3;      \
-    ;;          \
-    st8 [r2]=r26,16;       /* b6 */    \
-    st8 [r3]=r27,16;       /* b7 */    \
-    ;;                  \
-    st8 [r2]=r9;           /* ar.csd */    \
-    st8 [r3]=r10;          /* ar.ssd */    \
+    stf.spill [r2]=f10,32;         \
+    stf.spill [r3]=f11,24;         \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r4,16;     \
+.mem.offset 8,0; st8.spill [r3]=r5,16;     \
+    ;;                  \
+.mem.offset 0,0; st8.spill [r2]=r6,16;      \
+.mem.offset 8,0; st8.spill [r3]=r7;      \
+    adds r25=PT(B7)-PT(R7),r3;     \
+    ;;                  \
+    st8 [r24]=r18,16;       /* b6 */    \
+    st8 [r25]=r19,16;       /* b7 */    \
+    ;;                  \
+    st8 [r24]=r9;           /* ar.csd */    \
+    mov r26=ar.unat;            \
+    ;;      \
+    st8 [r25]=r10;          /* ar.ssd */    \
+    st8 [r2]=r26;       /* eml_unat */ \
     ;;
 
 #define VMX_SAVE_MIN_WITH_COVER   VMX_DO_SAVE_MIN(cover, mov r30=cr.ifs,)
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_process.c   Mon Sep 19 17:08:20 2005
@@ -72,8 +72,8 @@
                first_time = 0;
        }
        if (iim == 0x80001 || iim == 0x80002) { //FIXME: don't hardcode constant
-               if (running_on_sim) do_ssc(vcpu_get_gr(current,36), regs);
-               else do_ssc(vcpu_get_gr(current,36), regs);
+               if (running_on_sim) do_ssc(vcpu_get_gr_nat(current,36), regs);
+               else do_ssc(vcpu_get_gr_nat(current,36), regs);
        }
 #endif
        if (iim == d->arch.breakimm) {
@@ -93,7 +93,7 @@
                        break;
                    case FW_HYPERCALL_SAL_CALL:
                        for (i = 0; i < 8; i++)
-                               vmx_vcpu_get_gr(v, 32+i, &sal_param[i]);
+                               vcpu_get_gr_nat(v, 32+i, &sal_param[i]);
                        x = sal_emulator(sal_param[0], sal_param[1],
                                         sal_param[2], sal_param[3],
                                         sal_param[4], sal_param[5],
@@ -118,8 +118,8 @@
                    case FW_HYPERCALL_EFI_GET_TIME:
                        {
                        unsigned long *tv, *tc;
-                       vmx_vcpu_get_gr(v, 32, &tv);
-                       vmx_vcpu_get_gr(v, 33, &tc);
+                       vcpu_get_gr_nat(v, 32, &tv);
+                       vcpu_get_gr_nat(v, 33, &tc);
                        printf("efi_get_time(%p,%p) called...",tv,tc);
                        tv = __va(translate_domain_mpaddr(tv));
                        if (tc) tc = __va(translate_domain_mpaddr(tc));
@@ -154,7 +154,7 @@
         pal_emul(current);
                vmx_vcpu_increment_iip(current);
     }  else
-               vmx_reflect_interruption(ifa,isr,iim,11);
+               vmx_reflect_interruption(ifa,isr,iim,11,regs);
 }
 
 static UINT64 vec2off[68] = {0x0,0x400,0x800,0xc00,0x1000, 0x1400,0x1800,
@@ -170,10 +170,9 @@
 
 
 void vmx_reflect_interruption(UINT64 ifa,UINT64 isr,UINT64 iim,
-     UINT64 vector)
+     UINT64 vector,REGS *regs)
 {
     VCPU *vcpu = current;
-    REGS *regs=vcpu_regs(vcpu);
     UINT64 viha,vpsr = vmx_vcpu_get_psr(vcpu);
     if(!(vpsr&IA64_PSR_IC)&&(vector!=5)){
         panic("Guest nested fault!");
@@ -188,6 +187,36 @@
     }
     inject_guest_interruption(vcpu, vector);
 }
+
+
+void save_banked_regs_to_vpd(VCPU *v, REGS *regs)
+{
+    unsigned long i, * src,* dst, *sunat, *dunat;
+    IA64_PSR vpsr;
+    src=&regs->r16;
+    sunat=&regs->eml_unat;
+    vpsr.val = vmx_vcpu_get_psr(v);
+    if(vpsr.bn){
+        dst = &VCPU(v, vgr[0]);
+        dunat =&VCPU(v, vnat);
+        __asm__ __volatile__ (";;extr.u %0 = %1,%4,16;;
+                            dep %2 = %0, %2, 0, 16;;
+                            st8 [%3] = %2;;"
+       
::"r"(i),"r"(*sunat),"r"(*dunat),"r"(dunat),"i"(IA64_PT_REGS_R16_SLOT):"memory");
+
+    }else{
+        dst = &VCPU(v, vbgr[0]);
+//        dunat =&VCPU(v, vbnat);
+//        __asm__ __volatile__ (";;extr.u %0 = %1,%4,16;;
+//                            dep %2 = %0, %2, 16, 16;;
+//                            st8 [%3] = %2;;"
+//       
::"r"(i),"r"(*sunat),"r"(*dunat),"r"(dunat),"i"(IA64_PT_REGS_R16_SLOT):"memory");
+
+    }
+    for(i=0; i<16; i++)
+        *dst++ = *src++;
+}
+
 
 // ONLY gets called from ia64_leave_kernel
 // ONLY call with interrupts disabled?? (else might miss one?)
@@ -200,7 +229,6 @@
        if (!is_idle_task(d) ) {        // always comes from guest
                extern void vmx_dorfirfi(void);
                struct pt_regs *user_regs = vcpu_regs(current);
-
                if (local_softirq_pending())
                        do_softirq();
                local_irq_disable();
@@ -224,18 +252,22 @@
                        VCPU(v, irr[0]) |= 1UL << 0x10;
                        v->arch.irq_new_pending = 1;
                }
- 
+
                if ( v->arch.irq_new_pending ) {
                        v->arch.irq_new_pending = 0;
                        vmx_check_pending_irq(v);
                }
+//        if (VCPU(v,vac).a_bsw){
+//            save_banked_regs_to_vpd(v,regs);
+//        }
+
        }
 }
 
 extern ia64_rr vmx_vcpu_rr(VCPU *vcpu,UINT64 vadr);
 
 /* We came here because the H/W VHPT walker failed to find an entry */
-void vmx_hpw_miss(VCPU *vcpu, u64 vec, u64 vadr)
+void vmx_hpw_miss(u64 vadr , u64 vec, REGS* regs)
 {
     IA64_PSR vpsr;
     CACHE_LINE_TYPE type;
@@ -245,16 +277,17 @@
     REGS *regs;
     thash_cb_t *vtlb, *vhpt;
     thash_data_t *data, me;
-    vtlb=vmx_vcpu_get_vtlb(vcpu);
+    VCPU *v = current;
+    vtlb=vmx_vcpu_get_vtlb(v);
 #ifdef  VTLB_DEBUG
     check_vtlb_sanity(vtlb);
     dump_vtlb(vtlb);
 #endif
-    vpsr.val = vmx_vcpu_get_psr(vcpu);
-    regs = vcpu_regs(vcpu);
-    misr.val=regs->cr_isr;
+    vpsr.val = vmx_vcpu_get_psr(v);
+    misr.val=VMX(v,cr_isr);
+
 /*  TODO
-    if(vcpu->domain->id && vec == 2 &&
+    if(v->domain->id && vec == 2 &&
        vpsr.dt == 0 && is_gpa_io(MASK_PMA(vaddr))){
         emulate_ins(&v);
         return;
@@ -262,110 +295,110 @@
 */
 
     if((vec==1)&&(!vpsr.it)){
-        physical_itlb_miss(vcpu, vadr);
+        physical_itlb_miss(v, vadr);
         return;
     }
     if((vec==2)&&(!vpsr.dt)){
-        
if(vcpu->domain!=dom0&&__gpfn_is_io(vcpu->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
-            emulate_io_inst(vcpu,((vadr<<1)>>1),4);   //  UC
+        if(v->domain!=dom0&&__gpfn_is_io(v->domain,(vadr<<1)>>(PAGE_SHIFT+1))){
+            emulate_io_inst(v,((vadr<<1)>>1),4);   //  UC
         }else{
-            physical_dtlb_miss(vcpu, vadr);
+            physical_dtlb_miss(v, vadr);
         }
         return;
     }
-    vrr = vmx_vcpu_rr(vcpu,vadr);
+    vrr = vmx_vcpu_rr(v, vadr);
     if(vec == 1) type = ISIDE_TLB;
     else if(vec == 2) type = DSIDE_TLB;
     else panic("wrong vec\n");
 
-//    prepare_if_physical_mode(vcpu);
+//    prepare_if_physical_mode(v);
 
     if(data=vtlb_lookup_ex(vtlb, vrr.rid, vadr,type)){
-        if(vcpu->domain!=dom0&&type==DSIDE_TLB && __gpfn_is_io(vcpu->domain, 
data->ppn>>(PAGE_SHIFT-12))){
+        if(v->domain!=dom0&&type==DSIDE_TLB && __gpfn_is_io(v->domain, 
data->ppn>>(PAGE_SHIFT-12))){
             
vadr=(vadr&((1UL<<data->ps)-1))+(data->ppn>>(data->ps-12)<<data->ps);
-            emulate_io_inst(vcpu, vadr, data->ma);
+            emulate_io_inst(v, vadr, data->ma);
             return IA64_FAULT;
         }
        if ( data->ps != vrr.ps ) {
-               machine_tlb_insert(vcpu, data);
+               machine_tlb_insert(v, data);
        }
        else {
                thash_insert(vtlb->ts->vhpt,data,vadr);
            }
     }else if(type == DSIDE_TLB){
-        if(!vhpt_enabled(vcpu, vadr, misr.rs?RSE_REF:DATA_REF)){
+        if(!vhpt_enabled(v, vadr, misr.rs?RSE_REF:DATA_REF)){
             if(vpsr.ic){
-                vcpu_set_isr(vcpu, misr.val);
-                alt_dtlb(vcpu, vadr);
+                vcpu_set_isr(v, misr.val);
+                alt_dtlb(v, vadr);
                 return IA64_FAULT;
             } else{
                 if(misr.sp){
                     //TODO  lds emulation
                     panic("Don't support speculation load");
                 }else{
-                    nested_dtlb(vcpu);
+                    nested_dtlb(v);
                     return IA64_FAULT;
                 }
             }
         } else{
-            vmx_vcpu_thash(vcpu, vadr, &vhpt_adr);
-            vrr=vmx_vcpu_rr(vcpu,vhpt_adr);
+            vmx_vcpu_thash(v, vadr, &vhpt_adr);
+            vrr=vmx_vcpu_rr(v,vhpt_adr);
             data = vtlb_lookup_ex(vtlb, vrr.rid, vhpt_adr, DSIDE_TLB);
             if(data){
                 if(vpsr.ic){
-                    vcpu_set_isr(vcpu, misr.val);
-                    dtlb_fault(vcpu, vadr);
+                    vcpu_set_isr(v, misr.val);
+                    dtlb_fault(v, vadr);
                     return IA64_FAULT;
                 }else{
                     if(misr.sp){
                         //TODO  lds emulation
                         panic("Don't support speculation load");
                     }else{
-                        nested_dtlb(vcpu);
+                        nested_dtlb(v);
                         return IA64_FAULT;
                     }
                 }
             }else{
                 if(vpsr.ic){
-                    vcpu_set_isr(vcpu, misr.val);
-                    dvhpt_fault(vcpu, vadr);
+                    vcpu_set_isr(v, misr.val);
+                    dvhpt_fault(v, vadr);
                     return IA64_FAULT;
                 }else{
                     if(misr.sp){
                         //TODO  lds emulation
                         panic("Don't support speculation load");
                     }else{
-                        nested_dtlb(vcpu);
+                        nested_dtlb(v);
                         return IA64_FAULT;
                     }
                 }
             }
         }
     }else if(type == ISIDE_TLB){
-        if(!vhpt_enabled(vcpu, vadr, misr.rs?RSE_REF:DATA_REF)){
+        if(!vhpt_enabled(v, vadr, misr.rs?RSE_REF:DATA_REF)){
             if(!vpsr.ic){
                 misr.ni=1;
             }
-            vcpu_set_isr(vcpu, misr.val);
-            alt_itlb(vcpu, vadr);
+            vcpu_set_isr(v, misr.val);
+            alt_itlb(v, vadr);
             return IA64_FAULT;
         } else{
-            vmx_vcpu_thash(vcpu, vadr, &vhpt_adr);
-            vrr=vmx_vcpu_rr(vcpu,vhpt_adr);
+            vmx_vcpu_thash(v, vadr, &vhpt_adr);
+            vrr=vmx_vcpu_rr(v,vhpt_adr);
             data = vtlb_lookup_ex(vtlb, vrr.rid, vhpt_adr, DSIDE_TLB);
             if(data){
                 if(!vpsr.ic){
                     misr.ni=1;
                 }
-                vcpu_set_isr(vcpu, misr.val);
-                itlb_fault(vcpu, vadr);
+                vcpu_set_isr(v, misr.val);
+                itlb_fault(v, vadr);
                 return IA64_FAULT;
             }else{
                 if(!vpsr.ic){
                     misr.ni=1;
                 }
-                vcpu_set_isr(vcpu, misr.val);
-                ivhpt_fault(vcpu, vadr);
+                vcpu_set_isr(v, misr.val);
+                ivhpt_fault(v, vadr);
                 return IA64_FAULT;
             }
         }
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_vcpu.c
--- a/xen/arch/ia64/vmx/vmx_vcpu.c      Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_vcpu.c      Mon Sep 19 17:08:20 2005
@@ -308,6 +308,7 @@
     UINT64 ifs, psr;
     REGS *regs = vcpu_regs(vcpu);
     psr = VCPU(vcpu,ipsr);
+    vcpu_bsw1(vcpu);
     vmx_vcpu_set_psr(vcpu,psr);
     ifs=VCPU(vcpu,ifs);
     if((ifs>>63)&&(ifs<<1)){
@@ -326,7 +327,7 @@
     return VCPU(vcpu,vpsr);
 }
 
-
+#if 0
 IA64FAULT
 vmx_vcpu_get_bgr(VCPU *vcpu, unsigned int reg, UINT64 *val)
 {
@@ -378,8 +379,8 @@
     return IA64_NO_FAULT;
 }
 
-
-
+#endif
+#if 0
 IA64FAULT
 vmx_vcpu_get_gr(VCPU *vcpu, unsigned reg, UINT64 * val)
 {
@@ -387,9 +388,11 @@
     int nat;
     //TODO, Eddie
     if (!regs) return 0;
+#if 0
     if (reg >= 16 && reg < 32) {
         return vmx_vcpu_get_bgr(vcpu,reg,val);
     }
+#endif
     getreg(reg,val,&nat,regs);    // FIXME: handle NATs later
     if(nat){
         return IA64_FAULT;
@@ -410,13 +413,16 @@
 
     if (!regs) return IA64_ILLOP_FAULT;
     if (reg >= sof + 32) return IA64_ILLOP_FAULT;
+#if 0
     if ( reg >= 16 && reg < 32 ) {
         return vmx_vcpu_set_bgr(vcpu,reg, value, nat);
     }
+#endif
     setreg(reg,value,nat,regs);
     return IA64_NO_FAULT;
 }
 
+#endif
 
 IA64FAULT vmx_vcpu_reset_psr_sm(VCPU *vcpu, UINT64 imm24)
 {
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vmx_virt.c
--- a/xen/arch/ia64/vmx/vmx_virt.c      Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vmx_virt.c      Mon Sep 19 17:08:20 2005
@@ -161,13 +161,13 @@
 
 /*
     if ((fault = vmx_vcpu_get_psr(vcpu,&val)) == IA64_NO_FAULT)
-        return vmx_vcpu_set_gr(vcpu, tgt, val);
+        return vcpu_set_gr(vcpu, tgt, val);
     else return fault;
     */
     val = vmx_vcpu_get_psr(vcpu);
     val = (val & MASK(0, 32)) | (val & MASK(35, 2));
     last_guest_psr = val;
-    return vmx_vcpu_set_gr(vcpu, tgt, val, 0);
+    return vcpu_set_gr(vcpu, tgt, val, 0);
 }
 
 /**
@@ -177,7 +177,7 @@
 {
     UINT64 val;
     IA64FAULT fault;
-    if(vmx_vcpu_get_gr(vcpu, inst.M35.r2, &val) != IA64_NO_FAULT)
+    if(vcpu_get_gr_nat(vcpu, inst.M35.r2, &val) != IA64_NO_FAULT)
        panic(" get_psr nat bit fault\n");
 
        val = (val & MASK(0, 32)) | (VCPU(vcpu, vpsr) & MASK(32, 32));
@@ -229,7 +229,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-   return vmx_vcpu_bsw0(vcpu);
+   return vcpu_bsw0(vcpu);
 }
 
 IA64FAULT vmx_emul_bsw1(VCPU *vcpu, INST64 inst)
@@ -244,7 +244,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    return vmx_vcpu_bsw1(vcpu);
+    return vcpu_bsw1(vcpu);
 }
 
 IA64FAULT vmx_emul_cover(VCPU *vcpu, INST64 inst)
@@ -265,7 +265,7 @@
         privilege_op (vcpu);
         return IA64_FAULT;
     }
-    
if(vmx_vcpu_get_gr(vcpu,inst.M45.r3,&r3)||vmx_vcpu_get_gr(vcpu,inst.M45.r2,&r2)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M45.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M45.r2,&r2)){
 #ifdef  VMAL_NO_FAULT_CHECK
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -299,7 +299,7 @@
         return IA64_FAULT;
     }
 #endif // VMAL_NO_FAULT_CHECK
-    if(vmx_vcpu_get_gr(vcpu,inst.M47.r3,&r3)){
+    if(vcpu_get_gr_nat(vcpu,inst.M47.r3,&r3)){
 #ifdef  VMAL_NO_FAULT_CHECK
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -334,8 +334,8 @@
         return IA64_FAULT;
     }
 #endif // VMAL_NO_FAULT_CHECK
-    ret1 = vmx_vcpu_get_gr(vcpu,inst.M45.r3,pr3);
-    ret2 = vmx_vcpu_get_gr(vcpu,inst.M45.r2,pr2);
+    ret1 = vcpu_get_gr_nat(vcpu,inst.M45.r3,pr3);
+    ret2 = vcpu_get_gr_nat(vcpu,inst.M45.r2,pr2);
 #ifdef  VMAL_NO_FAULT_CHECK
     if ( ret1 != IA64_NO_FAULT || ret2 != IA64_NO_FAULT ) {
         set_isr_reg_nat_consumption(vcpu,0,0);
@@ -382,20 +382,20 @@
         return IA64_FAULT;
     }
 #endif //CHECK_FAULT
-    if(vmx_vcpu_get_gr(vcpu, inst.M46.r3, &r3)){
-#ifdef  CHECK_FAULT
-        vmx_vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
+    if(vcpu_get_gr_nat(vcpu, inst.M46.r3, &r3)){
+#ifdef  CHECK_FAULT
+        vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
         return IA64_NO_FAULT;
 #endif  //CHECK_FAULT
     }
 #ifdef  CHECK_FAULT
     if(unimplemented_gva(vcpu, r3)){
-        vmx_vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
+        vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
         return IA64_NO_FAULT;
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_thash(vcpu, r3, &r1);
-    vmx_vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
+    vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
     return(IA64_NO_FAULT);
 }
 
@@ -412,20 +412,20 @@
         return IA64_FAULT;
     }
 #endif //CHECK_FAULT
-    if(vmx_vcpu_get_gr(vcpu, inst.M46.r3, &r3)){
-#ifdef  CHECK_FAULT
-        vmx_vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
+    if(vcpu_get_gr_nat(vcpu, inst.M46.r3, &r3)){
+#ifdef  CHECK_FAULT
+        vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
         return IA64_NO_FAULT;
 #endif  //CHECK_FAULT
     }
 #ifdef  CHECK_FAULT
     if(unimplemented_gva(vcpu, r3)){
-        vmx_vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
+        vcpu_set_gr(vcpu, inst.M46.r1, 0, 1);
         return IA64_NO_FAULT;
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_ttag(vcpu, r3, &r1);
-    vmx_vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
+    vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
     return(IA64_NO_FAULT);
 }
 
@@ -448,7 +448,7 @@
         return IA64_FAULT;
     }
 #endif  //CHECK_FAULT
-    if(vmx_vcpu_get_gr(vcpu, inst.M46.r3, &r3)){
+    if(vcpu_get_gr_nat(vcpu, inst.M46.r3, &r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,1);
         rnat_comsumption(vcpu);
@@ -470,7 +470,7 @@
     if(vmx_vcpu_tpa(vcpu, r3, &r1)){
         return IA64_FAULT;
     }
-    vmx_vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
+    vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
     return(IA64_NO_FAULT);
 }
 
@@ -493,7 +493,7 @@
         return IA64_FAULT;
     }
 #endif
-    if(vmx_vcpu_get_gr(vcpu, inst.M46.r3, &r3)){
+    if(vcpu_get_gr_nat(vcpu, inst.M46.r3, &r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,1);
         rnat_comsumption(vcpu);
@@ -503,7 +503,7 @@
     if(vmx_vcpu_tak(vcpu, r3, &r1)){
         return IA64_FAULT;
     }
-    vmx_vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
+    vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
     return(IA64_NO_FAULT);
 }
 
@@ -531,7 +531,7 @@
         return IA64_FAULT;
     }
 #endif // VMAL_NO_FAULT_CHECK
-    
if(vmx_vcpu_get_gr(vcpu,inst.M45.r3,&slot)||vmx_vcpu_get_gr(vcpu,inst.M45.r2,&pte)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M45.r3,&slot)||vcpu_get_gr_nat(vcpu,inst.M45.r2,&pte)){
 #ifdef  VMAL_NO_FAULT_CHECK
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -588,7 +588,7 @@
         return IA64_FAULT;
     }
 #endif // VMAL_NO_FAULT_CHECK
-    
if(vmx_vcpu_get_gr(vcpu,inst.M45.r3,&slot)||vmx_vcpu_get_gr(vcpu,inst.M45.r2,&pte)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M45.r3,&slot)||vcpu_get_gr_nat(vcpu,inst.M45.r2,&pte)){
 #ifdef  VMAL_NO_FAULT_CHECK
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -648,7 +648,7 @@
         return IA64_FAULT;
     }
 #endif // VMAL_NO_FAULT_CHECK
-    ret1 = vmx_vcpu_get_gr(vcpu,inst.M45.r2,pte);
+    ret1 = vcpu_get_gr_nat(vcpu,inst.M45.r2,pte);
 #ifdef  VMAL_NO_FAULT_CHECK
     if( ret1 != IA64_NO_FAULT ){
         set_isr_reg_nat_consumption(vcpu,0,0);
@@ -734,7 +734,7 @@
     if(inst.M29.ar3!=44){
         panic("Can't support ar register other than itc");
     }
-    if(vmx_vcpu_get_gr(vcpu,inst.M29.r2,&r2)){
+    if(vcpu_get_gr_nat(vcpu,inst.M29.r2,&r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -778,7 +778,7 @@
 #endif // CHECK_FAULT
     u64 r1;
     vmx_vcpu_get_itc(vcpu,&r1);
-    vmx_vcpu_set_gr(vcpu,inst.M31.r1,r1,0);
+    vcpu_set_gr(vcpu,inst.M31.r1,r1,0);
     return IA64_NO_FAULT;
 }
 
@@ -800,7 +800,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    
if(vmx_vcpu_get_gr(vcpu,inst.M42.r3,&r3)||vmx_vcpu_get_gr(vcpu,inst.M42.r2,&r2)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M42.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M42.r2,&r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -823,7 +823,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    
if(vmx_vcpu_get_gr(vcpu,inst.M42.r3,&r3)||vmx_vcpu_get_gr(vcpu,inst.M42.r2,&r2)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M42.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M42.r2,&r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -846,7 +846,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    
if(vmx_vcpu_get_gr(vcpu,inst.M42.r3,&r3)||vmx_vcpu_get_gr(vcpu,inst.M42.r2,&r2)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M42.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M42.r2,&r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -869,7 +869,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    
if(vmx_vcpu_get_gr(vcpu,inst.M42.r3,&r3)||vmx_vcpu_get_gr(vcpu,inst.M42.r2,&r2)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M42.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M42.r2,&r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -892,7 +892,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    
if(vmx_vcpu_get_gr(vcpu,inst.M42.r3,&r3)||vmx_vcpu_get_gr(vcpu,inst.M42.r2,&r2)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M42.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M42.r2,&r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -915,7 +915,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    
if(vmx_vcpu_get_gr(vcpu,inst.M42.r3,&r3)||vmx_vcpu_get_gr(vcpu,inst.M42.r2,&r2)){
+    
if(vcpu_get_gr_nat(vcpu,inst.M42.r3,&r3)||vcpu_get_gr_nat(vcpu,inst.M42.r2,&r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -949,7 +949,7 @@
     }
 
 #endif //CHECK_FAULT
-     if(vmx_vcpu_get_gr(vcpu,inst.M43.r3,&r3)){
+     if(vcpu_get_gr_nat(vcpu,inst.M43.r3,&r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -963,7 +963,7 @@
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_get_rr(vcpu,r3,&r1);
-    return vmx_vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
+    return vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
 }
 
 IA64FAULT vmx_emul_mov_from_pkr(VCPU *vcpu, INST64 inst)
@@ -985,7 +985,7 @@
     }
 
 #endif //CHECK_FAULT
-     if(vmx_vcpu_get_gr(vcpu,inst.M43.r3,&r3)){
+     if(vcpu_get_gr_nat(vcpu,inst.M43.r3,&r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -1000,7 +1000,7 @@
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_get_pkr(vcpu,r3,&r1);
-    return vmx_vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
+    return vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
 }
 
 IA64FAULT vmx_emul_mov_from_dbr(VCPU *vcpu, INST64 inst)
@@ -1022,7 +1022,7 @@
     }
 
 #endif //CHECK_FAULT
-     if(vmx_vcpu_get_gr(vcpu,inst.M43.r3,&r3)){
+     if(vcpu_get_gr_nat(vcpu,inst.M43.r3,&r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -1037,7 +1037,7 @@
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_get_dbr(vcpu,r3,&r1);
-    return vmx_vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
+    return vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
 }
 
 IA64FAULT vmx_emul_mov_from_ibr(VCPU *vcpu, INST64 inst)
@@ -1059,7 +1059,7 @@
     }
 
 #endif //CHECK_FAULT
-     if(vmx_vcpu_get_gr(vcpu,inst.M43.r3,&r3)){
+     if(vcpu_get_gr_nat(vcpu,inst.M43.r3,&r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -1074,7 +1074,7 @@
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_get_ibr(vcpu,r3,&r1);
-    return vmx_vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
+    return vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
 }
 
 IA64FAULT vmx_emul_mov_from_pmc(VCPU *vcpu, INST64 inst)
@@ -1096,7 +1096,7 @@
     }
 
 #endif //CHECK_FAULT
-     if(vmx_vcpu_get_gr(vcpu,inst.M43.r3,&r3)){
+     if(vcpu_get_gr_nat(vcpu,inst.M43.r3,&r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -1111,7 +1111,7 @@
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_get_pmc(vcpu,r3,&r1);
-    return vmx_vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
+    return vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
 }
 
 IA64FAULT vmx_emul_mov_from_cpuid(VCPU *vcpu, INST64 inst)
@@ -1124,7 +1124,7 @@
         return IA64_FAULT;
     }
 #endif //CHECK_FAULT
-     if(vmx_vcpu_get_gr(vcpu,inst.M43.r3,&r3)){
+     if(vcpu_get_gr_nat(vcpu,inst.M43.r3,&r3)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -1139,7 +1139,7 @@
     }
 #endif  //CHECK_FAULT
     vmx_vcpu_get_cpuid(vcpu,r3,&r1);
-    return vmx_vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
+    return vcpu_set_gr(vcpu, inst.M43.r1, r1,0);
 }
 
 IA64FAULT vmx_emul_mov_to_cr(VCPU *vcpu, INST64 inst)
@@ -1160,7 +1160,7 @@
         return IA64_FAULT;
     }
 #endif // CHECK_FAULT
-    if(vmx_vcpu_get_gr(vcpu, inst.M32.r2, &r2)){
+    if(vcpu_get_gr_nat(vcpu, inst.M32.r2, &r2)){
 #ifdef  CHECK_FAULT
         set_isr_reg_nat_consumption(vcpu,0,0);
         rnat_comsumption(vcpu);
@@ -1214,11 +1214,11 @@
 
 #define cr_get(cr) \
     ((fault=vcpu_get_##cr(vcpu,&val))==IA64_NO_FAULT)?\
-        vmx_vcpu_set_gr(vcpu, tgt, val,0):fault;
+        vcpu_set_gr(vcpu, tgt, val,0):fault;
 
 #define vmx_cr_get(cr) \
     ((fault=vmx_vcpu_get_##cr(vcpu,&val))==IA64_NO_FAULT)?\
-        vmx_vcpu_set_gr(vcpu, tgt, val,0):fault;
+        vcpu_set_gr(vcpu, tgt, val,0):fault;
 
 IA64FAULT vmx_emul_mov_from_cr(VCPU *vcpu, INST64 inst)
 {
@@ -1260,9 +1260,9 @@
         case 64:return vmx_cr_get(lid);
         case 65:
                 vmx_vcpu_get_ivr(vcpu,&val);
-                return vmx_vcpu_set_gr(vcpu,tgt,val,0);
+                return vcpu_set_gr(vcpu,tgt,val,0);
         case 66:return vmx_cr_get(tpr);
-        case 67:return vmx_vcpu_set_gr(vcpu,tgt,0L,0);
+        case 67:return vcpu_set_gr(vcpu,tgt,0L,0);
         case 68:return vmx_cr_get(irr0);
         case 69:return vmx_cr_get(irr1);
         case 70:return vmx_cr_get(irr2);
@@ -1306,18 +1306,19 @@
  */
 
 void
-vmx_emulate(VCPU *vcpu, UINT64 cause, UINT64 opcode)
+vmx_emulate(VCPU *vcpu, REGS *regs)
 {
     IA64_BUNDLE bundle;
     int slot;
     IA64_SLOT_TYPE slot_type;
     IA64FAULT status;
     INST64 inst;
-    REGS * regs;
-    UINT64 iip;
-    regs = vcpu_regs(vcpu);
+    UINT64 iip, cause, opcode;
     iip = regs->cr_iip;
     IA64_PSR vpsr;
+    cause = VMX(vcpu,cause);
+    opcode = VMX(vcpu,opcode);
+
 /*
     if (privop_trace) {
         static long i = 400;
@@ -1356,7 +1357,6 @@
 #else
     inst.inst=opcode;
 #endif /* BYPASS_VMAL_OPCODE */
-    vcpu_set_regs(vcpu, regs);
     /*
      * Switch to actual virtual rid in rr0 and rr4,
      * which is required by some tlb related instructions.
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/vmx/vtlb.c  Mon Sep 19 17:08:20 2005
@@ -421,10 +421,11 @@
             *cch = *hash_table;
             *hash_table = vhpt_entry;
             hash_table->next = cch;
-        }
-
-        if(hash_table->tag==hash_table->next->tag)
-            while(1);
+            if(hash_table->tag==hash_table->next->tag)
+                while(1);
+
+        }
+
     }
     return /*hash_table*/;
 }
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/xen/domain.c        Mon Sep 19 17:08:20 2005
@@ -364,7 +364,8 @@
 #ifdef CONFIG_VTI
                vmx_init_all_rr(v);
                if (d == dom0)
-                   VCPU(v,vgr[12]) = dom_fw_setup(d,saved_command_line,256L);
+//                 VCPU(v,vgr[12]) = dom_fw_setup(d,saved_command_line,256L);
+                   regs->r28 = dom_fw_setup(d,saved_command_line,256L);
                /* Virtual processor context setup */
                VCPU(v, vpsr) = IA64_PSR_BN;
                VCPU(v, dcr) = 0;
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/xen/ivt.S
--- a/xen/arch/ia64/xen/ivt.S   Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/xen/ivt.S   Mon Sep 19 17:08:20 2005
@@ -1012,7 +1012,8 @@
        movl r14=ia64_leave_kernel
        ;;
        mov rp=r14
-       br.sptk.many ia64_prepare_handle_break
+//     br.sptk.many ia64_prepare_handle_break
+    br.call.sptk.many b6=ia64_handle_break
 END(dispatch_break_fault)
 #endif
 
@@ -1239,7 +1240,8 @@
        movl r14=ia64_leave_kernel
        ;;
        mov rp=r14
-       br.sptk.many ia64_prepare_handle_privop
+//     br.sptk.many ia64_prepare_handle_privop
+     br.call.sptk.many b6=ia64_handle_privop
 END(dispatch_privop_fault)
 #endif
 
@@ -1307,7 +1309,8 @@
        movl r14=ia64_leave_kernel
        ;;
        mov rp=r14
-       br.sptk.many ia64_prepare_handle_unaligned
+//     br.sptk.many ia64_prepare_handle_unaligned
+    br.call.sptk.many b6=ia64_handle_unaligned
 END(dispatch_unaligned_handler)
 
        .org ia64_ivt+0x4c00
@@ -1874,7 +1877,8 @@
        movl r14=ia64_leave_kernel
        ;;
        mov rp=r14
-       br.sptk.many ia64_prepare_handle_reflection
+//     br.sptk.many ia64_prepare_handle_reflection
+    br.call.sptk.many b6=ia64_handle_reflection
 END(dispatch_reflection)
 
 #define SAVE_MIN_COVER_DONE    DO_SAVE_MIN(,mov r30=cr.ifs,)
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/xen/privop.c
--- a/xen/arch/ia64/xen/privop.c        Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/xen/privop.c        Mon Sep 19 17:08:20 2005
@@ -143,7 +143,7 @@
                fault = vcpu_ttag(vcpu,vcpu_get_gr(vcpu,src-64),&padr);
        else fault = vcpu_tpa(vcpu,vcpu_get_gr(vcpu,src),&padr);
        if (fault == IA64_NO_FAULT)
-               return vcpu_set_gr(vcpu, inst.M46.r1, padr);
+               return vcpu_set_gr(vcpu, inst.M46.r1, padr, 0);
        else return fault;
 }
 
@@ -158,7 +158,7 @@
                fault = vcpu_thash(vcpu,vcpu_get_gr(vcpu,src-64),&key);
        else fault = vcpu_tak(vcpu,vcpu_get_gr(vcpu,src),&key);
        if (fault == IA64_NO_FAULT)
-               return vcpu_set_gr(vcpu, inst.M46.r1, key);
+               return vcpu_set_gr(vcpu, inst.M46.r1, key,0);
        else return fault;
 }
 
@@ -244,7 +244,7 @@
        if (inst.M29.r2 > 63 && inst.M29.ar3 < 8) { // privified mov from kr
                UINT64 val;
                if (vcpu_get_ar(vcpu,ar3,&val) != IA64_ILLOP_FAULT)
-                       return vcpu_set_gr(vcpu, inst.M29.r2-64, val);
+                       return vcpu_set_gr(vcpu, inst.M29.r2-64, val,0);
                else return IA64_ILLOP_FAULT;
        }
        else {
@@ -369,12 +369,12 @@
        if (inst.M43.r1 > 63) { // privified mov from cpuid
                fault = vcpu_get_cpuid(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
                if (fault == IA64_NO_FAULT)
-                       return vcpu_set_gr(vcpu, inst.M43.r1-64, val);
+                       return vcpu_set_gr(vcpu, inst.M43.r1-64, val, 0);
        }
        else {
                fault = vcpu_get_rr(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
                if (fault == IA64_NO_FAULT)
-                       return vcpu_set_gr(vcpu, inst.M43.r1, val);
+                       return vcpu_set_gr(vcpu, inst.M43.r1, val, 0);
        }
        return fault;
 }
@@ -386,7 +386,7 @@
        
        fault = vcpu_get_pkr(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
        if (fault == IA64_NO_FAULT)
-               return vcpu_set_gr(vcpu, inst.M43.r1, val);
+               return vcpu_set_gr(vcpu, inst.M43.r1, val, 0);
        else return fault;
 }
 
@@ -397,7 +397,7 @@
        
        fault = vcpu_get_dbr(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
        if (fault == IA64_NO_FAULT)
-               return vcpu_set_gr(vcpu, inst.M43.r1, val);
+               return vcpu_set_gr(vcpu, inst.M43.r1, val, 0);
        else return fault;
 }
 
@@ -408,7 +408,7 @@
        
        fault = vcpu_get_ibr(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
        if (fault == IA64_NO_FAULT)
-               return vcpu_set_gr(vcpu, inst.M43.r1, val);
+               return vcpu_set_gr(vcpu, inst.M43.r1, val, 0);
        else return fault;
 }
 
@@ -420,12 +420,12 @@
        if (inst.M43.r1 > 63) { // privified mov from pmd
                fault = vcpu_get_pmd(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
                if (fault == IA64_NO_FAULT)
-                       return vcpu_set_gr(vcpu, inst.M43.r1-64, val);
+                       return vcpu_set_gr(vcpu, inst.M43.r1-64, val, 0);
        }
        else {
                fault = vcpu_get_pmc(vcpu,vcpu_get_gr(vcpu,inst.M43.r3),&val);
                if (fault == IA64_NO_FAULT)
-                       return vcpu_set_gr(vcpu, inst.M43.r1, val);
+                       return vcpu_set_gr(vcpu, inst.M43.r1, val, 0);
        }
        return fault;
 }
@@ -434,7 +434,7 @@
 
 #define cr_get(cr) \
        ((fault = vcpu_get_##cr(vcpu,&val)) == IA64_NO_FAULT) ? \
-               vcpu_set_gr(vcpu, tgt, val) : fault;
+               vcpu_set_gr(vcpu, tgt, val, 0) : fault;
        
 IA64FAULT priv_mov_from_cr(VCPU *vcpu, INST64 inst)
 {
@@ -460,7 +460,7 @@
            case 64:return cr_get(lid);
            case 65:return cr_get(ivr);
            case 66:return cr_get(tpr);
-           case 67:return vcpu_set_gr(vcpu,tgt,0L);
+           case 67:return vcpu_set_gr(vcpu,tgt,0L,0);
            case 68:return cr_get(irr0);
            case 69:return cr_get(irr1);
            case 70:return cr_get(irr2);
@@ -482,7 +482,7 @@
        IA64FAULT fault;
 
        if ((fault = vcpu_get_psr(vcpu,&val)) == IA64_NO_FAULT)
-               return vcpu_set_gr(vcpu, tgt, val);
+               return vcpu_set_gr(vcpu, tgt, val, 0);
        else return fault;
 }
 
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c       Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/xen/process.c       Mon Sep 19 17:08:20 2005
@@ -548,7 +548,7 @@
                break;
            case SSC_GETCHAR:
                retval = ia64_ssc(0,0,0,0,ssc);
-               vcpu_set_gr(current,8,retval);
+               vcpu_set_gr(current,8,retval,0);
                break;
            case SSC_WAIT_COMPLETION:
                if (arg0) {     // metaphysical address
@@ -562,7 +562,7 @@
 /**/                   retval = 0;
                }
                else retval = -1L;
-               vcpu_set_gr(current,8,retval);
+               vcpu_set_gr(current,8,retval,0);
                break;
            case SSC_OPEN:
                arg1 = vcpu_get_gr(current,33); // access rights
@@ -572,7 +572,7 @@
                        retval = ia64_ssc(arg0,arg1,0,0,ssc);
                }
                else retval = -1L;
-               vcpu_set_gr(current,8,retval);
+               vcpu_set_gr(current,8,retval,0);
                break;
            case SSC_WRITE:
            case SSC_READ:
@@ -620,7 +620,7 @@
                        req->len = last_count;
                }
                else retval = -1L;
-               vcpu_set_gr(current,8,retval);
+               vcpu_set_gr(current,8,retval,0);
 //if (last_count >= PAGE_SIZE) printf("retval=%x\n",retval);
                break;
            case SSC_CONNECT_INTERRUPT:
@@ -631,7 +631,7 @@
                (void)ia64_ssc(arg0,arg1,arg2,arg3,ssc);
                break;
            case SSC_NETDEV_PROBE:
-               vcpu_set_gr(current,8,-1L);
+               vcpu_set_gr(current,8,-1L,0);
                break;
            default:
                printf("ia64_handle_break: bad ssc code %lx, iip=%p, b0=%p... 
spinning\n",ssc,regs->cr_iip,regs->b0);
@@ -763,18 +763,18 @@
     if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) {
        panic("PREEMPT happen in multicall\n"); // Not support yet
     } else {
-       vcpu_set_gr(vcpu, 2, op);
+       vcpu_set_gr(vcpu, 2, op, 0);
        for ( i = 0; i < nr_args; i++) {
            switch (i) {
-           case 0: vcpu_set_gr(vcpu, 14, va_arg(args, unsigned long));
+           case 0: vcpu_set_gr(vcpu, 14, va_arg(args, unsigned long), 0);
                    break;
-           case 1: vcpu_set_gr(vcpu, 15, va_arg(args, unsigned long));
+           case 1: vcpu_set_gr(vcpu, 15, va_arg(args, unsigned long), 0);
                    break;
-           case 2: vcpu_set_gr(vcpu, 16, va_arg(args, unsigned long));
+           case 2: vcpu_set_gr(vcpu, 16, va_arg(args, unsigned long), 0);
                    break;
-           case 3: vcpu_set_gr(vcpu, 17, va_arg(args, unsigned long));
+           case 3: vcpu_set_gr(vcpu, 17, va_arg(args, unsigned long), 0);
                    break;
-           case 4: vcpu_set_gr(vcpu, 18, va_arg(args, unsigned long));
+           case 4: vcpu_set_gr(vcpu, 18, va_arg(args, unsigned long), 0);
                    break;
            default: panic("Too many args for hypercall continuation\n");
                    break;
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Sun Sep 18 18:18:57 2005
+++ b/xen/arch/ia64/xen/vcpu.c  Mon Sep 19 17:08:20 2005
@@ -31,7 +31,8 @@
 //typedef struct domain VCPU;
 
 // this def for vcpu_regs won't work if kernel stack is present
-#define        vcpu_regs(vcpu) ((struct pt_regs *) vcpu->arch.regs)
+//#define      vcpu_regs(vcpu) ((struct pt_regs *) vcpu->arch.regs
+#define vcpu_regs(vcpu) (((struct pt_regs *) ((char *) (vcpu) + 
IA64_STK_OFFSET)) - 1)
 #define        PSCB(x,y)       VCPU(x,y)
 #define        PSCBX(x,y)      x->arch.y
 
@@ -70,18 +71,41 @@
 /**************************************************************************
  VCPU general register access routines
 **************************************************************************/
-
+#ifdef XEN
 UINT64
 vcpu_get_gr(VCPU *vcpu, unsigned reg)
 {
        REGS *regs = vcpu_regs(vcpu);
        UINT64 val;
-
        if (!reg) return 0;
        getreg(reg,&val,0,regs);        // FIXME: handle NATs later
        return val;
 }
-
+IA64FAULT
+vcpu_get_gr_nat(VCPU *vcpu, unsigned reg, UINT64 *val)
+{
+       REGS *regs = vcpu_regs(vcpu);
+    int nat;
+       getreg(reg,val,&nat,regs);      // FIXME: handle NATs later
+    if(nat)
+        return IA64_NAT_CONSUMPTION_VECTOR;
+       return 0;
+}
+
+// returns:
+//   IA64_ILLOP_FAULT if the register would cause an Illegal Operation fault
+//   IA64_NO_FAULT otherwise
+IA64FAULT
+vcpu_set_gr(VCPU *vcpu, unsigned reg, UINT64 value, int nat)
+{
+       REGS *regs = vcpu_regs(vcpu);
+       if (!reg) return IA64_ILLOP_FAULT;
+       long sof = (regs->cr_ifs) & 0x7f;
+       if (reg >= sof + 32) return IA64_ILLOP_FAULT;
+       setreg(reg,value,nat,regs);     // FIXME: handle NATs later
+       return IA64_NO_FAULT;
+}
+#else
 // returns:
 //   IA64_ILLOP_FAULT if the register would cause an Illegal Operation fault
 //   IA64_NO_FAULT otherwise
@@ -97,6 +121,7 @@
        return IA64_NO_FAULT;
 }
 
+#endif
 /**************************************************************************
  VCPU privileged application register access routines
 **************************************************************************/
@@ -586,11 +611,9 @@
                printf("vcpu_pend_interrupt: bad vector\n");
                return;
        }
-//#ifdef CONFIG_VTI
     if ( VMX_DOMAIN(vcpu) ) {
            set_bit(vector,VCPU(vcpu,irr));
     } else
-//#endif // CONFIG_VTI
     {
        /* if (!test_bit(vector,PSCB(vcpu,delivery_mask))) return; */
        if (test_bit(vector,PSCBX(vcpu,irr))) {
@@ -1360,7 +1383,7 @@
 
                        vcpu_thash(vcpu, address, &iha);
                        if (__copy_from_user(&pte, (void *)iha, sizeof(pte)) != 
0)
-                               return IA64_VHPT_TRANS_VECTOR;
+                               return IA64_VHPT_FAULT;
 
                        /* 
                         * Optimisation: this VHPT walker aborts on not-present 
pages
@@ -1496,6 +1519,18 @@
 /**************************************************************************
  VCPU banked general register access routines
 **************************************************************************/
+#define vcpu_bsw0_unat(i,b0unat,b1unat,runat,IA64_PT_REGS_R16_SLOT)     \
+do{     \
+    __asm__ __volatile__ (                      \
+        ";;extr.u %0 = %3,%6,16;;\n"            \
+        "dep %1 = %0, %1, 0, 16;;\n"            \
+        "st8 [%4] = %1\n"                       \
+        "extr.u %0 = %2, 16, 16;;\n"            \
+        "dep %3 = %0, %3, %6, 16;;\n"           \
+        "st8 [%5] = %3\n"                       \
+        ::"r"(i),"r"(*b1unat),"r"(*b0unat),"r"(*runat),"r"(b1unat), \
+        "r"(runat),"i"(IA64_PT_REGS_R16_SLOT):"memory");    \
+}while(0)
 
 IA64FAULT vcpu_bsw0(VCPU *vcpu)
 {
@@ -1504,14 +1539,40 @@
        unsigned long *r = &regs->r16;
        unsigned long *b0 = &PSCB(vcpu,bank0_regs[0]);
        unsigned long *b1 = &PSCB(vcpu,bank1_regs[0]);
-       int i;
-
-       if (PSCB(vcpu,banknum)) {
-               for (i = 0; i < 16; i++) { *b1++ = *r; *r++ = *b0++; }
-               PSCB(vcpu,banknum) = 0;
-       }
-       return (IA64_NO_FAULT);
-}
+       unsigned long *runat = &regs->eml_unat;
+       unsigned long *b0unat = &PSCB(vcpu,vbnat);
+       unsigned long *b1unat = &PSCB(vcpu,vnat);
+
+       unsigned long i;
+
+    if(VMX_DOMAIN(vcpu)){
+        if(VCPU(vcpu,vpsr)&IA64_PSR_BN){
+            for (i = 0; i < 16; i++) { *b1++ = *r; *r++ = *b0++; }
+            vcpu_bsw0_unat(i,b0unat,b1unat,runat,IA64_PT_REGS_R16_SLOT);
+            VCPU(vcpu,vpsr) &= ~IA64_PSR_BN;
+        }
+    }else{
+        if (PSCB(vcpu,banknum)) {
+            for (i = 0; i < 16; i++) { *b1++ = *r; *r++ = *b0++; }
+            vcpu_bsw0_unat(i,b0unat,b1unat,runat,IA64_PT_REGS_R16_SLOT);
+            PSCB(vcpu,banknum) = 0;
+        }
+    }
+       return (IA64_NO_FAULT);
+}
+
+#define vcpu_bsw1_unat(i,b0unat,b1unat,runat,IA64_PT_REGS_R16_SLOT)     \
+do{             \
+    __asm__ __volatile__ (      \
+        ";;extr.u %0 = %3,%6,16;;\n"                \
+        "dep %1 = %0, %1, 16, 16;;\n"               \
+        "st8 [%4] = %1\n"                           \
+        "extr.u %0 = %2, 0, 16;;\n"                 \
+        "dep %3 = %0, %3, %6, 16;;\n"               \
+        "st8 [%5] = %3\n"                           \
+        ::"r"(i),"r"(*b0unat),"r"(*b1unat),"r"(*runat),"r"(b0unat), \
+        "r"(runat),"i"(IA64_PT_REGS_R16_SLOT):"memory");            \
+}while(0)
 
 IA64FAULT vcpu_bsw1(VCPU *vcpu)
 {
@@ -1520,12 +1581,25 @@
        unsigned long *r = &regs->r16;
        unsigned long *b0 = &PSCB(vcpu,bank0_regs[0]);
        unsigned long *b1 = &PSCB(vcpu,bank1_regs[0]);
-       int i;
-
-       if (!PSCB(vcpu,banknum)) {
-               for (i = 0; i < 16; i++) { *b0++ = *r; *r++ = *b1++; }
-               PSCB(vcpu,banknum) = 1;
-       }
+       unsigned long *runat = &regs->eml_unat;
+       unsigned long *b0unat = &PSCB(vcpu,vbnat);
+       unsigned long *b1unat = &PSCB(vcpu,vnat);
+
+       unsigned long i;
+
+    if(VMX_DOMAIN(vcpu)){
+        if(!(VCPU(vcpu,vpsr)&IA64_PSR_BN)){
+            for (i = 0; i < 16; i++) { *b0++ = *r; *r++ = *b1++; }
+            vcpu_bsw1_unat(i,b0unat,b1unat,runat,IA64_PT_REGS_R16_SLOT);
+            VCPU(vcpu,vpsr) |= IA64_PSR_BN;
+        }
+    }else{
+        if (!PSCB(vcpu,banknum)) {
+            for (i = 0; i < 16; i++) { *b0++ = *r; *r++ = *b1++; }
+            vcpu_bsw1_unat(i,b0unat,b1unat,runat,IA64_PT_REGS_R16_SLOT);
+            PSCB(vcpu,banknum) = 1;
+        }
+    }
        return (IA64_NO_FAULT);
 }
 
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/asm-ia64/ia64_int.h
--- a/xen/include/asm-ia64/ia64_int.h   Sun Sep 18 18:18:57 2005
+++ b/xen/include/asm-ia64/ia64_int.h   Mon Sep 19 17:08:20 2005
@@ -33,14 +33,10 @@
 #define IA64_TAKEN_BRANCH_TRAP_VECTOR          0x5f00
 #define IA64_SINGLE_STEP_TRAP_VECTOR           0x6000
 
-#define        IA64_NO_FAULT           0x0001
+#define        IA64_NO_FAULT           0x0000
+#define IA64_FAULT                     0x0001
 #define        IA64_RFI_IN_PROGRESS    0x0002
 #define IA64_RETRY              0x0003
-#ifdef  CONFIG_VTI
-#undef  IA64_NO_FAULT
-#define        IA64_NO_FAULT           0x0000
-#define IA64_FAULT             0x0001
-#endif      //CONFIG_VTI
 #define IA64_FORCED_IFA         0x0004
 #define        IA64_ILLOP_FAULT        (IA64_GENEX_VECTOR | 0x00)
 #define        IA64_PRIVOP_FAULT       (IA64_GENEX_VECTOR | 0x10)
@@ -49,7 +45,7 @@
 #define        IA64_DISIST_FAULT       (IA64_GENEX_VECTOR | 0x40)
 #define        IA64_ILLDEP_FAULT       (IA64_GENEX_VECTOR | 0x80)
 #define        IA64_DTLB_FAULT         (IA64_DATA_TLB_VECTOR)
-
+#define IA64_VHPT_FAULT     (IA64_VHPT_TRANS_VECTOR | 0x10)
 #if !defined(__ASSEMBLY__)
 typedef unsigned long IA64FAULT;
 typedef unsigned long IA64INTVECTOR;
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/asm-ia64/privop.h
--- a/xen/include/asm-ia64/privop.h     Sun Sep 18 18:18:57 2005
+++ b/xen/include/asm-ia64/privop.h     Mon Sep 19 17:08:20 2005
@@ -2,11 +2,11 @@
 #define _XEN_IA64_PRIVOP_H
 
 #include <asm/ia64_int.h>
-#ifdef CONFIG_VTI
+//#ifdef CONFIG_VTI
 #include <asm/vmx_vcpu.h>
-#else //CONFIG_VTI
+//#else //CONFIG_VTI
 #include <asm/vcpu.h>
-#endif //CONFIG_VTI
+//#endif //CONFIG_VTI
 
 typedef unsigned long IA64_INST;
 
@@ -95,7 +95,7 @@
 typedef union U_INST64_M35 {
     IA64_INST inst;
     struct { unsigned long qp:6, :7, r2:7, :7, x6:6, x3:3, :1, major:4; };
-       
+   
 } INST64_M35;
 
 typedef union U_INST64_M36 {
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       Sun Sep 18 18:18:57 2005
+++ b/xen/include/asm-ia64/vcpu.h       Mon Sep 19 17:08:20 2005
@@ -35,7 +35,8 @@
 
 /* general registers */
 extern UINT64 vcpu_get_gr(VCPU *vcpu, unsigned reg);
-extern IA64FAULT vcpu_set_gr(VCPU *vcpu, unsigned reg, UINT64 value);
+extern IA64FAULT vcpu_get_gr_nat(VCPU *vcpu, unsigned reg, UINT64 *val);
+extern IA64FAULT vcpu_set_gr(VCPU *vcpu, unsigned reg, UINT64 value, int nat);
 /* application registers */
 extern IA64FAULT vcpu_set_ar(VCPU *vcpu, UINT64 reg, UINT64 val);
 /* psr */
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/asm-ia64/vmx_vcpu.h
--- a/xen/include/asm-ia64/vmx_vcpu.h   Sun Sep 18 18:18:57 2005
+++ b/xen/include/asm-ia64/vmx_vcpu.h   Mon Sep 19 17:08:20 2005
@@ -93,8 +93,10 @@
 extern UINT64 vmx_vcpu_get_psr(VCPU *vcpu);
 extern IA64FAULT vmx_vcpu_get_bgr(VCPU *vcpu, unsigned int reg, UINT64 *val);
 extern IA64FAULT vmx_vcpu_set_bgr(VCPU *vcpu, unsigned int reg, u64 val,int 
nat);
+#if 0
 extern IA64FAULT vmx_vcpu_get_gr(VCPU *vcpu, unsigned reg, UINT64 * val);
 extern IA64FAULT vmx_vcpu_set_gr(VCPU *vcpu, unsigned reg, u64 value, int nat);
+#endif
 extern IA64FAULT vmx_vcpu_reset_psr_sm(VCPU *vcpu, UINT64 imm24);
 extern IA64FAULT vmx_vcpu_set_psr_sm(VCPU *vcpu, UINT64 imm24);
 extern IA64FAULT vmx_vcpu_set_psr_l(VCPU *vcpu, UINT64 val);
@@ -453,6 +455,7 @@
 /**************************************************************************
  VCPU banked general register access routines
 **************************************************************************/
+#if 0
 static inline
 IA64FAULT vmx_vcpu_bsw0(VCPU *vcpu)
 {
@@ -467,6 +470,7 @@
     VCPU(vcpu,vpsr) |= IA64_PSR_BN;
     return (IA64_NO_FAULT);
 }
+#endif
 #if 0
 /* Another hash performance algorithm */
 #define redistribute_rid(rid)  (((rid) & ~0xffff) | (((rid) << 8) & 0xff00) | 
(((rid) >> 8) & 0xff))
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h    Sun Sep 18 18:18:57 2005
+++ b/xen/include/asm-ia64/vmx_vpd.h    Mon Sep 19 17:08:20 2005
@@ -68,6 +68,11 @@
        vtime_t     vtm;
     unsigned long   vrr[8];
     unsigned long   vkr[8];
+    unsigned long   cr_iipa;   /* for emulation */
+    unsigned long   cr_isr;    /* for emulation */
+    unsigned long   cause;
+    unsigned long   opcode;
+
 //    unsigned long   mrr5;
 //    unsigned long   mrr6;
 //    unsigned long   mrr7;
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/asm-ia64/xenkregs.h
--- a/xen/include/asm-ia64/xenkregs.h   Sun Sep 18 18:18:57 2005
+++ b/xen/include/asm-ia64/xenkregs.h   Mon Sep 19 17:08:20 2005
@@ -7,13 +7,6 @@
 #define IA64_TR_SHARED_INFO    3       /* dtr3: page shared with domain */
 #define        IA64_TR_VHPT            4       /* dtr4: vhpt */
 #define IA64_TR_ARCH_INFO      5
-
-#ifdef CONFIG_VTI
-#define IA64_TR_VHPT_IN_DOM    5       /* dtr5: Double mapping for vhpt table 
in domain space */
-#define IA64_TR_XEN_IN_DOM     6       /* itr6, dtr6: Double mapping for xen 
image in domain space */
-#define IA64_TR_RR7_SWITCH_STUB        7       /* dtr7: mapping for rr7 switch 
stub */
-#define IA64_TEMP_PHYSICAL     8       /* itr8, dtr8: temp mapping for guest 
physical memory 256M */
-#endif // CONFIG_VTI
 
 /* Processor status register bits: */
 #define IA64_PSR_VM_BIT                46
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/asm-ia64/xensystem.h
--- a/xen/include/asm-ia64/xensystem.h  Sun Sep 18 18:18:57 2005
+++ b/xen/include/asm-ia64/xensystem.h  Mon Sep 19 17:08:20 2005
@@ -16,10 +16,6 @@
 /* Define HV space hierarchy */
 #define XEN_VIRT_SPACE_LOW      0xe800000000000000
 #define XEN_VIRT_SPACE_HIGH     0xf800000000000000     
-/* This is address to mapping rr7 switch stub, in region 5 */
-#ifdef CONFIG_VTI
-#define XEN_RR7_SWITCH_STUB     0xb700000000000000
-#endif // CONFIG_VTI
 
 #define XEN_START_ADDR          0xf000000000000000
 #define HYPERVISOR_VIRT_START   0xf000000000000000
diff -r 8d133d172bfd -r 7f9acc83ffcd xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Sun Sep 18 18:18:57 2005
+++ b/xen/include/public/arch-ia64.h    Mon Sep 19 17:08:20 2005
@@ -94,38 +94,22 @@
        unsigned long r14;              /* scratch */
        unsigned long r2;               /* scratch */
        unsigned long r3;               /* scratch */
-
-    union {
-      struct {
-       /* The following registers are saved by SAVE_REST: */
-           unsigned long r16;          /* scratch */
-       unsigned long r17;              /* scratch */
-           unsigned long r18;          /* scratch */
-       unsigned long r19;              /* scratch */
-           unsigned long r20;          /* scratch */
-       unsigned long r21;              /* scratch */
-       unsigned long r22;              /* scratch */
-       unsigned long r23;              /* scratch */
-       unsigned long r24;              /* scratch */
-       unsigned long r25;              /* scratch */
-       unsigned long r26;              /* scratch */
-       unsigned long r27;              /* scratch */
-       unsigned long r28;              /* scratch */
-       unsigned long r29;              /* scratch */
-       unsigned long r30;              /* scratch */
-       unsigned long r31;              /* scratch */
-      };
-      struct {
-       unsigned long r4;               /* preserved */
-           unsigned long r5;           /* preserved */
-       unsigned long r6;               /* preserved */
-           unsigned long r7;           /* preserved */
-       unsigned long cr_iipa;   /* for emulation */
-           unsigned long cr_isr;    /* for emulation */
-       unsigned long eml_unat;    /* used for emulating instruction */
-           unsigned long rfi_pfs;     /* used for elulating rfi */
-      };
-    };
+    unsigned long r16;         /* scratch */
+       unsigned long r17;              /* scratch */
+    unsigned long r18;         /* scratch */
+       unsigned long r19;              /* scratch */
+    unsigned long r20;         /* scratch */
+       unsigned long r21;              /* scratch */
+       unsigned long r22;              /* scratch */
+       unsigned long r23;              /* scratch */
+       unsigned long r24;              /* scratch */
+       unsigned long r25;              /* scratch */
+       unsigned long r26;              /* scratch */
+       unsigned long r27;              /* scratch */
+       unsigned long r28;              /* scratch */
+       unsigned long r29;              /* scratch */
+       unsigned long r30;              /* scratch */
+       unsigned long r31;              /* scratch */
        unsigned long ar_ccv;           /* compare/exchange value (scratch) */
 
        /*
@@ -137,6 +121,13 @@
        struct pt_fpreg f9;             /* scratch */
        struct pt_fpreg f10;            /* scratch */
        struct pt_fpreg f11;            /* scratch */
+       unsigned long r4;               /* preserved */
+    unsigned long r5;          /* preserved */
+       unsigned long r6;               /* preserved */
+    unsigned long r7;          /* preserved */
+       unsigned long eml_unat;    /* used for emulating instruction */
+    unsigned long rfi_pfs;     /* used for elulating rfi */
+
 }cpu_user_regs_t;
 
 typedef union {

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] Merge vcpu phase 2, Xen patchbot -unstable <=