aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/mpparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/kernel/mpparse.c')
-rw-r--r--arch/x86_64/kernel/mpparse.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c
index 20e88f4b564b..b8d53dfa9931 100644
--- a/arch/x86_64/kernel/mpparse.c
+++ b/arch/x86_64/kernel/mpparse.c
@@ -152,6 +152,21 @@ static void __init MP_bus_info (struct mpc_config_bus *m)
152 } 152 }
153} 153}
154 154
155static int bad_ioapic(unsigned long address)
156{
157 if (nr_ioapics >= MAX_IO_APICS) {
158 printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
159 "(found %d)\n", MAX_IO_APICS, nr_ioapics);
160 panic("Recompile kernel with bigger MAX_IO_APICS!\n");
161 }
162 if (!address) {
163 printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
164 " found in table, skipping!\n");
165 return 1;
166 }
167 return 0;
168}
169
155static void __init MP_ioapic_info (struct mpc_config_ioapic *m) 170static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
156{ 171{
157 if (!(m->mpc_flags & MPC_APIC_USABLE)) 172 if (!(m->mpc_flags & MPC_APIC_USABLE))
@@ -159,16 +174,10 @@ static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
159 174
160 printk("I/O APIC #%d at 0x%X.\n", 175 printk("I/O APIC #%d at 0x%X.\n",
161 m->mpc_apicid, m->mpc_apicaddr); 176 m->mpc_apicid, m->mpc_apicaddr);
162 if (nr_ioapics >= MAX_IO_APICS) { 177
163 printk(KERN_ERR "Max # of I/O APICs (%d) exceeded (found %d).\n", 178 if (bad_ioapic(m->mpc_apicaddr))
164 MAX_IO_APICS, nr_ioapics);
165 panic("Recompile kernel with bigger MAX_IO_APICS!.\n");
166 }
167 if (!m->mpc_apicaddr) {
168 printk(KERN_ERR "WARNING: bogus zero I/O APIC address"
169 " found in MP table, skipping!\n");
170 return; 179 return;
171 } 180
172 mp_ioapics[nr_ioapics] = *m; 181 mp_ioapics[nr_ioapics] = *m;
173 nr_ioapics++; 182 nr_ioapics++;
174} 183}
@@ -647,16 +656,8 @@ void __init mp_register_ioapic(u8 id, u32 address, u32 gsi_base)
647{ 656{
648 int idx = 0; 657 int idx = 0;
649 658
650 if (nr_ioapics >= MAX_IO_APICS) { 659 if (bad_ioapic(address))
651 printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
652 "(found %d)\n", MAX_IO_APICS, nr_ioapics);
653 panic("Recompile kernel with bigger MAX_IO_APICS!\n");
654 }
655 if (!address) {
656 printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
657 " found in MADT table, skipping!\n");
658 return; 660 return;
659 }
660 661
661 idx = nr_ioapics++; 662 idx = nr_ioapics++;
662 663