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] [xen-unstable] [IA64] Turn on dcr.dm inside XEN

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [IA64] Turn on dcr.dm inside XEN
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Fri, 09 Feb 2007 09:40:50 -0800
Delivery-date: Fri, 09 Feb 2007 10:42:07 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User awilliam@xxxxxxxxxxxx
# Date 1170714219 25200
# Node ID d879bbaa3faab772fab94bab6cb8f5ee2689b3fc
# Parent  d9f7f4f9c7ff86484afb047accdad23e1482637f
[IA64] Turn on dcr.dm inside XEN

For xeno, dcr.dm is alway set to 1,
For VTI-domain,
    if guest cpl > 0, dcr.dm is set to 1,
    if guest cpl == 0, dcr.dm is set to 0,
This is because Window ld.s on tr mapped page.

Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx>
---
 xen/arch/ia64/vmx/vmx_interrupt.c |    2 +-
 xen/arch/ia64/vmx/vmx_phy_mode.c  |    2 +-
 xen/arch/ia64/vmx/vmx_vcpu.c      |   17 +++++++++++++++++
 xen/arch/ia64/vmx/vmx_virt.c      |    4 ++--
 xen/arch/ia64/xen/domain.c        |    9 ++++-----
 xen/arch/ia64/xen/vcpu.c          |   13 +++----------
 xen/include/asm-ia64/domain.h     |    1 -
 xen/include/asm-ia64/vmx_vcpu.h   |   21 +--------------------
 xen/include/asm-ia64/vmx_vpd.h    |    9 ---------
 xen/include/asm-ia64/xenkregs.h   |    4 ++++
 10 files changed, 33 insertions(+), 49 deletions(-)

diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/arch/ia64/vmx/vmx_interrupt.c
--- a/xen/arch/ia64/vmx/vmx_interrupt.c Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_interrupt.c Mon Feb 05 15:23:39 2007 -0700
@@ -99,7 +99,7 @@ inject_guest_interruption(VCPU *vcpu, u6
     pt_isr.ir = 0;
     VMX(vcpu,cr_isr) = pt_isr.val;
     collect_interruption(vcpu);
-
+    vmx_ia64_set_dcr(vcpu);
     vmx_vcpu_get_iva(vcpu,&viva);
     regs->cr_iip = viva + vec;
 }
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/arch/ia64/vmx/vmx_phy_mode.c
--- a/xen/arch/ia64/vmx/vmx_phy_mode.c  Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_phy_mode.c  Mon Feb 05 15:23:39 2007 -0700
@@ -188,7 +188,7 @@ vmx_load_all_rr(VCPU *vcpu)
                        (void *)vcpu->arch.privregs,
                        (void *)vcpu->arch.vhpt.hash, pal_vaddr );
        ia64_set_pta(VMX(vcpu, mpta));
-       ia64_set_dcr(VMX(vcpu, mdcr));
+       vmx_ia64_set_dcr(vcpu);
 
        ia64_srlz_d();
        ia64_set_psr(psr);
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/arch/ia64/vmx/vmx_vcpu.c
--- a/xen/arch/ia64/vmx/vmx_vcpu.c      Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_vcpu.c      Mon Feb 05 15:23:39 2007 -0700
@@ -77,6 +77,22 @@ struct guest_psr_bundle guest_psr_buf[10
 struct guest_psr_bundle guest_psr_buf[100];
 unsigned long guest_psr_index = 0;
 #endif
+
+
+void
+vmx_ia64_set_dcr(VCPU *v)   
+{
+    unsigned long dcr_bits = IA64_DEFAULT_DCR_BITS;
+
+    // if guest is runing on cpl > 0, set dcr.dm=1
+    // if geust is runing on cpl = 0, set dcr.dm=0
+    // because Guest OS may ld.s on tr mapped page.
+    if (!(VCPU(v, vpsr) & IA64_PSR_CPL))
+        dcr_bits &= ~IA64_DCR_DM;
+
+    ia64_set_dcr(dcr_bits);
+}
+
 
 void
 vmx_vcpu_set_psr(VCPU *vcpu, unsigned long value)
@@ -261,6 +277,7 @@ IA64FAULT vmx_vcpu_rfi(VCPU *vcpu)
     else
         vcpu_bsw0(vcpu);
     vmx_vcpu_set_psr(vcpu,psr);
+    vmx_ia64_set_dcr(vcpu);
     ifs=VCPU(vcpu,ifs);
     if(ifs>>63)
         regs->cr_ifs = ifs;
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/arch/ia64/vmx/vmx_virt.c
--- a/xen/arch/ia64/vmx/vmx_virt.c      Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/arch/ia64/vmx/vmx_virt.c      Mon Feb 05 15:23:39 2007 -0700
@@ -1234,7 +1234,7 @@ IA64FAULT vmx_emul_mov_to_cr(VCPU *vcpu,
 #endif  //CHECK_FAULT
     r2 = cr_igfld_mask(inst.M32.cr3,r2);
     switch (inst.M32.cr3) {
-        case 0: return vmx_vcpu_set_dcr(vcpu,r2);
+        case 0: return vcpu_set_dcr(vcpu,r2);
         case 1: return vmx_vcpu_set_itm(vcpu,r2);
         case 2: return vmx_vcpu_set_iva(vcpu,r2);
         case 8: return vmx_vcpu_set_pta(vcpu,r2);
@@ -1299,7 +1299,7 @@ IA64FAULT vmx_emul_mov_from_cr(VCPU *vcp
 
 //    from_cr_cnt[inst.M33.cr3]++;
     switch (inst.M33.cr3) {
-        case 0: return vmx_cr_get(dcr);
+        case 0: return cr_get(dcr);
         case 1: return vmx_cr_get(itm);
         case 2: return vmx_cr_get(iva);
         case 8: return vmx_cr_get(pta);
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/arch/ia64/xen/domain.c        Mon Feb 05 15:23:39 2007 -0700
@@ -42,6 +42,7 @@
 #include <asm/vmx_vpd.h>
 #include <asm/vmx_phy_mode.h>
 #include <asm/vhpt.h>
+#include <asm/vcpu.h>
 #include <asm/tlbflush.h>
 #include <asm/regionreg.h>
 #include <asm/dom_fw.h>
@@ -204,9 +205,7 @@ void context_switch(struct vcpu *prev, s
         if (!VMX_DOMAIN(next)) {
             /* VMX domains can change the physical cr.dcr.
              * Restore default to prevent leakage. */
-            ia64_setreg(_IA64_REG_CR_DCR, (IA64_DCR_DP | IA64_DCR_DK
-                           | IA64_DCR_DX | IA64_DCR_DR | IA64_DCR_PP
-                           | IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC));
+            ia64_setreg(_IA64_REG_CR_DCR, IA64_DEFAULT_DCR_BITS);
         }
     }
     if (VMX_DOMAIN(next))
@@ -582,7 +581,7 @@ void arch_get_info_guest(struct vcpu *v,
                er->dtrs[i].rid = v->arch.dtrs[i].rid;
        }
        er->event_callback_ip = v->arch.event_callback_ip;
-       er->dcr = v->arch.dcr;
+       er->dcr = PSCB(v,dcr);
        er->iva = v->arch.iva;
 }
 
@@ -618,7 +617,7 @@ int arch_set_info_guest(struct vcpu *v, 
                                     er->dtrs[i].rid);
                }
                v->arch.event_callback_ip = er->event_callback_ip;
-               v->arch.dcr = er->dcr;
+               PSCB(v,dcr) = er->dcr;
                v->arch.iva = er->iva;
        }
 
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/arch/ia64/xen/vcpu.c  Mon Feb 05 15:23:39 2007 -0700
@@ -501,7 +501,7 @@ BOOLEAN vcpu_get_psr_i(VCPU * vcpu)
 
 u64 vcpu_get_ipsr_int_state(VCPU * vcpu, u64 prevpsr)
 {
-       u64 dcr = PSCBX(vcpu, dcr);
+       u64 dcr = PSCB(vcpu, dcr);
        PSR psr;
 
        //printk("*** vcpu_get_ipsr_int_state (0x%016lx)...\n",prevpsr);
@@ -532,10 +532,7 @@ u64 vcpu_get_ipsr_int_state(VCPU * vcpu,
 
 IA64FAULT vcpu_get_dcr(VCPU * vcpu, u64 * pval)
 {
-//verbose("vcpu_get_dcr: called @%p\n",PSCB(vcpu,iip));
-       // Reads of cr.dcr on Xen always have the sign bit set, so
-       // a domain can differentiate whether it is running on SP or not
-       *pval = PSCBX(vcpu, dcr) | 0x8000000000000000L;
+       *pval = PSCB(vcpu, dcr);
        return IA64_NO_FAULT;
 }
 
@@ -651,11 +648,7 @@ IA64FAULT vcpu_get_iha(VCPU * vcpu, u64 
 
 IA64FAULT vcpu_set_dcr(VCPU * vcpu, u64 val)
 {
-       // Reads of cr.dcr on SP always have the sign bit set, so
-       // a domain can differentiate whether it is running on SP or not
-       // Thus, writes of DCR should ignore the sign bit
-//verbose("vcpu_set_dcr: called\n");
-       PSCBX(vcpu, dcr) = val & ~0x8000000000000000L;
+       PSCB(vcpu, dcr) = val;
        return IA64_NO_FAULT;
 }
 
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/include/asm-ia64/domain.h
--- a/xen/include/asm-ia64/domain.h     Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/include/asm-ia64/domain.h     Mon Feb 05 15:23:39 2007 -0700
@@ -162,7 +162,6 @@ struct arch_vcpu {
     unsigned long irr[4];          /* Interrupt request register.  */
     unsigned long insvc[4];            /* Interrupt in service.  */
     unsigned long iva;
-    unsigned long dcr;
     unsigned long domain_itm;
     unsigned long domain_itm_last;
 
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/include/asm-ia64/vmx_vcpu.h
--- a/xen/include/asm-ia64/vmx_vcpu.h   Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/include/asm-ia64/vmx_vcpu.h   Mon Feb 05 15:23:39 2007 -0700
@@ -126,17 +126,12 @@ extern void data_page_not_present(VCPU *
 extern void data_page_not_present(VCPU * vcpu, u64 vadr);
 extern void inst_page_not_present(VCPU * vcpu, u64 vadr);
 extern void data_access_rights(VCPU * vcpu, u64 vadr);
+extern void vmx_ia64_set_dcr(VCPU * v);
 
 /**************************************************************************
  VCPU control register access routines
 **************************************************************************/
 
-static inline IA64FAULT vmx_vcpu_get_dcr(VCPU * vcpu, u64 * pval)
-{
-       *pval = VCPU(vcpu, dcr);
-       return IA64_NO_FAULT;
-}
-
 static inline IA64FAULT vmx_vcpu_get_itm(VCPU * vcpu, u64 * pval)
 {
        *pval = VCPU(vcpu, itm);
@@ -230,20 +225,6 @@ static inline IA64FAULT vmx_vcpu_get_lrr
 static inline IA64FAULT vmx_vcpu_get_lrr1(VCPU * vcpu, u64 * pval)
 {
        *pval = VCPU(vcpu, lrr1);
-       return IA64_NO_FAULT;
-}
-
-static inline IA64FAULT vmx_vcpu_set_dcr(VCPU * vcpu, u64 val)
-{
-       u64 mdcr, mask;
-       VCPU(vcpu, dcr) = val;
-       /* All vDCR bits will go to mDCR, except for be/pp/dm bits */
-       mdcr = ia64_get_dcr();
-       /* Machine dcr.dm masked to handle guest ld.s on tr mapped page */
-       mask = IA64_DCR_BE | IA64_DCR_PP | IA64_DCR_DM;
-       mdcr = (mdcr & mask) | (val & (~mask));
-       ia64_set_dcr(mdcr);
-       VMX(vcpu, mdcr) = mdcr;
        return IA64_NO_FAULT;
 }
 
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h    Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/include/asm-ia64/vmx_vpd.h    Mon Feb 05 15:23:39 2007 -0700
@@ -86,16 +86,7 @@ struct arch_vmx_struct {
     unsigned long   cr_isr;    /* for emulation */
     unsigned long   cause;
     unsigned long   opcode;
-
-//    unsigned long   mrr5;
-//    unsigned long   mrr6;
-//    unsigned long   mrr7;
-    unsigned long   mdcr;
     unsigned long   mpta;
-//    unsigned long   rfi_pfs;
-//    unsigned long   rfi_iip;
-//    unsigned long   rfi_ipsr;
-//    unsigned long   rfi_ifs;
     unsigned long   flags;
     unsigned long   xen_port;
     unsigned char   xtp;
diff -r d9f7f4f9c7ff -r d879bbaa3faa xen/include/asm-ia64/xenkregs.h
--- a/xen/include/asm-ia64/xenkregs.h   Mon Feb 05 14:24:27 2007 -0700
+++ b/xen/include/asm-ia64/xenkregs.h   Mon Feb 05 15:23:39 2007 -0700
@@ -12,6 +12,10 @@
 /* Processor status register bits: */
 #define IA64_PSR_VM_BIT                46
 #define IA64_PSR_VM    (__IA64_UL(1) << IA64_PSR_VM_BIT)
+
+#define IA64_DEFAULT_DCR_BITS  (IA64_DCR_PP | IA64_DCR_LC | IA64_DCR_DM | \
+                                IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | \
+                                IA64_DCR_DR | IA64_DCR_DA | IA64_DCR_DD)
 
 /* Interruption Function State */
 #define IA64_IFS_V_BIT         63

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [IA64] Turn on dcr.dm inside XEN, Xen patchbot-unstable <=