aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2011-03-12 13:25:44 +0000
committerJan Beulich <jbeulich@novell.com>2011-03-12 13:25:44 +0000
commit61332af12a9b8ccb5b8ce47589145c671a496557 (patch)
treee83e88a4d30e40f187006ce0458f0dafb68af836
parentb83b661c0eba095a6696dda9db15b5306b8d2325 (diff)
downloadxen-61332af12a9b8ccb5b8ce47589145c671a496557.tar.gz
xen-61332af12a9b8ccb5b8ce47589145c671a496557.tar.bz2
xen-61332af12a9b8ccb5b8ce47589145c671a496557.zip
x86/HPET: fix initialization order
At least the legacy path can enter its interrupt handler callout while initialization is still in progress - that handler checks whether ->event_handler is non-NULL, and hence all other initialization must happen before setting this field. Do the same to the MSI initialization just in case (and to keep the code in sync). Signed-off-by: Jan Beulich <jbeulich@novell.com> Acked-by: Wei Gang <gang.wei@intel.com> xen-unstable changeset: 23030:87aa1277eae0 xen-unstable date: Sat Mar 12 13:19:02 2011 +0000
-rw-r--r--xen/arch/x86/hpet.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c
index af568a3708..6fc7a35586 100644
--- a/xen/arch/x86/hpet.c
+++ b/xen/arch/x86/hpet.c
@@ -597,9 +597,10 @@ void hpet_broadcast_init(void)
1000000000ul, 32);
hpet_events[i].shift = 32;
hpet_events[i].next_event = STIME_MAX;
- hpet_events[i].event_handler = handle_hpet_broadcast;
spin_lock_init(&hpet_events[i].lock);
rwlock_init(&hpet_events[i].cpumask_lock);
+ wmb();
+ hpet_events[i].event_handler = handle_hpet_broadcast;
}
return;
@@ -630,11 +631,12 @@ void hpet_broadcast_init(void)
legacy_hpet_event.mult = div_sc((unsigned long)hpet_rate, 1000000000ul, 32);
legacy_hpet_event.shift = 32;
legacy_hpet_event.next_event = STIME_MAX;
- legacy_hpet_event.event_handler = handle_hpet_broadcast;
legacy_hpet_event.idx = 0;
legacy_hpet_event.flags = 0;
spin_lock_init(&legacy_hpet_event.lock);
rwlock_init(&legacy_hpet_event.cpumask_lock);
+ wmb();
+ legacy_hpet_event.event_handler = handle_hpet_broadcast;
if ( !force_hpet_broadcast )
pv_rtc_handler = handle_rtc_once;