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

[Xen-ia64-devel] [PATCH] fix ptc.ga emulation



ptc.ga infrequently clobbers the region register 0.

When vcpu1 purges TLBs of vcpu2 and
ptc_ga_remote_func() is called locally not via IPI
(i.e. vcpu1 shares the same pcpu with vcpu2),
in ptc_ga_remote_func(),
  save vrr[0] of vcpu2
  ... => switch to vcpu2 and set a new value of vrr[0]
  restore vrr[0] of vcpu2 // the new value is lost

Windows will crash due to this issue.
--
Kouya

Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>

diff -r 41471cc650a2 xen/arch/ia64/vmx/vmmu.c
--- a/xen/arch/ia64/vmx/vmmu.c  Thu Apr 12 10:30:12 2007 -0600
+++ b/xen/arch/ia64/vmx/vmmu.c  Fri Apr 13 20:55:11 2007 +0900
@@ -34,6 +34,7 @@
 #include <asm/vcpu.h>
 #include <xen/irq.h>
 #include <xen/errno.h>
+#include <xen/sched-if.h>
 
 /*
  * Get the machine page frame number in 16KB unit
@@ -613,8 +614,14 @@ again: /* Try again if VCPU has migrated
         } else if (v == vcpu) {
             vmx_vcpu_ptc_l(v, va, ps);
         } else {
-            ptc_ga_remote_func(&args);
-            if (proc != v->processor)
+            vcpu_schedule_lock_irq(v);
+            proc = v->processor;
+            if (proc == vcpu->processor)
+                ptc_ga_remote_func(&args);
+            else
+                proc = INVALID_PROCESSOR;
+            vcpu_schedule_unlock_irq(v);
+            if (proc == INVALID_PROCESSOR)
                 goto again;
         }
     }
_______________________________________________
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®.