aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/smp.c
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-09-10 17:49:58 +0100
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2007-09-10 17:49:58 +0100
commit78569aa816df0cccdb0c8d7e5359a85e66337265 (patch)
treed467d768599834e11a9acc4fc5a133c3d463e0c4 /xen/arch/x86/smp.c
parent354aabe18a23a04e0d49fae9771dc6169399008b (diff)
downloadxen-78569aa816df0cccdb0c8d7e5359a85e66337265.tar.gz
xen-78569aa816df0cccdb0c8d7e5359a85e66337265.tar.bz2
xen-78569aa816df0cccdb0c8d7e5359a85e66337265.zip
x86: Handle 'self-IPI' on legacy UP systems with no APIC.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/arch/x86/smp.c')
-rw-r--r--xen/arch/x86/smp.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c
index 31fc8adbe6..1d83a3aba3 100644
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -279,6 +279,19 @@ int on_selected_cpus(
ASSERT(local_irq_is_enabled());
+ /* Legacy UP system with no APIC to deliver IPIs? */
+ if ( unlikely(!cpu_has_apic) )
+ {
+ ASSERT(num_online_cpus() == 1);
+ if ( cpu_isset(0, selected) )
+ {
+ local_irq_disable();
+ func(info);
+ local_irq_enable();
+ }
+ return 0;
+ }
+
if ( nr_cpus == 0 )
return 0;