diff options
-rw-r--r-- | arch/i386/kernel/cpu/mtrr/main.c | 11 | ||||
-rw-r--r-- | arch/i386/kernel/smpboot.c | 7 | ||||
-rw-r--r-- | arch/x86_64/kernel/smpboot.c | 6 | ||||
-rw-r--r-- | include/asm-i386/mtrr.h | 2 | ||||
-rw-r--r-- | include/asm-x86_64/mtrr.h | 2 |
5 files changed, 28 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 | */ |
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c index 14724be48bec..ddc392bee243 100644 --- a/arch/x86_64/kernel/smpboot.c +++ b/arch/x86_64/kernel/smpboot.c | |||
@@ -944,6 +944,12 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
944 | return -ENOSYS; | 944 | return -ENOSYS; |
945 | } | 945 | } |
946 | 946 | ||
947 | /* | ||
948 | * Save current MTRR state in case it was changed since early boot | ||
949 | * (e.g. by the ACPI SMI) to initialize new CPUs with MTRRs in sync: | ||
950 | */ | ||
951 | mtrr_save_state(); | ||
952 | |||
947 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; | 953 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
948 | /* Boot it! */ | 954 | /* Boot it! */ |
949 | err = do_boot_cpu(cpu, apicid); | 955 | err = do_boot_cpu(cpu, apicid); |
diff --git a/include/asm-i386/mtrr.h b/include/asm-i386/mtrr.h index 02a41b99bd7e..7e9c7ccbdcfe 100644 --- a/include/asm-i386/mtrr.h +++ b/include/asm-i386/mtrr.h | |||
@@ -70,6 +70,7 @@ struct mtrr_gentry | |||
70 | /* The following functions are for use by other drivers */ | 70 | /* The following functions are for use by other drivers */ |
71 | # ifdef CONFIG_MTRR | 71 | # ifdef CONFIG_MTRR |
72 | extern void mtrr_save_fixed_ranges(void *); | 72 | extern void mtrr_save_fixed_ranges(void *); |
73 | extern void mtrr_save_state(void); | ||
73 | extern int mtrr_add (unsigned long base, unsigned long size, | 74 | extern int mtrr_add (unsigned long base, unsigned long size, |
74 | unsigned int type, char increment); | 75 | unsigned int type, char increment); |
75 | extern int mtrr_add_page (unsigned long base, unsigned long size, | 76 | extern int mtrr_add_page (unsigned long base, unsigned long size, |
@@ -81,6 +82,7 @@ extern void mtrr_ap_init(void); | |||
81 | extern void mtrr_bp_init(void); | 82 | extern void mtrr_bp_init(void); |
82 | # else | 83 | # else |
83 | #define mtrr_save_fixed_ranges(arg) do {} while (0) | 84 | #define mtrr_save_fixed_ranges(arg) do {} while (0) |
85 | #define mtrr_save_state() do {} while (0) | ||
84 | static __inline__ int mtrr_add (unsigned long base, unsigned long size, | 86 | static __inline__ int mtrr_add (unsigned long base, unsigned long size, |
85 | unsigned int type, char increment) | 87 | unsigned int type, char increment) |
86 | { | 88 | { |
diff --git a/include/asm-x86_64/mtrr.h b/include/asm-x86_64/mtrr.h index 1b326cbb9305..b557c486bef8 100644 --- a/include/asm-x86_64/mtrr.h +++ b/include/asm-x86_64/mtrr.h | |||
@@ -139,10 +139,12 @@ struct mtrr_gentry32 | |||
139 | extern void mtrr_ap_init(void); | 139 | extern void mtrr_ap_init(void); |
140 | extern void mtrr_bp_init(void); | 140 | extern void mtrr_bp_init(void); |
141 | extern void mtrr_save_fixed_ranges(void *); | 141 | extern void mtrr_save_fixed_ranges(void *); |
142 | extern void mtrr_save_state(void); | ||
142 | #else | 143 | #else |
143 | #define mtrr_ap_init() do {} while (0) | 144 | #define mtrr_ap_init() do {} while (0) |
144 | #define mtrr_bp_init() do {} while (0) | 145 | #define mtrr_bp_init() do {} while (0) |
145 | #define mtrr_save_fixed_ranges(arg) do {} while (0) | 146 | #define mtrr_save_fixed_ranges(arg) do {} while (0) |
147 | #define mtrr_save_state() do {} while (0) | ||
146 | #endif | 148 | #endif |
147 | 149 | ||
148 | #endif /* __KERNEL__ */ | 150 | #endif /* __KERNEL__ */ |