Hi Anthony.
I tracked it down.
The key is perfc=y and perfc_arrays=y. I suppose you didn't enabled those.
I can boot VTi domain without panic with the following patch.
While debuging, I noticed that switch_mm_mode() also calls
panic_domain() which isn't usually called. If panic_domain() is called
on the fast path, the vmm itself would panic.
Could you refine it?
And could you add comments to the new fast C routine to warn?
diff -r 2ce591cbc564 xen/arch/ia64/vmx/vmx_phy_mode.c
--- a/xen/arch/ia64/vmx/vmx_phy_mode.c Wed May 14 12:31:37 2008 +0900
+++ b/xen/arch/ia64/vmx/vmx_phy_mode.c Wed May 14 14:15:36 2008 +0900
@@ -180,7 +180,7 @@
ia64_srlz_d();
}
-void
+static void
switch_to_physical_rid(VCPU *vcpu)
{
u64 psr;
@@ -208,7 +208,7 @@
return;
}
-void
+static void
switch_to_virtual_rid(VCPU *vcpu)
{
u64 psr;
@@ -228,12 +228,13 @@
return mm_switch_table[MODE_IND(opsr)][MODE_IND(npsr)];
}
-void
-switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr)
+static void
+__switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr, int is_fast)
{
int act;
act = mm_switch_action(old_psr, new_psr);
- perfc_incra(vmx_switch_mm_mode, act);
+ if (unlikely(!is_fast))
+ perfc_incra(vmx_switch_mm_mode, act);
switch (act) {
case SW_2P_DT:
vcpu->arch.arch_vmx.mmu_mode = VMX_MMU_PHY_DT;
@@ -252,8 +253,9 @@
switch_to_virtual_rid(vcpu);
break;
case SW_SELF:
-// printk("Switch to self-0x%lx!!! MM mode doesn't change...\n",
-// old_psr.val);
+ if (unlikely(!is_fast))
+ printk("Switch to self-0x%lx!!! MM mode doesn't change...\n",
+ old_psr.val);
break;
case SW_NOP:
// printk("No action required for mode transition: (0x%lx -> 0x%lx)\n",
@@ -267,6 +269,21 @@
break;
}
return;
+}
+
+void
+switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr)
+{
+ __switch_mm_mode(vcpu, old_psr, new_psr, 0);
+}
+
+void
+switch_mm_mode_fast(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr)
+{
+ /* When fast path, psr.ic = 0, psr.i = 0, psr.bn = 0
+ * so that no tlb miss is allowed.
+ */
+ __switch_mm_mode(vcpu, old_psr, new_psr, 1);
}
void
diff -r 2ce591cbc564 xen/arch/ia64/vmx/vmx_vcpu.c
--- a/xen/arch/ia64/vmx/vmx_vcpu.c Wed May 14 12:31:37 2008 +0900
+++ b/xen/arch/ia64/vmx/vmx_vcpu.c Wed May 14 14:15:36 2008 +0900
@@ -298,7 +298,7 @@
ia64_setreg(_IA64_REG_CR_IPSR, mipsr);
- switch_mm_mode(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
+ switch_mm_mode_fast(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
}
@@ -348,7 +348,7 @@
ia64_setreg(_IA64_REG_CR_IIP, VCPU(vcpu, iip));
- switch_mm_mode(vcpu, (IA64_PSR)vpsr, (IA64_PSR)vipsr);
+ switch_mm_mode_fast(vcpu, (IA64_PSR)vpsr, (IA64_PSR)vipsr);
}
@@ -369,7 +369,7 @@
mipsr |= imm24 & (~IA64_PSR_PP);
ia64_setreg(_IA64_REG_CR_IPSR, mipsr);
- switch_mm_mode(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
+ switch_mm_mode_fast(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
}
void vmx_vcpu_rsm_fast(VCPU *vcpu, u64 imm24)
@@ -394,7 +394,7 @@
ia64_setreg(_IA64_REG_CR_IPSR, mipsr);
- switch_mm_mode(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
+ switch_mm_mode_fast(vcpu, (IA64_PSR)old_vpsr, (IA64_PSR)new_vpsr);
}
IA64FAULT vmx_vcpu_rfi(VCPU *vcpu)
diff -r 2ce591cbc564 xen/include/asm-ia64/vmx_phy_mode.h
--- a/xen/include/asm-ia64/vmx_phy_mode.h Wed May 14 12:31:37 2008 +0900
+++ b/xen/include/asm-ia64/vmx_phy_mode.h Wed May 14 14:15:36 2008 +0900
@@ -76,9 +76,8 @@
#define PHY_PAGE_WB (_PAGE_A|_PAGE_D|_PAGE_P|_PAGE_MA_WB|_PAGE_AR_RWX)
extern void physical_mode_init(VCPU *);
-extern void switch_to_physical_rid(VCPU *);
-extern void switch_to_virtual_rid(VCPU *vcpu);
extern void switch_mm_mode(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR new_psr);
+extern void switch_mm_mode_fast(VCPU *vcpu, IA64_PSR old_psr, IA64_PSR
new_psr);
extern void check_mm_mode_switch (VCPU *vcpu, IA64_PSR old_psr, IA64_PSR
new_psr);
extern void prepare_if_physical_mode(VCPU *vcpu);
extern void recover_if_physical_mode(VCPU *vcpu);
On Mon, May 12, 2008 at 04:12:28PM +0900, Isaku Yamahata wrote:
> On Mon, May 12, 2008 at 11:27:29AM +0800, Xu, Anthony wrote:
> > Hi isaku,
> >
> > I can't reprocude it.
> > I had booted guest rhel4-2 and windows server 2003 SP1 with intel &
> > opensource Guest FW.
> >
> > What's your FW version and guest OS version?
>
> GFW: open gfw of change set 124:ececa5a5473b (prebuild one)
>
> kernel:
> - Linux version 2.6.9-22.EL (bhcompile@xxxxxxxxxxxxxxxxxxxxxx) (gcc
> version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1 SMP Mon Sep 19 17:54:55
> EDT 2005
> - Linux 2.6.18 + xen (My local compile)
> - Windows 2003
>
--
yamahata
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|