|  |  | 
  
    |  |  | 
 
  |   |  | 
  
    |  |  | 
  
    |  |  | 
  
    |   xen-ia64-devel
[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 | 
 
| <Prev in Thread] | Current Thread | [Next in Thread> |  | 
[Xen-ia64-devel] [PATCH] fix ptc.ga emulation,
Kouya SHIMURA <=
 |  |  | 
  
    |  |  |