diff options
Diffstat (limited to 'arch/i386')
-rw-r--r-- | arch/i386/kernel/cpu/mtrr/main.c | 11 | ||||
-rw-r--r-- | arch/i386/kernel/smpboot.c | 7 |
2 files changed, 18 insertions, 0 deletions
diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index 0acfb6a5a220..02a2f39e5e0a 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c | |||
@@ -729,6 +729,17 @@ void mtrr_ap_init(void) | |||
729 | local_irq_restore(flags); | 729 | local_irq_restore(flags); |
730 | } | 730 | } |
731 | 731 | ||
732 | /** | ||
733 | * Save current fixed-range MTRR state of the BSP | ||
734 | */ | ||
735 | void mtrr_save_state(void) | ||
736 | { | ||
737 | if (smp_processor_id() == 0) | ||
738 | mtrr_save_fixed_ranges(NULL); | ||
739 | else | ||
740 | smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1); | ||
741 | } | ||
742 | |||
732 | static int __init mtrr_init_finialize(void) | 743 | static int __init mtrr_init_finialize(void) |
733 | { | 744 | { |
734 | if (!mtrr_if) | 745 | if (!mtrr_if) |
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index 7c1dbef399cd..f14d93351a82 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
@@ -58,6 +58,7 @@ | |||
58 | #include <mach_wakecpu.h> | 58 | #include <mach_wakecpu.h> |
59 | #include <smpboot_hooks.h> | 59 | #include <smpboot_hooks.h> |
60 | #include <asm/vmi.h> | 60 | #include <asm/vmi.h> |
61 | #include <asm/mtrr.h> | ||
61 | 62 | ||
62 | /* Set if we find a B stepping CPU */ | 63 | /* Set if we find a B stepping CPU */ |
63 | static int __devinitdata smp_b_stepping; | 64 | static int __devinitdata smp_b_stepping; |
@@ -815,6 +816,12 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu) | |||
815 | unsigned short nmi_high = 0, nmi_low = 0; | 816 | unsigned short nmi_high = 0, nmi_low = 0; |
816 | 817 | ||
817 | /* | 818 | /* |
819 | * Save current MTRR state in case it was changed since early boot | ||
820 | * (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync: | ||
821 | */ | ||
822 | mtrr_save_state(); | ||
823 | |||
824 | /* | ||
818 | * We can't use kernel_thread since we must avoid to | 825 | * We can't use kernel_thread since we must avoid to |
819 | * reschedule the child. | 826 | * reschedule the child. |
820 | */ | 827 | */ |