[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Transform double mapping to single mapping on vti domain.



# HG changeset patch
# User djm@xxxxxxxxxxxxxxx
# Node ID 10b1d30d3f66beac5a8275d108461da558c38d1d
# Parent  0c1f966af47e0c4718b3d2a0376a591dfa2ef7f4
Transform double mapping to single mapping on vti domain.
After this change I think it is possible to merge ivt.S file.
Signed-off-by Anthony Xu <anthony.xu@xxxxxxxxx>

diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/linux-xen/efi.c
--- a/xen/arch/ia64/linux-xen/efi.c     Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/linux-xen/efi.c     Thu Sep  8 15:18:40 2005
@@ -523,11 +523,21 @@
        return NULL;
 }
 
+
+#ifdef XEN
+void *pal_vaddr;
+#endif
+
 void
 efi_map_pal_code (void)
 {
+#ifdef XEN
+       u64 psr;
+       pal_vaddr = efi_get_pal_addr ();
+#else
        void *pal_vaddr = efi_get_pal_addr ();
        u64 psr;
+#endif
 
        if (!pal_vaddr)
                return;
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/linux-xen/unaligned.c
--- a/xen/arch/ia64/linux-xen/unaligned.c       Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/linux-xen/unaligned.c       Thu Sep  8 15:18:40 2005
@@ -296,7 +296,7 @@
 }
 
 #if defined(XEN) && defined(CONFIG_VTI)
-static void
+void
 set_rse_reg (struct pt_regs *regs, unsigned long r1, unsigned long val, 
unsigned long nat)
 {
        struct switch_stack *sw = (struct switch_stack *) regs - 1;
@@ -359,6 +359,57 @@
     }
     ia64_set_rsc(old_rsc);
 }
+
+
+static void
+get_rse_reg (struct pt_regs *regs, unsigned long r1, unsigned long *val, 
unsigned long *nat)
+{
+    struct switch_stack *sw = (struct switch_stack *) regs - 1;
+    unsigned long *bsp, *addr, *rnat_addr, *ubs_end, *bspstore;
+    unsigned long *kbs = (void *) current + IA64_RBS_OFFSET;
+    unsigned long rnats, nat_mask;
+    unsigned long on_kbs;
+    unsigned long old_rsc, new_rsc;
+    long sof = (regs->cr_ifs) & 0x7f;
+    long sor = 8 * ((regs->cr_ifs >> 14) & 0xf);
+    long rrb_gr = (regs->cr_ifs >> 18) & 0x7f;
+    long ridx = r1 - 32;
+
+    if (ridx >= sof) {
+        /* read of out-of-frame register returns an undefined value; 0 in our 
case.  */
+        DPRINT("ignoring read from r%lu; only %lu registers are allocated!\n", 
r1, sof);
+        panic("wrong stack register number");
+    }
+
+    if (ridx < sor)
+        ridx = rotate_reg(sor, rrb_gr, ridx);
+
+    old_rsc=ia64_get_rsc();
+    new_rsc=old_rsc&(~(0x3));
+    ia64_set_rsc(new_rsc);
+
+    bspstore = ia64_get_bspstore();
+    bsp =kbs + (regs->loadrs >> 19); //16+3;
+
+    addr = ia64_rse_skip_regs(bsp, -sof + ridx);
+    nat_mask = 1UL << ia64_rse_slot_num(addr);
+    rnat_addr = ia64_rse_rnat_addr(addr);
+
+    if(addr >= bspstore){
+
+        ia64_flushrs ();
+        ia64_mf ();
+        bspstore = ia64_get_bspstore();
+    }
+    *val=*addr;
+    if(bspstore < rnat_addr){
+        *nat=!!(ia64_get_rnat()&nat_mask);
+    }else{
+        *nat = !!((*rnat_addr)&nat_mask);
+    }
+    ia64_set_rsc(old_rsc);
+}
+
 #else // CONFIG_VTI
 static void
 set_rse_reg (struct pt_regs *regs, unsigned long r1, unsigned long val, int 
nat)
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/mm.c
--- a/xen/arch/ia64/vmx/mm.c    Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/mm.c    Thu Sep  8 15:18:40 2005
@@ -125,7 +125,7 @@
             entry.cl = DSIDE_TLB;
             rr = vmx_vcpu_rr(vcpu, req.ptr);
             entry.ps = rr.ps;
-            entry.key = redistribute_rid(rr.rid);
+            entry.key = rr.rid;
             entry.rid = rr.rid;
             entry.vadr = PAGEALIGN(req.ptr,entry.ps);
             sections.tr = 1;
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vlsapic.c       Thu Sep  8 15:18:40 2005
@@ -181,7 +181,7 @@
  */
 /* Interrupt must be disabled at this point */
 
-extern u64 tick_to_ns(u64 tick);
+extern u64 cycle_to_ns(u64 cyle);
 #define TIMER_SLOP (50*1000) /* ns */  /* copy from ac_timer.c */
 void vtm_interruption_update(VCPU *vcpu, vtime_t* vtm)
 {
@@ -212,7 +212,7 @@
     }
     /* Both last_itc & cur_itc < itm, wait for fire condition */
     else {
-        expires = NOW() + tick_to_ns(0-diff_now) + TIMER_SLOP;
+        expires = NOW() + cycle_to_ns(0-diff_now) + TIMER_SLOP;
         set_ac_timer(&vtm->vtm_timer, expires);
     }
     local_irq_restore(spsr);
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmmu.c  Thu Sep  8 15:18:40 2005
@@ -91,6 +91,10 @@
 
 void recycle_message(thash_cb_t *hcb, u64 para)
 {
+    if(hcb->ht == THASH_VHPT)
+    {
+        printk("ERROR : vhpt recycle happenning!!!\n");
+    }
     printk("hcb=%p recycled with %lx\n",hcb,para);
 }
 
@@ -237,8 +241,12 @@
  */
 void machine_tlb_insert(struct vcpu *d, thash_data_t *tlb)
 {
-    u64     saved_itir, saved_ifa, saved_rr;
+#if 0
+    u64     saved_itir, saved_ifa;
+#endif
+    u64      saved_rr;
     u64     pages;
+    u64     psr;
     thash_data_t    mtlb;
     ia64_rr vrr;
     unsigned int    cl = tlb->cl;
@@ -253,12 +261,12 @@
     if (mtlb.ppn == INVALID_MFN)
     panic("Machine tlb insert with invalid mfn number.\n");
 
-    __asm __volatile("rsm   psr.ic|psr.i;; srlz.i" );
-    
+    psr = ia64_clear_ic();
+#if 0
     saved_itir = ia64_getreg(_IA64_REG_CR_ITIR);
     saved_ifa = ia64_getreg(_IA64_REG_CR_IFA);
+#endif
     saved_rr = ia64_get_rr(mtlb.ifa);
-
     ia64_setreg(_IA64_REG_CR_ITIR, mtlb.itir);
     ia64_setreg(_IA64_REG_CR_IFA, mtlb.ifa);
     /* Only access memory stack which is mapped by TR,
@@ -268,18 +276,22 @@
     ia64_srlz_d();
     if ( cl == ISIDE_TLB ) {
         ia64_itci(mtlb.page_flags);
-    ia64_srlz_i();
+        ia64_srlz_i();
     }
     else {
         ia64_itcd(mtlb.page_flags);
-    ia64_srlz_d();
+        ia64_srlz_d();
     }
     ia64_set_rr(mtlb.ifa,saved_rr);
     ia64_srlz_d();
+#if 0
     ia64_setreg(_IA64_REG_CR_IFA, saved_ifa);
     ia64_setreg(_IA64_REG_CR_ITIR, saved_itir);
-    __asm __volatile("ssm   psr.ic|psr.i;; srlz.i" );
-}
+#endif
+    ia64_set_psr(psr);
+    ia64_srlz_i();
+}
+
 
 u64 machine_thash(PTA pta, u64 va, u64 rid, u64 ps)
 {
@@ -289,7 +301,6 @@
     struct vcpu *v = current;
     ia64_rr vrr;
 
-    
     saved_pta = ia64_getreg(_IA64_REG_CR_PTA);
     saved_rr0 = ia64_get_rr(0);
     vrr.rrval = saved_rr0;
@@ -308,7 +319,7 @@
 
     ia64_set_rr(0, saved_rr0);
     ia64_srlz_d();
-    local_irq_restore(psr);
+    ia64_set_psr(psr);
     return hash_addr;
 }
 
@@ -320,7 +331,7 @@
     struct vcpu *v = current;
     ia64_rr vrr;
 
-    // TODO: Set to enforce lazy mode    
+    // TODO: Set to enforce lazy mode
     saved_pta = ia64_getreg(_IA64_REG_CR_PTA);
     saved_rr0 = ia64_get_rr(0);
     vrr.rrval = saved_rr0;
@@ -341,7 +352,6 @@
     local_irq_restore(psr);
     return tag;
 }
-
 /*
  *  Purge machine tlb.
  *  INPUT
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmx_entry.S
--- a/xen/arch/ia64/vmx/vmx_entry.S     Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmx_entry.S     Thu Sep  8 15:18:40 2005
@@ -33,7 +33,7 @@
 #include <asm/processor.h>
 #include <asm/thread_info.h>
 #include <asm/unistd.h>
-
+#include <asm/vhpt.h>
 #include "vmx_minstate.h"
 
 /*
@@ -401,8 +401,9 @@
     mov b0=r16
     br.cond.sptk b0         // call the service
     ;;
+switch_rr7:
+#ifdef XEN_DBL_MAPPING
 // switch rr7 and rr5
-switch_rr7:
     adds r24=SWITCH_MRR5_OFFSET, r21
     adds r26=SWITCH_MRR6_OFFSET, r21
     adds r16=SWITCH_MRR7_OFFSET ,r21
@@ -428,6 +429,7 @@
     ;;
     srlz.i
     ;;
+#endif
 // fall through
 GLOBAL_ENTRY(ia64_vmm_entry)
 /*
@@ -470,6 +472,7 @@
        ;;
 END(vmx_dorfirfi)
 
+#ifdef XEN_DBL_MAPPING  /* will be removed */
 
 #define VMX_PURGE_RR7  0
 #define VMX_INSERT_RR7 1
@@ -609,3 +612,180 @@
     br.sptk rp
 END(vmx_switch_rr7)
     .align PAGE_SIZE
+
+#else
+/*
+ * in0: new rr7
+ * in1: virtual address of shared_info
+ * in2: virtual address of shared_arch_info (VPD)
+ * in3: virtual address of guest_vhpt
+ * in4: virtual address of pal code segment
+ * r8: will contain old rid value
+ */
+
+
+#define PSR_BITS_TO_CLEAR                      \
+   (IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | IA64_PSR_DB |IA64_PSR_RT |     \
+    IA64_PSR_DD | IA64_PSR_SS | IA64_PSR_RI | IA64_PSR_ED |    \
+    IA64_PSR_DFL | IA64_PSR_DFH)
+#define PSR_BITS_TO_SET    IA64_PSR_BN
+
+//extern void vmx_switch_rr7(unsigned long rid,void *shared_info, void 
*shared_arch_info, void *guest_vhpt, void * pal_vaddr );
+
+GLOBAL_ENTRY(vmx_switch_rr7)
+   // not sure this unwind statement is correct...
+   .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(1)
+   alloc loc1 = ar.pfs, 5, 9, 0, 0
+1: {
+     mov r28  = in0        // copy procedure index
+     mov r8   = ip         // save ip to compute branch
+     mov loc0 = rp         // save rp
+    };;
+    .body
+    movl loc2=PERCPU_ADDR
+    ;;
+    tpa loc2 = loc2         // get physical address of per cpu date
+    ;;
+    dep loc3 = 0,in1,60,4          // get physical address of shared_info
+    dep loc4 = 0,in2,60,4          // get physical address of shared_arch_info
+    dep loc5 = 0,in3,60,4          // get physical address of guest_vhpt
+    dep loc6 = 0,in4,60,4          // get physical address of pal code
+    ;;
+    mov loc7 = psr          // save psr
+    ;;
+    mov loc8 = ar.rsc           // save RSE configuration
+    ;;
+    mov ar.rsc = 0          // put RSE in enforced lazy, LE mode
+    movl r16=PSR_BITS_TO_CLEAR
+    movl r17=PSR_BITS_TO_SET
+    ;;
+    or loc7 = loc7,r17      // add in psr the bits to set
+    ;;
+    andcm r16=loc7,r16      // removes bits to clear from psr
+    br.call.sptk.many rp=ia64_switch_mode_phys
+1:
+   // now in physical mode with psr.i/ic off so do rr7 switch
+    dep r16=-1,r0,61,3
+    ;;
+    mov rr[r16]=in0
+    srlz.d
+    ;;
+    rsm 0x6000
+    ;;
+    srlz.d
+
+    // re-pin mappings for kernel text and data
+    mov r18=KERNEL_TR_PAGE_SHIFT<<2
+    movl r17=KERNEL_START
+    ;;
+    ptr.i   r17,r18
+    ptr.d   r17,r18
+    ;;
+    mov cr.itir=r18
+    mov cr.ifa=r17
+    mov r16=IA64_TR_KERNEL
+    //mov r3=ip
+    movl r25 = PAGE_KERNEL
+    ;;
+    dep r2=0,r3,0,KERNEL_TR_PAGE_SHIFT
+    ;;
+    or r18=r2,r25
+    ;;
+   srlz.i
+   ;;
+   itr.i itr[r16]=r18
+   ;;
+   itr.d dtr[r16]=r18
+   ;;
+
+   // re-pin mappings for per-cpu data
+
+   movl r22 = PERCPU_ADDR
+   ;;
+   mov r24=IA64_TR_PERCPU_DATA
+   or loc2 = r25,loc2          // construct PA | page properties
+   mov r23=PERCPU_PAGE_SHIFT<<2
+   ;;
+   ptr.d   r22,r23
+   ;;
+   mov cr.itir=r23
+   mov cr.ifa=r22
+   ;;
+   itr.d dtr[r24]=loc2     // wire in new mapping...
+   ;;
+
+
+#if    0
+   // re-pin mappings for shared_info
+
+   mov r24=IA64_TR_SHARED_INFO
+   movl r25=__pgprot(__DIRTY_BITS | _PAGE_PL_2 | _PAGE_AR_RW)
+   ;;
+   or loc3 = r25,loc3          // construct PA | page properties
+   mov r23 = PAGE_SHIFT<<2
+   ;;
+   ptr.d   in1,r23
+   ;;
+   mov cr.itir=r23
+   mov cr.ifa=in1
+   ;;
+   itr.d dtr[r24]=loc3     // wire in new mapping...
+   ;;
+   // re-pin mappings for shared_arch_info
+
+   mov r24=IA64_TR_ARCH_INFO
+   or loc4 = r25,loc4          // construct PA | page properties
+   mov r23 = PAGE_SHIFT<<2
+   ;;
+   ptr.d   in2,r23
+   ;;
+   mov cr.itir=r23
+   mov cr.ifa=in2
+   ;;
+   itr.d dtr[r24]=loc4     // wire in new mapping...
+   ;;
+#endif
+
+
+   // re-pin mappings for guest_vhpt
+
+   mov r24=IA64_TR_VHPT
+   movl r25=PAGE_KERNEL
+   ;;
+   or loc5 = r25,loc5          // construct PA | page properties
+   mov r23 = VCPU_TLB_SHIFT<<2
+   ;;
+   ptr.d   in3,r23
+   ;;
+   mov cr.itir=r23
+   mov cr.ifa=in3
+   ;;
+   itr.d dtr[r24]=loc5     // wire in new mapping...
+   ;;
+
+   // re-pin mappings for PAL code section
+
+   mov r24=IA64_TR_PALCODE
+   or loc6 = r25,loc6          // construct PA | page properties
+   mov r23 = IA64_GRANULE_SHIFT<<2
+   ;;
+   ptr.i   in4,r23
+   ;;
+   mov cr.itir=r23
+   mov cr.ifa=in4
+   ;;
+   itr.i itr[r24]=loc6     // wire in new mapping...
+   ;;
+
+   // done, switch back to virtual and return
+   mov r16=loc7            // r16= original psr
+   br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
+   mov ar.pfs = loc1
+   mov rp = loc0
+   ;;
+   mov ar.rsc=loc8         // restore RSE configuration
+   srlz.d              // seralize restoration of psr.l
+   br.ret.sptk.many rp
+END(vmx_switch_rr7)
+#endif
+
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmx_irq_ia64.c
--- a/xen/arch/ia64/vmx/vmx_irq_ia64.c  Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmx_irq_ia64.c  Thu Sep  8 15:18:40 2005
@@ -23,6 +23,12 @@
 #include <asm/machvec.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
+
+#ifdef CONFIG_SMP
+#   define IS_RESCHEDULE(vec)   (vec == IA64_IPI_RESCHEDULE)
+#else
+#   define IS_RESCHEDULE(vec)   (0)
+#endif
 
 #ifdef CONFIG_PERFMON
 # include <asm/perfmon.h>
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmx_ivt.S
--- a/xen/arch/ia64/vmx/vmx_ivt.S       Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmx_ivt.S       Thu Sep  8 15:18:40 2005
@@ -118,10 +118,12 @@
     mov r29=cr.ipsr;
     ;;
     tbit.z p6,p7=r29,IA64_PSR_VM_BIT;
-(p6) br.sptk vmx_fault_1
+(p6) br.sptk vmx_alt_itlb_miss_1
+//(p6) br.sptk vmx_fault_1
     mov r16 = cr.ifa
     ;;
     thash r17 = r16
+    ;;
     ttag r20 = r16
     ;;
 vmx_itlb_loop:
@@ -180,10 +182,12 @@
     mov r29=cr.ipsr;
     ;;
     tbit.z p6,p7=r29,IA64_PSR_VM_BIT;
-(p6)br.sptk vmx_fault_2
+    (p6)br.sptk vmx_alt_dtlb_miss_1
+//(p6)br.sptk vmx_fault_2
     mov r16 = cr.ifa
     ;;
     thash r17 = r16
+    ;;
     ttag r20 = r16
     ;;
 vmx_dtlb_loop:
@@ -243,6 +247,7 @@
     ;;
     tbit.z p6,p7=r29,IA64_PSR_VM_BIT;
 (p7)br.sptk vmx_fault_3
+vmx_alt_itlb_miss_1:
        mov r16=cr.ifa          // get address that caused the TLB miss
        movl r17=PAGE_KERNEL
        mov r24=cr.ipsr
@@ -272,6 +277,7 @@
     ;;
     tbit.z p6,p7=r29,IA64_PSR_VM_BIT;
 (p7)br.sptk vmx_fault_4
+vmx_alt_dtlb_miss_1:
        mov r16=cr.ifa          // get address that caused the TLB miss
        movl r17=PAGE_KERNEL
        mov r20=cr.isr
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmx_minstate.h
--- a/xen/arch/ia64/vmx/vmx_minstate.h  Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmx_minstate.h  Thu Sep  8 15:18:40 2005
@@ -128,21 +128,31 @@
  * Note that psr.ic is NOT turned on by this macro.  This is so that
  * we can pass interruption state as arguments to a handler.
  */
-#define VMX_DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA)                           \
+#ifdef XEN_DBL_MAPPING
+#define SAVE_MIN_CHANGE_RR  \
 /*  switch rr7 */       \
     movl r16=((ia64_rid(IA64_REGION_ID_KERNEL, (7<<61)) << 8) | 
(IA64_GRANULE_SHIFT << 2)); \
     movl r17=(7<<61);        \
     movl r20=((ia64_rid(IA64_REGION_ID_KERNEL, (6<<61)) << 8) | 
(IA64_GRANULE_SHIFT << 2)); \
     movl r22=(6<<61);        \
-    movl r18=((ia64_rid(IA64_REGION_ID_KERNEL, (5<<61)) << 8) | (PAGE_SHIFT << 
2) | 1);                \
-    movl r23=(5<<61);  \
+    movl r18=((ia64_rid(IA64_REGION_ID_KERNEL, (5<<61)) << 8) | (PAGE_SHIFT << 
2) | 1);     \
+    movl r23=(5<<61);   \
     ;;              \
     mov rr[r17]=r16;             \
-    mov rr[r22]=r20;            \
-    mov rr[r23]=r18;            \
+    mov rr[r22]=r20;         \
+    mov rr[r23]=r18;         \
     ;;      \
     srlz.i;      \
-    ;;  \
+    ;;
+
+#else
+
+#define SAVE_MIN_CHANGE_RR
+
+#endif
+
+#define VMX_DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA)                           \
+    SAVE_MIN_CHANGE_RR;      \
     VMX_MINSTATE_GET_CURRENT(r16);  /* M (or M;;I) */                   \
     mov r27=ar.rsc;         /* M */                         \
     mov r20=r1;         /* A */                         \
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmx_phy_mode.c
--- a/xen/arch/ia64/vmx/vmx_phy_mode.c  Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmx_phy_mode.c  Thu Sep  8 15:18:40 2005
@@ -27,7 +27,6 @@
 #include <asm/vmx_phy_mode.h>
 #include <xen/sched.h>
 #include <asm/pgtable.h>
-
 
 int valid_mm_mode[8] = {
     GUEST_PHYS, /* (it, dt, rt) -> (0, 0, 0) */
@@ -215,13 +214,13 @@
 vmx_init_all_rr(VCPU *vcpu)
 {
        VMX(vcpu,vrr[VRN0]) = 0x38;
-       VMX(vcpu,vrr[VRN1]) = 0x38;
-       VMX(vcpu,vrr[VRN2]) = 0x38;
-       VMX(vcpu,vrr[VRN3]) = 0x38;
-       VMX(vcpu,vrr[VRN4]) = 0x38;
-       VMX(vcpu,vrr[VRN5]) = 0x38;
-       VMX(vcpu,vrr[VRN6]) = 0x60;
-       VMX(vcpu,vrr[VRN7]) = 0x60;
+       VMX(vcpu,vrr[VRN1]) = 0x138;
+       VMX(vcpu,vrr[VRN2]) = 0x238;
+       VMX(vcpu,vrr[VRN3]) = 0x338;
+       VMX(vcpu,vrr[VRN4]) = 0x438;
+       VMX(vcpu,vrr[VRN5]) = 0x538;
+       VMX(vcpu,vrr[VRN6]) = 0x660;
+       VMX(vcpu,vrr[VRN7]) = 0x760;
 
        VMX(vcpu,mrr5) = vmx_vrrtomrr(vcpu, 0x38);
        VMX(vcpu,mrr6) = vmx_vrrtomrr(vcpu, 0x60);
@@ -234,10 +233,8 @@
        unsigned long psr;
        ia64_rr phy_rr;
 
-       psr = ia64_clear_ic();
-
-       phy_rr.ps = EMUL_PHY_PAGE_SHIFT; 
-       phy_rr.ve = 1;
+       local_irq_save(psr);
+
 
        /* WARNING: not allow co-exist of both virtual mode and physical
         * mode in same region
@@ -245,9 +242,15 @@
        if (is_physical_mode(vcpu)) {
                if (vcpu->arch.mode_flags & GUEST_PHY_EMUL)
                        panic("Unexpected domain switch in phy emul\n");
-               phy_rr.rid = vcpu->domain->arch.metaphysical_rr0;
+               phy_rr.rrval = vcpu->domain->arch.metaphysical_rr0;
+       phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+       phy_rr.ve = 1;
+
                ia64_set_rr((VRN0 << VRN_SHIFT), phy_rr.rrval);
-               phy_rr.rid = vcpu->domain->arch.metaphysical_rr4;
+               phy_rr.rrval = vcpu->domain->arch.metaphysical_rr4;
+       phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+           phy_rr.ve = 1;
+
                ia64_set_rr((VRN4 << VRN_SHIFT), phy_rr.rrval);
        } else {
                ia64_set_rr((VRN0 << VRN_SHIFT),
@@ -265,6 +268,18 @@
        ia64_set_rr((VRN3 << VRN_SHIFT),
                     vmx_vrrtomrr(vcpu, VMX(vcpu, vrr[VRN3])));
 #endif
+#ifndef XEN_DBL_MAPPING
+    extern void * pal_vaddr;
+    ia64_set_rr((VRN5 << VRN_SHIFT),
+            vmx_vrrtomrr(vcpu, VMX(vcpu, vrr[VRN5])));
+    ia64_set_rr((VRN6 << VRN_SHIFT),
+            vmx_vrrtomrr(vcpu, VMX(vcpu, vrr[VRN6])));
+    vmx_switch_rr7(vmx_vrrtomrr(vcpu,VMX(vcpu, vrr[VRN7])),(void 
*)vcpu->domain->shared_info,
+                (void *)vcpu->vcpu_info->arch.privregs,
+                ( void *)vcpu->arch.vtlb->ts->vhpt->hash, pal_vaddr );
+    ia64_set_pta(vcpu->arch.arch_vmx.mpta);
+#endif
+
        ia64_srlz_d();
        ia64_set_psr(psr);
     ia64_srlz_i();
@@ -276,15 +291,17 @@
     UINT64 psr;
     ia64_rr phy_rr;
 
-    phy_rr.ps = EMUL_PHY_PAGE_SHIFT; 
-    phy_rr.ve = 1;
 
     /* Save original virtual mode rr[0] and rr[4] */
     psr=ia64_clear_ic();
-    phy_rr.rid = vcpu->domain->arch.metaphysical_rr0;
+    phy_rr.rrval = vcpu->domain->arch.metaphysical_rr0;
+    phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+    phy_rr.ve = 1;
     ia64_set_rr(VRN0<<VRN_SHIFT, phy_rr.rrval);
     ia64_srlz_d();
-    phy_rr.rid = vcpu->domain->arch.metaphysical_rr4;
+    phy_rr.rrval = vcpu->domain->arch.metaphysical_rr4;
+    phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+    phy_rr.ve = 1;
     ia64_set_rr(VRN4<<VRN_SHIFT, phy_rr.rrval);
     ia64_srlz_d();
 
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmx_process.c   Thu Sep  8 15:18:40 2005
@@ -41,7 +41,7 @@
 #include <asm/regionreg.h>
 #include <asm/privop.h>
 #include <asm/ia64_int.h>
-#include <asm/hpsim_ssc.h>
+//#include <asm/hpsim_ssc.h>
 #include <asm/dom_fw.h>
 #include <asm/vmx_vcpu.h>
 #include <asm/kregs.h>
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vmx_vcpu.c
--- a/xen/arch/ia64/vmx/vmx_vcpu.c      Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vmx_vcpu.c      Thu Sep  8 15:18:40 2005
@@ -215,6 +215,7 @@
 {
     ia64_rr oldrr,newrr;
     thash_cb_t *hcb;
+    extern void * pal_vaddr;
     oldrr=vmx_vcpu_rr(vcpu,reg);
     newrr.rrval=val;
 #if 1
@@ -224,7 +225,9 @@
     }
 #endif
     VMX(vcpu,vrr[reg>>61]) = val;
+
     switch((u64)(reg>>61)) {
+#ifdef XEN_DBL_MAPPING
     case VRN5:
         VMX(vcpu,mrr5)=vmx_vrrtomrr(vcpu,val);
         break;
@@ -234,12 +237,17 @@
     case VRN7:
         VMX(vcpu,mrr7)=vmx_vrrtomrr(vcpu,val);
         /* Change double mapping for this domain */
-#ifdef XEN_DBL_MAPPING
         vmx_change_double_mapping(vcpu,
                       vmx_vrrtomrr(vcpu,oldrr.rrval),
                       vmx_vrrtomrr(vcpu,newrr.rrval));
+        break;
+#else
+    case VRN7:
+       vmx_switch_rr7(vmx_vrrtomrr(vcpu,val),vcpu->domain->shared_info,
+        (void *)vcpu->vcpu_info->arch.privregs,
+       ( void *)vcpu->arch.vtlb->ts->vhpt->hash, pal_vaddr );
+       break;
 #endif
-        break;
     default:
         ia64_set_rr(reg,vmx_vrrtomrr(vcpu,val));
         break;
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/vmx/vtlb.c
--- a/xen/arch/ia64/vmx/vtlb.c  Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/vmx/vtlb.c  Thu Sep  8 15:18:40 2005
@@ -343,7 +343,7 @@
                 hcb->recycle_notifier(hcb,(u64)entry);
         }
         thash_purge_all(hcb);
-        cch = cch_alloc(hcb);
+//        cch = cch_alloc(hcb);
     }
     return cch;
 }
@@ -364,7 +364,7 @@
     ia64_rr vrr;
     u64 gppn;
     u64 ppns, ppne;
-    
+
     hash_table = (hcb->hash_func)(hcb->pta,
                         va, entry->rid, entry->ps);
     if( INVALID_ENTRY(hcb, hash_table) ) {
@@ -374,10 +374,14 @@
     else {
         // TODO: Add collision chain length limitation.
         cch = __alloc_chain(hcb,entry);
-        
-        *cch = *hash_table;
-        *hash_table = *entry;
-        hash_table->next = cch;
+        if(cch == NULL){
+            *hash_table = *entry;
+            hash_table->next = 0;
+        }else{
+            *cch = *hash_table;
+            *hash_table = *entry;
+            hash_table->next = cch;
+        }
     }
     if(hcb->vcpu->domain->domain_id==0){
        thash_insert(hcb->ts->vhpt, entry, va);
@@ -396,26 +400,29 @@
 
 static void vhpt_insert(thash_cb_t *hcb, thash_data_t *entry, u64 va)
 {
-    thash_data_t    *hash_table, *cch;
+    thash_data_t   vhpt_entry, *hash_table, *cch;
     ia64_rr vrr;
-    
+    if ( !__tlb_to_vhpt(hcb, entry, va, &vhpt_entry) ) {
+        panic("Can't convert to machine VHPT entry\n");
+    }
     hash_table = (hcb->hash_func)(hcb->pta,
                         va, entry->rid, entry->ps);
     if( INVALID_ENTRY(hcb, hash_table) ) {
-        if ( !__tlb_to_vhpt(hcb, entry, va, hash_table) ) {
-            panic("Can't convert to machine VHPT entry\n");
-        }
+        *hash_table = vhpt_entry;
         hash_table->next = 0;
     }
     else {
         // TODO: Add collision chain length limitation.
         cch = __alloc_chain(hcb,entry);
-        
-        *cch = *hash_table;
-        if ( !__tlb_to_vhpt(hcb, entry, va, hash_table) ) {
-            panic("Can't convert to machine VHPT entry\n");
-        }
-        hash_table->next = cch;
+        if(cch == NULL){
+            *hash_table = vhpt_entry;
+            hash_table->next = 0;
+        }else{
+            *cch = *hash_table;
+            *hash_table = vhpt_entry;
+            hash_table->next = cch;
+        }
+
         if(hash_table->tag==hash_table->next->tag)
             while(1);
     }
@@ -488,10 +495,10 @@
 {
     thash_data_t *next;
 
-    if ( ++cch_depth > MAX_CCH_LENGTH ) {
-        printf ("cch length > MAX_CCH_LENGTH, exceed the expected length\n");
-        while(1);
-   }
+//    if ( ++cch_depth > MAX_CCH_LENGTH ) {
+//        printf ("cch length > MAX_CCH_LENGTH, exceed the expected length\n");
+//        while(1);
+//   }
     if ( cch -> next ) {
         next = thash_rem_cch(hcb, cch->next);
     }
@@ -914,7 +921,7 @@
         INVALIDATE_HASH(hcb,hash_table);
     }
 }
-
+#define VTLB_DEBUG
 #ifdef  VTLB_DEBUG
 static  u64 cch_length_statistics[MAX_CCH_LENGTH+1];
 u64  sanity_check=0;
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/xen/hyperprivop.S
--- a/xen/arch/ia64/xen/hyperprivop.S   Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/xen/hyperprivop.S   Thu Sep  8 15:18:40 2005
@@ -26,6 +26,24 @@
 #define FAST_PTC_GA
 #undef RFI_TO_INTERRUPT // not working yet
 #endif
+
+#define    XEN_HYPER_RFI           0x1
+#define    XEN_HYPER_RSM_DT        0x2
+#define    XEN_HYPER_SSM_DT        0x3
+#define    XEN_HYPER_COVER         0x4
+#define    XEN_HYPER_ITC_D         0x5
+#define    XEN_HYPER_ITC_I         0x6
+#define    XEN_HYPER_SSM_I         0x7
+#define    XEN_HYPER_GET_IVR       0x8
+#define    XEN_HYPER_GET_TPR       0x9
+#define    XEN_HYPER_SET_TPR       0xa
+#define    XEN_HYPER_EOI           0xb
+#define    XEN_HYPER_SET_ITM       0xc
+#define    XEN_HYPER_THASH         0xd
+#define    XEN_HYPER_PTC_GA        0xe
+#define    XEN_HYPER_ITR_D         0xf
+#define    XEN_HYPER_GET_RR        0x10
+#define    XEN_HYPER_SET_RR        0x11
 
 #ifdef CONFIG_SMP
 #warning "FIXME: ptc.ga instruction requires spinlock for SMP"
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/xen/regionreg.c
--- a/xen/arch/ia64/xen/regionreg.c     Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/xen/regionreg.c     Thu Sep  8 15:18:40 2005
@@ -51,7 +51,7 @@
 // use this to allocate a rid out of the "Xen reserved rid block"
 unsigned long allocate_reserved_rid(void)
 {
-       static unsigned long currentrid = XEN_DEFAULT_RID;
+       static unsigned long currentrid = XEN_DEFAULT_RID+1;
        unsigned long t = currentrid;
 
        unsigned long max = RIDS_PER_RIDBLOCK;
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Thu Sep  8 13:24:08 2005
+++ b/xen/arch/ia64/xen/vcpu.c  Thu Sep  8 15:18:40 2005
@@ -1037,7 +1037,7 @@
 #endif
 
        if (is_idle_task(vcpu->domain)) {
-               printf("****** vcpu_set_next_timer called during idle!!\n");
+//             printf("****** vcpu_set_next_timer called during idle!!\n");
                vcpu_safe_set_itm(s);
                return;
        }
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Thu Sep  8 13:24:08 2005
+++ b/xen/include/asm-ia64/mm.h Thu Sep  8 15:18:40 2005
@@ -163,8 +163,8 @@
            unlikely((nx & PGC_count_mask) == 0) ||     /* Count overflow? */
            unlikely((x >> 32) != _domain)) {           /* Wrong owner? */
            DPRINTK("Error pfn %lx: rd=%p, od=%p, caf=%08x, taf=%08x\n",
-               page_to_pfn(page), domain, unpickle_domptr(d),
-               x, page->u.inuse.typeinfo);
+               page_to_pfn(page), domain, unpickle_domptr(domain),
+               x, page->u.inuse.type_info);
            return 0;
        }
     }
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/include/asm-ia64/regionreg.h
--- a/xen/include/asm-ia64/regionreg.h  Thu Sep  8 13:24:08 2005
+++ b/xen/include/asm-ia64/regionreg.h  Thu Sep  8 15:18:40 2005
@@ -55,8 +55,8 @@
 
        t.uint = RIDVal;
        tmp = t.bytes[1];
-       t.bytes[1] = t.bytes[3];
-       t.bytes[3] = tmp;
+       t.bytes[1] = t.bytes[2];
+       t.bytes[2] = tmp;
 
        return t.uint;
 }
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/include/asm-ia64/vmmu.h
--- a/xen/include/asm-ia64/vmmu.h       Thu Sep  8 13:24:08 2005
+++ b/xen/include/asm-ia64/vmmu.h       Thu Sep  8 15:18:40 2005
@@ -225,8 +225,8 @@
            INVALID_ENTRY(hcb, hash) = 1;        \
            hash->next = NULL; }
 
-#define PURGABLE_ENTRY(hcb,en)  \
-               ((hcb)->ht == THASH_VHPT || ( (en)->tc && !(en->locked)) )
+#define PURGABLE_ENTRY(hcb,en)  1
+//             ((hcb)->ht == THASH_VHPT || ( (en)->tc && !(en->locked)) )
 
 
 /*
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h        Thu Sep  8 13:24:08 2005
+++ b/xen/include/asm-ia64/vmx.h        Thu Sep  8 15:18:40 2005
@@ -29,7 +29,6 @@
 extern unsigned int vmx_enabled;
 extern void vmx_init_env(void);
 extern void vmx_final_setup_domain(struct domain *d);
-extern void vmx_init_double_mapping_stub(void);
 extern void vmx_save_state(struct vcpu *v);
 extern void vmx_load_state(struct vcpu *v);
 extern void vmx_setup_platform(struct vcpu *v, struct vcpu_guest_context *c);
@@ -37,6 +36,7 @@
 extern vmx_insert_double_mapping(u64,u64,u64,u64,u64);
 extern void vmx_purge_double_mapping(u64, u64, u64);
 extern void vmx_change_double_mapping(struct vcpu *v, u64 oldrr7, u64 newrr7);
+extern void vmx_init_double_mapping_stub(void);
 #endif
 
 extern void vmx_wait_io(void);
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/include/asm-ia64/vmx_vcpu.h
--- a/xen/include/asm-ia64/vmx_vcpu.h   Thu Sep  8 13:24:08 2005
+++ b/xen/include/asm-ia64/vmx_vcpu.h   Thu Sep  8 15:18:40 2005
@@ -593,9 +593,10 @@
     VMX_VPD(vcpu,vpsr) |= IA64_PSR_BN;
     return (IA64_NO_FAULT);
 }
-
+#if 0
 /* Another hash performance algorithm */
 #define redistribute_rid(rid)  (((rid) & ~0xffff) | (((rid) << 8) & 0xff00) | 
(((rid) >> 8) & 0xff))
+#endif
 static inline unsigned long
 vmx_vrrtomrr(VCPU *v, unsigned long val)
 {
@@ -603,14 +604,14 @@
     u64          rid;
 
     rr.rrval=val;
-    rr.rid = vmMangleRID(v->arch.starting_rid  + rr.rid);
+    rr.rid = rr.rid + v->arch.starting_rid;
+    rr.ve = 1;
+    return  vmMangleRID(rr.rrval);
 /* Disable this rid allocation algorithm for now */
 #if 0
     rid=(((u64)vcpu->domain->domain_id)<<DOMAIN_RID_SHIFT) + rr.rid;
     rr.rid = redistribute_rid(rid);
 #endif 
 
-    rr.ve=1;
-    return rr.rrval;
-}
-#endif
+}
+#endif
diff -r 0c1f966af47e -r 10b1d30d3f66 xen/include/public/arch-ia64.h
--- a/xen/include/public/arch-ia64.h    Thu Sep  8 13:24:08 2005
+++ b/xen/include/public/arch-ia64.h    Thu Sep  8 15:18:40 2005
@@ -280,22 +280,4 @@
 
 #endif /* !__ASSEMBLY__ */
 
-#define        XEN_HYPER_RFI                   0x1
-#define        XEN_HYPER_RSM_DT                0x2
-#define        XEN_HYPER_SSM_DT                0x3
-#define        XEN_HYPER_COVER                 0x4
-#define        XEN_HYPER_ITC_D                 0x5
-#define        XEN_HYPER_ITC_I                 0x6
-#define        XEN_HYPER_SSM_I                 0x7
-#define        XEN_HYPER_GET_IVR               0x8
-#define        XEN_HYPER_GET_TPR               0x9
-#define        XEN_HYPER_SET_TPR               0xa
-#define        XEN_HYPER_EOI                   0xb
-#define        XEN_HYPER_SET_ITM               0xc
-#define        XEN_HYPER_THASH                 0xd
-#define        XEN_HYPER_PTC_GA                0xe
-#define        XEN_HYPER_ITR_D                 0xf
-#define        XEN_HYPER_GET_RR                0x10
-#define        XEN_HYPER_SET_RR                0x11
-
 #endif /* __HYPERVISOR_IF_IA64_H__ */

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.