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

RE: [Xen-ia64-devel][Patch]Add two PAL calls which fix SMP windowsinstallation crashing bug



Hi,

I also solved it without new GFW.
This patch is a little bit dirty hacking.
Should I wait for new GFW?

Thanks,
Kouya

Zhang, Xing Z writes:
 > Yes, it can fix.
 > But it should work with new GFW. We will send it out soon.
 > 
 > Good good study,day day up ! ^_^
 > -Wing(zhang xin)
 >  
 > OTC,Intel Corporation

diff -r 56caf0e37e6a xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c       Mon Mar 26 10:10:31 2007 -0600
+++ b/xen/arch/ia64/vmx/vlsapic.c       Tue Mar 27 11:07:58 2007 +0900
@@ -57,6 +57,8 @@
 
 extern void vmx_reflect_interruption(u64 ifa, u64 isr, u64 iim,
                                      u64 vector, REGS *regs);
+extern void vmx_sal_return(VCPU *vcpu);
+
 static void update_last_itc(vtime_t *vtm, uint64_t cur_itc)
 {
     vtm->last_itc = cur_itc;
@@ -708,6 +710,8 @@ static void vlsapic_write_ipi(VCPU *vcpu
         vcpu_init_regs(targ);
         targ_regs->cr_iip = d->arch.sal_data->boot_rdv_ip;
         targ_regs->r1 = d->arch.sal_data->boot_rdv_r1;
+        /* Jump to b0 raises Unimpl Inst Addr trap. */
+        targ_regs->b0 = (unsigned long)vmx_sal_return;
 
         if (test_and_clear_bit(_VCPUF_down,&targ->vcpu_flags)) {
             vcpu_wake(targ);
diff -r 56caf0e37e6a xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c   Mon Mar 26 10:10:31 2007 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c   Tue Mar 27 11:07:58 2007 +0900
@@ -77,6 +77,26 @@ static u64 vec2off[68] = {0x0,0x400,0x80
 };
 
 
+/*
+ * SAL Return state from OS_BOOT_RENDEZ
+ */
+void vmx_sal_return(struct vcpu *v)
+{
+    struct domain *d = v->domain;
+
+    printk(XENLOG_INFO "DOM%d/VCPU%d: going offline.\n",
+           d->domain_id, v->vcpu_id);
+
+    set_bit(_VCPUF_down, &v->vcpu_flags);
+    vcpu_sleep_nosync(v);
+
+    /* never return to guest context. */
+    for (;;) {
+        raise_softirq(SCHEDULE_SOFTIRQ);
+        do_softirq();
+    }
+}
+
 
 void vmx_reflect_interruption(u64 ifa, u64 isr, u64 iim,
                               u64 vec, REGS *regs)
@@ -86,8 +106,12 @@ void vmx_reflect_interruption(u64 ifa, u
     u64 vpsr = VCPU(vcpu, vpsr);
     
     vector = vec2off[vec];
-    if(!(vpsr&IA64_PSR_IC)&&(vector!=IA64_DATA_NESTED_TLB_VECTOR)){
-        panic_domain(regs, "Guest nested fault vector=%lx!\n", vector);
+    if (!(vpsr&IA64_PSR_IC)) {
+        if (vector == IA64_LOWERPRIV_TRANSFER_TRAP_VECTOR &&
+            (isr&(1<<4)) != 0 && regs->cr_iip == (u64)vmx_sal_return)
+            vmx_sal_return(vcpu);
+        if (vector != IA64_DATA_NESTED_TLB_VECTOR)
+            panic_domain(regs, "Guest nested fault vector=%lx!\n", vector);
     }
 
     switch (vec) {
diff -r 56caf0e37e6a xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Mon Mar 26 10:10:31 2007 -0600
+++ b/xen/arch/ia64/xen/vcpu.c  Tue Mar 27 11:07:58 2007 +0900
@@ -174,6 +174,9 @@ void vcpu_init_regs(struct vcpu *v)
                    INT_ENABLE_OFFSET(v);
                VCPU(v, itv) = (1 << 16);       /* timer vector masked */
        }
+
+       /* to prevent a Reserved Field fault */
+       VCPU(v, pta) = 0x3c;
 
        v->arch.domain_itm_last = -1L;
 }
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

 


Rackspace

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