aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/mpparse.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-04-17 15:37:05 +0200
committerJan Beulich <jbeulich@suse.com>2012-04-17 15:37:05 +0200
commit5768aa97b54a3539c495787374bf5e5863370db1 (patch)
treeff4192f83bad93bdea79448bb4fbab4fa1c21ebd /xen/arch/x86/mpparse.c
parent98729f42a0db6d402bc01d5c73c7a992227ed711 (diff)
downloadxen-5768aa97b54a3539c495787374bf5e5863370db1.tar.gz
xen-5768aa97b54a3539c495787374bf5e5863370db1.tar.bz2
xen-5768aa97b54a3539c495787374bf5e5863370db1.zip
x86: suppress warning messages on IO-APIC-less systems
Each call to mp_register_gsi() so far produced two warnings (about not being able to find the corresponding IO-APIC pin). However, we should use the provided information for setting the ELCR correctly (we might want to even do this when there is an IO-APIC, if was absolutely certain that all machines really have this register [and specifically not some other device at the two I/O ports in question]). It is in any case questionable that we allow Dom0 to set this register - it could particularly be the interrupt of a plug-in serial port card that might not work due to this. The problem is that all Dom0 kernels to date do so, hence we can't simply #GP on such an access (which would be the result if we disallowed access to the port as we should have done from the beginning). Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/mpparse.c')
-rw-r--r--xen/arch/x86/mpparse.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/xen/arch/x86/mpparse.c b/xen/arch/x86/mpparse.c
index 76a4a66504..03c3416713 100644
--- a/xen/arch/x86/mpparse.c
+++ b/xen/arch/x86/mpparse.c
@@ -1034,6 +1034,21 @@ int mp_register_gsi (u32 gsi, int triggering, int polarity)
return gsi;
#endif
+ if (!nr_ioapics) {
+ unsigned int port = 0x4d0 + (gsi >> 3);
+ u8 val;
+
+ if (!platform_legacy_irq(gsi))
+ return -EINVAL;
+ val = inb(port);
+ if (triggering)
+ val |= 1 << (gsi & 7);
+ else
+ val &= ~(1 << (gsi & 7));
+ outb(val, port);
+ return 0;
+ }
+
ioapic = mp_find_ioapic(gsi);
if (ioapic < 0) {
printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi);