# 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
|