[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [IA64] Fix ptc.ga emulation
# HG changeset patch # User Alex Williamson <alex.williamson@xxxxxx> # Date 1176474801 21600 # Node ID c42ae7839750d685e0330f76351af8b02deabadc # Parent 41471cc650a2380876a9bff2610297ffacf2c83d [IA64] 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. Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx> --- xen/arch/ia64/vmx/vmmu.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff -r 41471cc650a2 -r c42ae7839750 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 08:33:21 2007 -0600 @@ -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-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |