diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-30 14:38:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-30 14:38:31 -0400 |
commit | 019abbc87025a030fd25008612afd4eff8a375f7 (patch) | |
tree | 6d745dedcf90ceff8f5b7b996a17f666b7c574e3 /arch/x86/kernel/mpparse.c | |
parent | 2d25ee36c84d5b2d6be8bfaf80256ecad69a06ca (diff) | |
parent | 5a3c8fe7353f78b73b9636353c6f7b881f19ebea (diff) |
Merge branch 'x86-stage-3-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-stage-3-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (190 commits)
Revert "cpuacct: reduce one NULL check in fast-path"
Revert "x86: don't compile vsmp_64 for 32bit"
x86: Correct behaviour of irq affinity
x86: early_ioremap_init(), use __fix_to_virt(), because we are sure it's safe
x86: use default_cpu_mask_to_apicid for 64bit
x86: fix set_extra_move_desc calling
x86, PAT, PCI: Change vma prot in pci_mmap to reflect inherited prot
x86/dmi: fix dmi_alloc() section mismatches
x86: e820 fix various signedness issues in setup.c and e820.c
x86: apic/io_apic.c define msi_ir_chip and ir_ioapic_chip all the time
x86: irq.c keep CONFIG_X86_LOCAL_APIC interrupts together
x86: irq.c use same path for show_interrupts
x86: cpu/cpu.h cleanup
x86: Fix a couple of sparse warnings in arch/x86/kernel/apic/io_apic.c
Revert "x86: create a non-zero sized bm_pte only when needed"
x86: pci-nommu.c cleanup
x86: io_delay.c cleanup
x86: rtc.c cleanup
x86: i8253 cleanup
x86: kdebugfs.c cleanup
...
Diffstat (limited to 'arch/x86/kernel/mpparse.c')
-rw-r--r-- | arch/x86/kernel/mpparse.c | 384 |
1 files changed, 195 insertions, 189 deletions
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 37cb1bda1baf..dce99dca6cf8 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -109,9 +109,6 @@ static void __init MP_bus_info(struct mpc_bus *m) | |||
109 | } else | 109 | } else |
110 | printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); | 110 | printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); |
111 | } | 111 | } |
112 | #endif | ||
113 | |||
114 | #ifdef CONFIG_X86_IO_APIC | ||
115 | 112 | ||
116 | static int bad_ioapic(unsigned long address) | 113 | static int bad_ioapic(unsigned long address) |
117 | { | 114 | { |
@@ -224,8 +221,12 @@ static void __init MP_intsrc_info(struct mpc_intsrc *m) | |||
224 | if (++mp_irq_entries == MAX_IRQ_SOURCES) | 221 | if (++mp_irq_entries == MAX_IRQ_SOURCES) |
225 | panic("Max # of irq sources exceeded!!\n"); | 222 | panic("Max # of irq sources exceeded!!\n"); |
226 | } | 223 | } |
224 | #else /* CONFIG_X86_IO_APIC */ | ||
225 | static inline void __init MP_bus_info(struct mpc_bus *m) {} | ||
226 | static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} | ||
227 | static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {} | ||
228 | #endif /* CONFIG_X86_IO_APIC */ | ||
227 | 229 | ||
228 | #endif | ||
229 | 230 | ||
230 | static void __init MP_lintsrc_info(struct mpc_lintsrc *m) | 231 | static void __init MP_lintsrc_info(struct mpc_lintsrc *m) |
231 | { | 232 | { |
@@ -275,6 +276,20 @@ static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str) | |||
275 | return 1; | 276 | return 1; |
276 | } | 277 | } |
277 | 278 | ||
279 | static void skip_entry(unsigned char **ptr, int *count, int size) | ||
280 | { | ||
281 | *ptr += size; | ||
282 | *count += size; | ||
283 | } | ||
284 | |||
285 | static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt) | ||
286 | { | ||
287 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n" | ||
288 | "type %x\n", *mpt); | ||
289 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | ||
290 | 1, mpc, mpc->length, 1); | ||
291 | } | ||
292 | |||
278 | static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | 293 | static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) |
279 | { | 294 | { |
280 | char str[16]; | 295 | char str[16]; |
@@ -310,61 +325,30 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | |||
310 | while (count < mpc->length) { | 325 | while (count < mpc->length) { |
311 | switch (*mpt) { | 326 | switch (*mpt) { |
312 | case MP_PROCESSOR: | 327 | case MP_PROCESSOR: |
313 | { | 328 | /* ACPI may have already provided this data */ |
314 | struct mpc_cpu *m = (struct mpc_cpu *)mpt; | 329 | if (!acpi_lapic) |
315 | /* ACPI may have already provided this data */ | 330 | MP_processor_info((struct mpc_cpu *)mpt); |
316 | if (!acpi_lapic) | 331 | skip_entry(&mpt, &count, sizeof(struct mpc_cpu)); |
317 | MP_processor_info(m); | 332 | break; |
318 | mpt += sizeof(*m); | ||
319 | count += sizeof(*m); | ||
320 | break; | ||
321 | } | ||
322 | case MP_BUS: | 333 | case MP_BUS: |
323 | { | 334 | MP_bus_info((struct mpc_bus *)mpt); |
324 | struct mpc_bus *m = (struct mpc_bus *)mpt; | 335 | skip_entry(&mpt, &count, sizeof(struct mpc_bus)); |
325 | #ifdef CONFIG_X86_IO_APIC | 336 | break; |
326 | MP_bus_info(m); | ||
327 | #endif | ||
328 | mpt += sizeof(*m); | ||
329 | count += sizeof(*m); | ||
330 | break; | ||
331 | } | ||
332 | case MP_IOAPIC: | 337 | case MP_IOAPIC: |
333 | { | 338 | MP_ioapic_info((struct mpc_ioapic *)mpt); |
334 | #ifdef CONFIG_X86_IO_APIC | 339 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); |
335 | struct mpc_ioapic *m = (struct mpc_ioapic *)mpt; | 340 | break; |
336 | MP_ioapic_info(m); | ||
337 | #endif | ||
338 | mpt += sizeof(struct mpc_ioapic); | ||
339 | count += sizeof(struct mpc_ioapic); | ||
340 | break; | ||
341 | } | ||
342 | case MP_INTSRC: | 341 | case MP_INTSRC: |
343 | { | 342 | MP_intsrc_info((struct mpc_intsrc *)mpt); |
344 | #ifdef CONFIG_X86_IO_APIC | 343 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); |
345 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; | 344 | break; |
346 | |||
347 | MP_intsrc_info(m); | ||
348 | #endif | ||
349 | mpt += sizeof(struct mpc_intsrc); | ||
350 | count += sizeof(struct mpc_intsrc); | ||
351 | break; | ||
352 | } | ||
353 | case MP_LINTSRC: | 345 | case MP_LINTSRC: |
354 | { | 346 | MP_lintsrc_info((struct mpc_lintsrc *)mpt); |
355 | struct mpc_lintsrc *m = | 347 | skip_entry(&mpt, &count, sizeof(struct mpc_lintsrc)); |
356 | (struct mpc_lintsrc *)mpt; | 348 | break; |
357 | MP_lintsrc_info(m); | ||
358 | mpt += sizeof(*m); | ||
359 | count += sizeof(*m); | ||
360 | break; | ||
361 | } | ||
362 | default: | 349 | default: |
363 | /* wrong mptable */ | 350 | /* wrong mptable */ |
364 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); | 351 | smp_dump_mptable(mpc, mpt); |
365 | printk(KERN_ERR "type %x\n", *mpt); | ||
366 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | ||
367 | 1, mpc, mpc->length, 1); | ||
368 | count = mpc->length; | 352 | count = mpc->length; |
369 | break; | 353 | break; |
370 | } | 354 | } |
@@ -558,6 +542,68 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
558 | 542 | ||
559 | static struct mpf_intel *mpf_found; | 543 | static struct mpf_intel *mpf_found; |
560 | 544 | ||
545 | static unsigned long __init get_mpc_size(unsigned long physptr) | ||
546 | { | ||
547 | struct mpc_table *mpc; | ||
548 | unsigned long size; | ||
549 | |||
550 | mpc = early_ioremap(physptr, PAGE_SIZE); | ||
551 | size = mpc->length; | ||
552 | early_iounmap(mpc, PAGE_SIZE); | ||
553 | apic_printk(APIC_VERBOSE, " mpc: %lx-%lx\n", physptr, physptr + size); | ||
554 | |||
555 | return size; | ||
556 | } | ||
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 | |||
561 | /* | 607 | /* |
562 | * Scan the memory blocks for an SMP configuration block. | 608 | * Scan the memory blocks for an SMP configuration block. |
563 | */ | 609 | */ |
@@ -611,45 +657,8 @@ static void __init __get_smp_config(unsigned int early) | |||
611 | construct_default_ISA_mptable(mpf->feature1); | 657 | construct_default_ISA_mptable(mpf->feature1); |
612 | 658 | ||
613 | } else if (mpf->physptr) { | 659 | } else if (mpf->physptr) { |
614 | 660 | if (check_physptr(mpf, early)) | |
615 | /* | ||
616 | * Read the physical hardware table. Anything here will | ||
617 | * override the defaults. | ||
618 | */ | ||
619 | if (!smp_read_mpc(phys_to_virt(mpf->physptr), early)) { | ||
620 | #ifdef CONFIG_X86_LOCAL_APIC | ||
621 | smp_found_config = 0; | ||
622 | #endif | ||
623 | printk(KERN_ERR | ||
624 | "BIOS bug, MP table errors detected!...\n"); | ||
625 | printk(KERN_ERR "... disabling SMP support. " | ||
626 | "(tell your hw vendor)\n"); | ||
627 | return; | ||
628 | } | ||
629 | |||
630 | if (early) | ||
631 | return; | 661 | return; |
632 | #ifdef CONFIG_X86_IO_APIC | ||
633 | /* | ||
634 | * If there are no explicit MP IRQ entries, then we are | ||
635 | * broken. We set up most of the low 16 IO-APIC pins to | ||
636 | * ISA defaults and hope it will work. | ||
637 | */ | ||
638 | if (!mp_irq_entries) { | ||
639 | struct mpc_bus bus; | ||
640 | |||
641 | printk(KERN_ERR "BIOS bug, no explicit IRQ entries, " | ||
642 | "using default mptable. " | ||
643 | "(tell your hw vendor)\n"); | ||
644 | |||
645 | bus.type = MP_BUS; | ||
646 | bus.busid = 0; | ||
647 | memcpy(bus.bustype, "ISA ", 6); | ||
648 | MP_bus_info(&bus); | ||
649 | |||
650 | construct_default_ioirq_mptable(0); | ||
651 | } | ||
652 | #endif | ||
653 | } else | 662 | } else |
654 | BUG(); | 663 | BUG(); |
655 | 664 | ||
@@ -670,6 +679,31 @@ void __init get_smp_config(void) | |||
670 | __get_smp_config(0); | 679 | __get_smp_config(0); |
671 | } | 680 | } |
672 | 681 | ||
682 | static void smp_reserve_bootmem(struct mpf_intel *mpf) | ||
683 | { | ||
684 | unsigned long size = get_mpc_size(mpf->physptr); | ||
685 | #ifdef CONFIG_X86_32 | ||
686 | /* | ||
687 | * We cannot access to MPC table to compute table size yet, | ||
688 | * as only few megabytes from the bottom is mapped now. | ||
689 | * PC-9800's MPC table places on the very last of physical | ||
690 | * memory; so that simply reserving PAGE_SIZE from mpf->physptr | ||
691 | * yields BUG() in reserve_bootmem. | ||
692 | * also need to make sure physptr is below than max_low_pfn | ||
693 | * we don't need reserve the area above max_low_pfn | ||
694 | */ | ||
695 | unsigned long end = max_low_pfn * PAGE_SIZE; | ||
696 | |||
697 | if (mpf->physptr < end) { | ||
698 | if (mpf->physptr + size > end) | ||
699 | size = end - mpf->physptr; | ||
700 | reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT); | ||
701 | } | ||
702 | #else | ||
703 | reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT); | ||
704 | #endif | ||
705 | } | ||
706 | |||
673 | static int __init smp_scan_config(unsigned long base, unsigned long length, | 707 | static int __init smp_scan_config(unsigned long base, unsigned long length, |
674 | unsigned reserve) | 708 | unsigned reserve) |
675 | { | 709 | { |
@@ -697,36 +731,10 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
697 | 731 | ||
698 | if (!reserve) | 732 | if (!reserve) |
699 | return 1; | 733 | return 1; |
700 | reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE, | 734 | reserve_bootmem_generic(virt_to_phys(mpf), sizeof(*mpf), |
701 | BOOTMEM_DEFAULT); | ||
702 | if (mpf->physptr) { | ||
703 | unsigned long size = PAGE_SIZE; | ||
704 | #ifdef CONFIG_X86_32 | ||
705 | /* | ||
706 | * We cannot access to MPC table to compute | ||
707 | * table size yet, as only few megabytes from | ||
708 | * the bottom is mapped now. | ||
709 | * PC-9800's MPC table places on the very last | ||
710 | * of physical memory; so that simply reserving | ||
711 | * PAGE_SIZE from mpf->physptr yields BUG() | ||
712 | * in reserve_bootmem. | ||
713 | * also need to make sure physptr is below than | ||
714 | * max_low_pfn | ||
715 | * we don't need reserve the area above max_low_pfn | ||
716 | */ | ||
717 | unsigned long end = max_low_pfn * PAGE_SIZE; | ||
718 | |||
719 | if (mpf->physptr < end) { | ||
720 | if (mpf->physptr + size > end) | ||
721 | size = end - mpf->physptr; | ||
722 | reserve_bootmem_generic(mpf->physptr, size, | ||
723 | BOOTMEM_DEFAULT); | ||
724 | } | ||
725 | #else | ||
726 | reserve_bootmem_generic(mpf->physptr, size, | ||
727 | BOOTMEM_DEFAULT); | 735 | BOOTMEM_DEFAULT); |
728 | #endif | 736 | if (mpf->physptr) |
729 | } | 737 | smp_reserve_bootmem(mpf); |
730 | 738 | ||
731 | return 1; | 739 | return 1; |
732 | } | 740 | } |
@@ -829,7 +837,57 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m) | |||
829 | #define SPARE_SLOT_NUM 20 | 837 | #define SPARE_SLOT_NUM 20 |
830 | 838 | ||
831 | static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; | 839 | static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; |
832 | #endif | 840 | |
841 | static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) | ||
842 | { | ||
843 | int i; | ||
844 | |||
845 | apic_printk(APIC_VERBOSE, "OLD "); | ||
846 | print_MP_intsrc_info(m); | ||
847 | |||
848 | i = get_MP_intsrc_index(m); | ||
849 | if (i > 0) { | ||
850 | assign_to_mpc_intsrc(&mp_irqs[i], m); | ||
851 | apic_printk(APIC_VERBOSE, "NEW "); | ||
852 | print_mp_irq_info(&mp_irqs[i]); | ||
853 | return; | ||
854 | } | ||
855 | if (!i) { | ||
856 | /* legacy, do nothing */ | ||
857 | return; | ||
858 | } | ||
859 | if (*nr_m_spare < SPARE_SLOT_NUM) { | ||
860 | /* | ||
861 | * not found (-1), or duplicated (-2) are invalid entries, | ||
862 | * we need to use the slot later | ||
863 | */ | ||
864 | m_spare[*nr_m_spare] = m; | ||
865 | *nr_m_spare += 1; | ||
866 | } | ||
867 | } | ||
868 | #else /* CONFIG_X86_IO_APIC */ | ||
869 | static inline void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {} | ||
870 | #endif /* CONFIG_X86_IO_APIC */ | ||
871 | |||
872 | static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length, | ||
873 | int count) | ||
874 | { | ||
875 | if (!mpc_new_phys) { | ||
876 | pr_info("No spare slots, try to append...take your risk, " | ||
877 | "new mpc_length %x\n", count); | ||
878 | } else { | ||
879 | if (count <= mpc_new_length) | ||
880 | pr_info("No spare slots, try to append..., " | ||
881 | "new mpc_length %x\n", count); | ||
882 | else { | ||
883 | pr_err("mpc_new_length %lx is too small\n", | ||
884 | mpc_new_length); | ||
885 | return -1; | ||
886 | } | ||
887 | } | ||
888 | |||
889 | return 0; | ||
890 | } | ||
833 | 891 | ||
834 | static int __init replace_intsrc_all(struct mpc_table *mpc, | 892 | static int __init replace_intsrc_all(struct mpc_table *mpc, |
835 | unsigned long mpc_new_phys, | 893 | unsigned long mpc_new_phys, |
@@ -837,77 +895,33 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, | |||
837 | { | 895 | { |
838 | #ifdef CONFIG_X86_IO_APIC | 896 | #ifdef CONFIG_X86_IO_APIC |
839 | int i; | 897 | int i; |
840 | int nr_m_spare = 0; | ||
841 | #endif | 898 | #endif |
842 | |||
843 | int count = sizeof(*mpc); | 899 | int count = sizeof(*mpc); |
900 | int nr_m_spare = 0; | ||
844 | unsigned char *mpt = ((unsigned char *)mpc) + count; | 901 | unsigned char *mpt = ((unsigned char *)mpc) + count; |
845 | 902 | ||
846 | printk(KERN_INFO "mpc_length %x\n", mpc->length); | 903 | printk(KERN_INFO "mpc_length %x\n", mpc->length); |
847 | while (count < mpc->length) { | 904 | while (count < mpc->length) { |
848 | switch (*mpt) { | 905 | switch (*mpt) { |
849 | case MP_PROCESSOR: | 906 | case MP_PROCESSOR: |
850 | { | 907 | skip_entry(&mpt, &count, sizeof(struct mpc_cpu)); |
851 | struct mpc_cpu *m = (struct mpc_cpu *)mpt; | 908 | break; |
852 | mpt += sizeof(*m); | ||
853 | count += sizeof(*m); | ||
854 | break; | ||
855 | } | ||
856 | case MP_BUS: | 909 | case MP_BUS: |
857 | { | 910 | skip_entry(&mpt, &count, sizeof(struct mpc_bus)); |
858 | struct mpc_bus *m = (struct mpc_bus *)mpt; | 911 | break; |
859 | mpt += sizeof(*m); | ||
860 | count += sizeof(*m); | ||
861 | break; | ||
862 | } | ||
863 | case MP_IOAPIC: | 912 | case MP_IOAPIC: |
864 | { | 913 | skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); |
865 | mpt += sizeof(struct mpc_ioapic); | 914 | break; |
866 | count += sizeof(struct mpc_ioapic); | ||
867 | break; | ||
868 | } | ||
869 | case MP_INTSRC: | 915 | case MP_INTSRC: |
870 | { | 916 | check_irq_src((struct mpc_intsrc *)mpt, &nr_m_spare); |
871 | #ifdef CONFIG_X86_IO_APIC | 917 | skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); |
872 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; | 918 | break; |
873 | |||
874 | printk(KERN_INFO "OLD "); | ||
875 | print_MP_intsrc_info(m); | ||
876 | i = get_MP_intsrc_index(m); | ||
877 | if (i > 0) { | ||
878 | assign_to_mpc_intsrc(&mp_irqs[i], m); | ||
879 | printk(KERN_INFO "NEW "); | ||
880 | print_mp_irq_info(&mp_irqs[i]); | ||
881 | } else if (!i) { | ||
882 | /* legacy, do nothing */ | ||
883 | } else if (nr_m_spare < SPARE_SLOT_NUM) { | ||
884 | /* | ||
885 | * not found (-1), or duplicated (-2) | ||
886 | * are invalid entries, | ||
887 | * we need to use the slot later | ||
888 | */ | ||
889 | m_spare[nr_m_spare] = m; | ||
890 | nr_m_spare++; | ||
891 | } | ||
892 | #endif | ||
893 | mpt += sizeof(struct mpc_intsrc); | ||
894 | count += sizeof(struct mpc_intsrc); | ||
895 | break; | ||
896 | } | ||
897 | case MP_LINTSRC: | 919 | case MP_LINTSRC: |
898 | { | 920 | skip_entry(&mpt, &count, sizeof(struct mpc_lintsrc)); |
899 | struct mpc_lintsrc *m = | 921 | break; |
900 | (struct mpc_lintsrc *)mpt; | ||
901 | mpt += sizeof(*m); | ||
902 | count += sizeof(*m); | ||
903 | break; | ||
904 | } | ||
905 | default: | 922 | default: |
906 | /* wrong mptable */ | 923 | /* wrong mptable */ |
907 | printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); | 924 | smp_dump_mptable(mpc, mpt); |
908 | printk(KERN_ERR "type %x\n", *mpt); | ||
909 | print_hex_dump(KERN_ERR, " ", DUMP_PREFIX_ADDRESS, 16, | ||
910 | 1, mpc, mpc->length, 1); | ||
911 | goto out; | 925 | goto out; |
912 | } | 926 | } |
913 | } | 927 | } |
@@ -924,23 +938,15 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, | |||
924 | continue; | 938 | continue; |
925 | 939 | ||
926 | if (nr_m_spare > 0) { | 940 | if (nr_m_spare > 0) { |
927 | printk(KERN_INFO "*NEW* found "); | 941 | apic_printk(APIC_VERBOSE, "*NEW* found\n"); |
928 | nr_m_spare--; | 942 | nr_m_spare--; |
929 | assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); | 943 | assign_to_mpc_intsrc(&mp_irqs[i], m_spare[nr_m_spare]); |
930 | m_spare[nr_m_spare] = NULL; | 944 | m_spare[nr_m_spare] = NULL; |
931 | } else { | 945 | } else { |
932 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; | 946 | struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; |
933 | count += sizeof(struct mpc_intsrc); | 947 | count += sizeof(struct mpc_intsrc); |
934 | if (!mpc_new_phys) { | 948 | if (!check_slot(mpc_new_phys, mpc_new_length, count)) |
935 | printk(KERN_INFO "No spare slots, try to append...take your risk, new mpc_length %x\n", count); | 949 | goto out; |
936 | } else { | ||
937 | if (count <= mpc_new_length) | ||
938 | printk(KERN_INFO "No spare slots, try to append..., new mpc_length %x\n", count); | ||
939 | else { | ||
940 | printk(KERN_ERR "mpc_new_length %lx is too small\n", mpc_new_length); | ||
941 | goto out; | ||
942 | } | ||
943 | } | ||
944 | assign_to_mpc_intsrc(&mp_irqs[i], m); | 950 | assign_to_mpc_intsrc(&mp_irqs[i], m); |
945 | mpc->length = count; | 951 | mpc->length = count; |
946 | mpt += sizeof(struct mpc_intsrc); | 952 | mpt += sizeof(struct mpc_intsrc); |