aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Cooper <andrew.cooper3@citrix.com>2012-03-07 10:54:11 +0000
committerAndrew Cooper <andrew.cooper3@citrix.com>2012-03-07 10:54:11 +0000
commit19de40af1abe3606632ed115af9d82b326fe97bb (patch)
treefc04fc0cb9f917e9de90207ad8203ec3d7c6066c
parent425917b9d0a74f062d96fa94630fb81b7eb30cda (diff)
downloadxen-19de40af1abe3606632ed115af9d82b326fe97bb.tar.gz
xen-19de40af1abe3606632ed115af9d82b326fe97bb.tar.bz2
xen-19de40af1abe3606632ed115af9d82b326fe97bb.zip
IO-APIC: Prevent using EOI broadcast suppression if user specified
ioapic_ack=new on the command line. Currently, if EOI broadcast suppression is advertised on the BSP LAPIC, Xen will discard any user specified option regarding IO-APIC ack mode. This patch introduces a check which prevents EOI Broadcast suppression from forcing the IO-APIC ack mode to old if the user has explicitly asked for the new ack mode on the command line. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Committed-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 24870:9bf3ec036bef xen-unstable date: Thu Feb 23 09:58:47 2012 +0000
-rw-r--r--xen/arch/x86/apic.c12
-rw-r--r--xen/arch/x86/io_apic.c7
-rw-r--r--xen/include/asm-x86/io_apic.h1
3 files changed, 17 insertions, 3 deletions
diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
index 9bbf1540ae..2845d23b01 100644
--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -437,9 +437,15 @@ int __init verify_local_APIC(void)
*/
if ( reg0 & APIC_LVR_DIRECTED_EOI )
{
- ioapic_ack_new = 0;
- directed_eoi_enabled = 1;
- printk("Enabled directed EOI with ioapic_ack_old on!\n");
+ if ( ioapic_ack_new == 1 && ioapic_ack_forced == 1 )
+ printk("Not enabling directed EOI because ioapic_ack_new has been "
+ "forced on the command line\n");
+ else
+ {
+ ioapic_ack_new = 0;
+ directed_eoi_enabled = 1;
+ printk("Enabled directed EOI with ioapic_ack_old on!\n");
+ }
}
/*
diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c
index c09657b7f2..b22c3936c8 100644
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -44,6 +44,7 @@ static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
static DEFINE_SPINLOCK(ioapic_lock);
bool_t __read_mostly skip_ioapic_setup;
+bool_t __read_mostly ioapic_ack_forced = 0;
#ifndef sis_apic_bug
/*
@@ -1610,9 +1611,15 @@ int __read_mostly ioapic_ack_new = 1;
static void setup_ioapic_ack(char *s)
{
if ( !strcmp(s, "old") )
+ {
ioapic_ack_new = 0;
+ ioapic_ack_forced = 1;
+ }
else if ( !strcmp(s, "new") )
+ {
ioapic_ack_new = 1;
+ ioapic_ack_forced = 1;
+ }
else
printk("Unknown ioapic_ack value specified: '%s'\n", s);
}
diff --git a/xen/include/asm-x86/io_apic.h b/xen/include/asm-x86/io_apic.h
index 14c95dd6c8..1b42f85d8f 100644
--- a/xen/include/asm-x86/io_apic.h
+++ b/xen/include/asm-x86/io_apic.h
@@ -179,6 +179,7 @@ static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned
/* 1 if "noapic" boot option passed */
extern bool_t skip_ioapic_setup;
+extern bool_t ioapic_ack_forced;
#ifdef CONFIG_ACPI_BOOT
extern int io_apic_get_unique_id (int ioapic, int apic_id);