# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 983311b895bebff38f5a4c10cd84dff64764a787
# Parent 333db05b8bbb1e07583608c8efe4fa97a6b64cc4
[IA64] VTI: Use 16K page size to emulate guest physical mode
Previously VMM use 4k to emulate guest physical mode on VTI-domain to
satisfy the requirement of speculation attribute in physical mode, please
refer to 4.4.6 Speculation Attributes of Itanium SDM 2
Seems like guest doesn't need to conform to this
Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx>
diff -r 333db05b8bbb -r 983311b895be xen/arch/ia64/vmx/vmx_phy_mode.c
--- a/xen/arch/ia64/vmx/vmx_phy_mode.c Fri Mar 3 17:11:33 2006
+++ b/xen/arch/ia64/vmx/vmx_phy_mode.c Fri Mar 3 20:03:39 2006
@@ -104,57 +104,51 @@
vcpu->arch.mode_flags = GUEST_IN_PHY;
}
-extern u64 get_mfn(struct domain *d, u64 gpfn);
extern void vmx_switch_rr7(unsigned long ,shared_info_t*,void *,void *,void *);
-void
-physical_itlb_miss_dom0(VCPU *vcpu, u64 vadr)
+/*void
+physical_itlb_miss(VCPU *vcpu, u64 vadr)
{
u64 psr;
IA64_PSR vpsr;
- u64 mppn,gppn;
+ u64 xen_mppn,xen_gppn;
vpsr.val=vmx_vcpu_get_psr(vcpu);
- gppn=(vadr<<1)>>13;
- mppn = get_mfn(vcpu->domain,gppn);
- mppn=(mppn<<12)|(vpsr.cpl<<7);
-// if(vadr>>63)
-// mppn |= PHY_PAGE_UC;
-// else
- mppn |= PHY_PAGE_WB;
+ xen_gppn=(vadr<<1)>>(PAGE_SHIFT+1);
+ xen_mppn = gmfn_to_mfn(vcpu->domain, xen_gppn);
+ xen_mppn=(xen_mppn<<PAGE_SHIFT)|(vpsr.cpl<<7);
+ if(vadr>>63)
+ xen_mppn |= PHY_PAGE_UC;
+ else
+ xen_mppn |= PHY_PAGE_WB;
psr=ia64_clear_ic();
- ia64_itc(1,vadr&(~0xfff),mppn,EMUL_PHY_PAGE_SHIFT);
+ ia64_itc(1,vadr&PAGE_MASK,xen_mppn,PAGE_SHIFT);
ia64_set_psr(psr);
ia64_srlz_i();
return;
}
-
-void
-physical_itlb_miss(VCPU *vcpu, u64 vadr)
-{
- physical_itlb_miss_dom0(vcpu, vadr);
-}
-
-
-void
-physical_dtlb_miss(VCPU *vcpu, u64 vadr)
+*/
+/*
+ * vec=1, itlb miss
+ * vec=2, dtlb miss
+ */
+void
+physical_tlb_miss(VCPU *vcpu, u64 vadr, u64 vec)
{
u64 psr;
IA64_PSR vpsr;
- u64 mppn,gppn;
-// if(vcpu->domain!=dom0)
-// panic("dom n physical dtlb miss happen\n");
+ u64 xen_mppn,xen_gppn;
vpsr.val=vmx_vcpu_get_psr(vcpu);
- gppn=(vadr<<1)>>13;
- mppn = get_mfn(vcpu->domain, gppn);
- mppn=(mppn<<12)|(vpsr.cpl<<7);
+ xen_gppn=(vadr<<1)>>(PAGE_SHIFT+1);
+ xen_mppn = gmfn_to_mfn(vcpu->domain, xen_gppn);
+ xen_mppn=(xen_mppn<<PAGE_SHIFT)|(vpsr.cpl<<7);
if(vadr>>63)
- mppn |= PHY_PAGE_UC;
+ xen_mppn |= PHY_PAGE_UC;
else
- mppn |= PHY_PAGE_WB;
+ xen_mppn |= PHY_PAGE_WB;
psr=ia64_clear_ic();
- ia64_itc(2,vadr&(~0xfff),mppn,EMUL_PHY_PAGE_SHIFT);
+ ia64_itc(vec,vadr&PAGE_MASK,xen_mppn,PAGE_SHIFT);
ia64_set_psr(psr);
ia64_srlz_i();
return;
@@ -193,13 +187,13 @@
if (is_physical_mode(vcpu)) {
if (vcpu->arch.mode_flags & GUEST_PHY_EMUL)
panic("Unexpected domain switch in phy emul\n");
- phy_rr.rrval = vcpu->domain->arch.metaphysical_rr0;
- phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+ phy_rr.rrval = vcpu->arch.metaphysical_rr0;
+ // phy_rr.ps = PAGE_SHIFT;
phy_rr.ve = 1;
ia64_set_rr((VRN0 << VRN_SHIFT), phy_rr.rrval);
- phy_rr.rrval = vcpu->domain->arch.metaphysical_rr4;
- phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+ phy_rr.rrval = vcpu->arch.metaphysical_rr4;
+// phy_rr.ps = PAGE_SHIFT;
phy_rr.ve = 1;
ia64_set_rr((VRN4 << VRN_SHIFT), phy_rr.rrval);
@@ -242,12 +236,12 @@
/* Save original virtual mode rr[0] and rr[4] */
psr=ia64_clear_ic();
phy_rr.rrval = vcpu->domain->arch.metaphysical_rr0;
- phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+// 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.rrval = vcpu->domain->arch.metaphysical_rr4;
- phy_rr.ps = EMUL_PHY_PAGE_SHIFT;
+// 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 333db05b8bbb -r 983311b895be xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c Fri Mar 3 17:11:33 2006
+++ b/xen/arch/ia64/vmx/vmx_process.c Fri Mar 3 20:03:39 2006
@@ -315,23 +315,20 @@
return;
}
*/
- if(vadr == 0x1ea18c00 ){
+/* if(vadr == 0x1ea18c00 ){
ia64_clear_ic();
while(1);
}
+ */
if(is_physical_mode(v)&&(!(vadr<<1>>62))){
- if(vec==1){
- physical_itlb_miss(v, vadr);
- return IA64_FAULT;
- }
if(vec==2){
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(v, vadr);
+ return IA64_FAULT;
}
- return IA64_FAULT;
}
+ physical_tlb_miss(v, vadr, vec);
+ return IA64_FAULT;
}
vrr = vmx_vcpu_rr(v, vadr);
if(vec == 1) type = ISIDE_TLB;
diff -r 333db05b8bbb -r 983311b895be xen/include/asm-ia64/vmx_phy_mode.h
--- a/xen/include/asm-ia64/vmx_phy_mode.h Fri Mar 3 17:11:33 2006
+++ b/xen/include/asm-ia64/vmx_phy_mode.h Fri Mar 3 20:03:39 2006
@@ -75,11 +75,11 @@
#define PHY_PAGE_UC (_PAGE_A|_PAGE_D|_PAGE_P|_PAGE_MA_UC|_PAGE_AR_RWX)
#define PHY_PAGE_WB (_PAGE_A|_PAGE_D|_PAGE_P|_PAGE_MA_WB|_PAGE_AR_RWX)
-#ifdef PHY_16M /* 16M: large granule for test*/
-#define EMUL_PHY_PAGE_SHIFT 24
-#else /* 4K: emulated physical page granule */
-#define EMUL_PHY_PAGE_SHIFT 12
-#endif
+//#ifdef PHY_16M /* 16M: large granule for test*/
+//#define EMUL_PHY_PAGE_SHIFT 24
+//#else /* 4K: emulated physical page granule */
+//#define EMUL_PHY_PAGE_SHIFT 12
+//#endif
#define IA64_RSC_MODE 0x0000000000000003
#define XEN_RR7_RID (0xf00010)
#define GUEST_IN_PHY 0x1
@@ -96,8 +96,7 @@
extern void recover_if_physical_mode(VCPU *vcpu);
extern void vmx_init_all_rr(VCPU *vcpu);
extern void vmx_load_all_rr(VCPU *vcpu);
-extern void physical_itlb_miss(VCPU *vcpu, u64 vadr);
-extern void physical_dtlb_miss(VCPU *vcpu, u64 vadr);
+extern void physical_tlb_miss(VCPU *vcpu, u64 vadr, u64 vec);
/*
* No sanity check here, since all psr changes have been
* checked in switch_mm_mode().
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|