diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-03-05 15:49:35 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-03-05 15:49:35 -0500 |
commit | 28e93a005b65cc5b4f569642e9c7903618ea5fe1 (patch) | |
tree | 3c98b8dc457b05b290ad640c413e453a264739bf /arch/x86/kernel | |
parent | caab36b593b44c97e3c7707c6a8054b320f8d622 (diff) | |
parent | ed26dbe5ae045e5bf95c6dc27497397a3fde52e1 (diff) |
Merge branch 'x86/mm' into x86/core
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/mpparse.c | 25 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 4 |
2 files changed, 25 insertions, 4 deletions
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 37cb1bda1baf..e8192401da47 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -558,6 +558,19 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
558 | 558 | ||
559 | static struct mpf_intel *mpf_found; | 559 | static struct mpf_intel *mpf_found; |
560 | 560 | ||
561 | static unsigned long __init get_mpc_size(unsigned long physptr) | ||
562 | { | ||
563 | struct mpc_table *mpc; | ||
564 | unsigned long size; | ||
565 | |||
566 | mpc = early_ioremap(physptr, PAGE_SIZE); | ||
567 | size = mpc->length; | ||
568 | early_iounmap(mpc, PAGE_SIZE); | ||
569 | apic_printk(APIC_VERBOSE, " mpc: %lx-%lx\n", physptr, physptr + size); | ||
570 | |||
571 | return size; | ||
572 | } | ||
573 | |||
561 | /* | 574 | /* |
562 | * Scan the memory blocks for an SMP configuration block. | 575 | * Scan the memory blocks for an SMP configuration block. |
563 | */ | 576 | */ |
@@ -611,12 +624,16 @@ static void __init __get_smp_config(unsigned int early) | |||
611 | construct_default_ISA_mptable(mpf->feature1); | 624 | construct_default_ISA_mptable(mpf->feature1); |
612 | 625 | ||
613 | } else if (mpf->physptr) { | 626 | } else if (mpf->physptr) { |
627 | struct mpc_table *mpc; | ||
628 | unsigned long size; | ||
614 | 629 | ||
630 | size = get_mpc_size(mpf->physptr); | ||
631 | mpc = early_ioremap(mpf->physptr, size); | ||
615 | /* | 632 | /* |
616 | * Read the physical hardware table. Anything here will | 633 | * Read the physical hardware table. Anything here will |
617 | * override the defaults. | 634 | * override the defaults. |
618 | */ | 635 | */ |
619 | if (!smp_read_mpc(phys_to_virt(mpf->physptr), early)) { | 636 | if (!smp_read_mpc(mpc, early)) { |
620 | #ifdef CONFIG_X86_LOCAL_APIC | 637 | #ifdef CONFIG_X86_LOCAL_APIC |
621 | smp_found_config = 0; | 638 | smp_found_config = 0; |
622 | #endif | 639 | #endif |
@@ -624,8 +641,10 @@ static void __init __get_smp_config(unsigned int early) | |||
624 | "BIOS bug, MP table errors detected!...\n"); | 641 | "BIOS bug, MP table errors detected!...\n"); |
625 | printk(KERN_ERR "... disabling SMP support. " | 642 | printk(KERN_ERR "... disabling SMP support. " |
626 | "(tell your hw vendor)\n"); | 643 | "(tell your hw vendor)\n"); |
644 | early_iounmap(mpc, size); | ||
627 | return; | 645 | return; |
628 | } | 646 | } |
647 | early_iounmap(mpc, size); | ||
629 | 648 | ||
630 | if (early) | 649 | if (early) |
631 | return; | 650 | return; |
@@ -697,10 +716,10 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
697 | 716 | ||
698 | if (!reserve) | 717 | if (!reserve) |
699 | return 1; | 718 | return 1; |
700 | reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE, | 719 | reserve_bootmem_generic(virt_to_phys(mpf), sizeof(*mpf), |
701 | BOOTMEM_DEFAULT); | 720 | BOOTMEM_DEFAULT); |
702 | if (mpf->physptr) { | 721 | if (mpf->physptr) { |
703 | unsigned long size = PAGE_SIZE; | 722 | unsigned long size = get_mpc_size(mpf->physptr); |
704 | #ifdef CONFIG_X86_32 | 723 | #ifdef CONFIG_X86_32 |
705 | /* | 724 | /* |
706 | * We cannot access to MPC table to compute | 725 | * We cannot access to MPC table to compute |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index b746deb9ebc6..f28c56e6bf94 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -202,7 +202,9 @@ struct ist_info ist_info; | |||
202 | #endif | 202 | #endif |
203 | 203 | ||
204 | #else | 204 | #else |
205 | struct cpuinfo_x86 boot_cpu_data __read_mostly; | 205 | struct cpuinfo_x86 boot_cpu_data __read_mostly = { |
206 | .x86_phys_bits = MAX_PHYSMEM_BITS, | ||
207 | }; | ||
206 | EXPORT_SYMBOL(boot_cpu_data); | 208 | EXPORT_SYMBOL(boot_cpu_data); |
207 | #endif | 209 | #endif |
208 | 210 | ||