diff options
| -rw-r--r-- | arch/x86/kernel/mpparse.c | 94 |
1 files changed, 50 insertions, 44 deletions
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 4216d265366..dce99dca6cf 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -555,6 +555,55 @@ static unsigned long __init get_mpc_size(unsigned long physptr) | |||
| 555 | return size; | 555 | return size; |
| 556 | } | 556 | } |
| 557 | 557 | ||
| 558 | static int __init check_physptr(struct mpf_intel *mpf, unsigned int early) | ||
| 559 | { | ||
| 560 | struct mpc_table *mpc; | ||
| 561 | unsigned long size; | ||
| 562 | |||
| 563 | size = get_mpc_size(mpf->physptr); | ||
| 564 | mpc = early_ioremap(mpf->physptr, size); | ||
| 565 | /* | ||
| 566 | * Read the physical hardware table. Anything here will | ||
| 567 | * override the defaults. | ||
| 568 | */ | ||
| 569 | if (!smp_read_mpc(mpc, early)) { | ||
| 570 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 571 | smp_found_config = 0; | ||
| 572 | #endif | ||
| 573 | printk(KERN_ERR "BIOS bug, MP table errors detected!...\n" | ||
| 574 | "... disabling SMP support. (tell your hw vendor)\n"); | ||
| 575 | early_iounmap(mpc, size); | ||
| 576 | return -1; | ||
| 577 | } | ||
| 578 | early_iounmap(mpc, size); | ||
| 579 | |||
| 580 | if (early) | ||
| 581 | return -1; | ||
| 582 | |||
| 583 | #ifdef CONFIG_X86_IO_APIC | ||
| 584 | /* | ||
| 585 | * If there are no explicit MP IRQ entries, then we are | ||
| 586 | * broken. We set up most of the low 16 IO-APIC pins to | ||
| 587 | * ISA defaults and hope it will work. | ||
| 588 | */ | ||
| 589 | if (!mp_irq_entries) { | ||
| 590 | struct mpc_bus bus; | ||
| 591 | |||
| 592 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " | ||
| 593 | "using default mptable. (tell your hw vendor)\n"); | ||
| 594 | |||
| 595 | bus.type = MP_BUS; | ||
| 596 | bus.busid = 0; | ||
| 597 | memcpy(bus.bustype, "ISA ", 6); | ||
| 598 | MP_bus_info(&bus); | ||
| 599 | |||
| 600 | construct_default_ioirq_mptable(0); | ||
| 601 | } | ||
| 602 | #endif | ||
| 603 | |||
| 604 | return 0; | ||
| 605 | } | ||
| 606 | |||
| 558 | /* | 607 | /* |
| 559 | * Scan the memory blocks for an SMP configuration block. | 608 | * Scan the memory blocks for an SMP configuration block. |
| 560 | */ | 609 | */ |
| @@ -608,51 +657,8 @@ static void __init __get_smp_config(unsigned int early) | |||
| 608 | construct_default_ISA_mptable(mpf->feature1); | 657 | construct_default_ISA_mptable(mpf->feature1); |
| 609 | 658 | ||
| 610 | } else if (mpf->physptr) { | 659 | } else if (mpf->physptr) { |
| 611 | struct mpc_table *mpc; | 660 | if (check_physptr(mpf, early)) |
| 612 | unsigned long size; | ||
| 613 | |||
| 614 | size = get_mpc_size(mpf->physptr); | ||
| 615 | mpc = early_ioremap(mpf->physptr, size); | ||
| 616 | /* | ||
| 617 | * Read the physical hardware table. Anything here will | ||
| 618 | * override the defaults. | ||
| 619 | */ | ||
| 620 | if (!smp_read_mpc(mpc, early)) { | ||
| 621 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 622 | smp_found_config = 0; | ||
| 623 | #endif | ||
| 624 | printk(KERN_ERR | ||
| 625 | "BIOS bug, MP table errors detected!...\n"); | ||
| 626 | printk(KERN_ERR "... disabling SMP support. " | ||
| 627 | "(tell your hw vendor)\n"); | ||
| 628 | early_iounmap(mpc, size); | ||
| 629 | return; | ||
| 630 | } | ||
| 631 | early_iounmap(mpc, size); | ||
| 632 | |||
| 633 | if (early) | ||
| 634 | return; | 661 | return; |
| 635 | #ifdef CONFIG_X86_IO_APIC | ||
| 636 | /* | ||
| 637 | * If there are no explicit MP IRQ entries, then we are | ||
| 638 | * broken. We set up most of the low 16 IO-APIC pins to | ||
| 639 | * ISA defaults and hope it will work. | ||
| 640 | */ | ||
| 641 | if (!mp_irq_entries) { | ||
| 642 | struct mpc_bus bus; | ||
| 643 | |||
| 644 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " | ||
| 645 | "using default mptable. " | ||
| 646 | "(tell your hw vendor)\n"); | ||
| 647 | |||
| 648 | bus.type = MP_BUS; | ||
| 649 | bus.busid = 0; | ||
| 650 | memcpy(bus.bustype, "ISA ", 6); | ||
| 651 | MP_bus_info(&bus); | ||
| 652 | |||
| 653 | construct_default_ioirq_mptable(0); | ||
| 654 | } | ||
| 655 | #endif | ||
| 656 | } else | 662 | } else |
| 657 | BUG(); | 663 | BUG(); |
| 658 | 664 | ||
