diff options
| -rw-r--r-- | arch/x86/include/asm/fixmap.h | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/intel.c | 18 | ||||
| -rw-r--r-- | arch/x86/kernel/traps.c | 9 | ||||
| -rw-r--r-- | arch/x86/xen/mmu.c | 4 |
4 files changed, 12 insertions, 23 deletions
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index a09c28571064..51b9e322cb8f 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h | |||
| @@ -104,9 +104,7 @@ enum fixed_addresses { | |||
| 104 | FIX_LI_PCIA, /* Lithium PCI Bridge A */ | 104 | FIX_LI_PCIA, /* Lithium PCI Bridge A */ |
| 105 | FIX_LI_PCIB, /* Lithium PCI Bridge B */ | 105 | FIX_LI_PCIB, /* Lithium PCI Bridge B */ |
| 106 | #endif | 106 | #endif |
| 107 | #ifdef CONFIG_X86_F00F_BUG | 107 | FIX_RO_IDT, /* Virtual mapping for read-only IDT */ |
| 108 | FIX_F00F_IDT, /* Virtual mapping for IDT */ | ||
| 109 | #endif | ||
| 110 | #ifdef CONFIG_X86_CYCLONE_TIMER | 108 | #ifdef CONFIG_X86_CYCLONE_TIMER |
| 111 | FIX_CYCLONE_TIMER, /*cyclone timer register*/ | 109 | FIX_CYCLONE_TIMER, /*cyclone timer register*/ |
| 112 | #endif | 110 | #endif |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 1905ce98bee0..71700247a5d7 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -164,20 +164,6 @@ int __cpuinit ppro_with_ram_bug(void) | |||
| 164 | return 0; | 164 | return 0; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | #ifdef CONFIG_X86_F00F_BUG | ||
| 168 | static void __cpuinit trap_init_f00f_bug(void) | ||
| 169 | { | ||
| 170 | __set_fixmap(FIX_F00F_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO); | ||
| 171 | |||
| 172 | /* | ||
| 173 | * Update the IDT descriptor and reload the IDT so that | ||
| 174 | * it uses the read-only mapped virtual address. | ||
| 175 | */ | ||
| 176 | idt_descr.address = fix_to_virt(FIX_F00F_IDT); | ||
| 177 | load_idt(&idt_descr); | ||
| 178 | } | ||
| 179 | #endif | ||
| 180 | |||
| 181 | static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c) | 167 | static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c) |
| 182 | { | 168 | { |
| 183 | /* calling is from identify_secondary_cpu() ? */ | 169 | /* calling is from identify_secondary_cpu() ? */ |
| @@ -206,8 +192,7 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | |||
| 206 | /* | 192 | /* |
| 207 | * All current models of Pentium and Pentium with MMX technology CPUs | 193 | * All current models of Pentium and Pentium with MMX technology CPUs |
| 208 | * have the F0 0F bug, which lets nonprivileged users lock up the | 194 | * have the F0 0F bug, which lets nonprivileged users lock up the |
| 209 | * system. | 195 | * system. Announce that the fault handler will be checking for it. |
| 210 | * Note that the workaround only should be initialized once... | ||
| 211 | */ | 196 | */ |
| 212 | c->f00f_bug = 0; | 197 | c->f00f_bug = 0; |
| 213 | if (!paravirt_enabled() && c->x86 == 5) { | 198 | if (!paravirt_enabled() && c->x86 == 5) { |
| @@ -215,7 +200,6 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | |||
| 215 | 200 | ||
| 216 | c->f00f_bug = 1; | 201 | c->f00f_bug = 1; |
| 217 | if (!f00f_workaround_enabled) { | 202 | if (!f00f_workaround_enabled) { |
| 218 | trap_init_f00f_bug(); | ||
| 219 | printk(KERN_NOTICE "Intel Pentium with F0 0F bug - workaround enabled.\n"); | 203 | printk(KERN_NOTICE "Intel Pentium with F0 0F bug - workaround enabled.\n"); |
| 220 | f00f_workaround_enabled = 1; | 204 | f00f_workaround_enabled = 1; |
| 221 | } | 205 | } |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 68bda7a84159..10e24462c058 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -56,6 +56,7 @@ | |||
| 56 | #include <asm/fpu-internal.h> | 56 | #include <asm/fpu-internal.h> |
| 57 | #include <asm/mce.h> | 57 | #include <asm/mce.h> |
| 58 | #include <asm/context_tracking.h> | 58 | #include <asm/context_tracking.h> |
| 59 | #include <asm/fixmap.h> | ||
| 59 | 60 | ||
| 60 | #include <asm/mach_traps.h> | 61 | #include <asm/mach_traps.h> |
| 61 | 62 | ||
| @@ -753,6 +754,14 @@ void __init trap_init(void) | |||
| 753 | #endif | 754 | #endif |
| 754 | 755 | ||
| 755 | /* | 756 | /* |
| 757 | * Set the IDT descriptor to a fixed read-only location, so that the | ||
| 758 | * "sidt" instruction will not leak the location of the kernel, and | ||
| 759 | * to defend the IDT against arbitrary memory write vulnerabilities. | ||
| 760 | * It will be reloaded in cpu_init() */ | ||
| 761 | __set_fixmap(FIX_RO_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO); | ||
| 762 | idt_descr.address = fix_to_virt(FIX_RO_IDT); | ||
| 763 | |||
| 764 | /* | ||
| 756 | * Should be a barrier for any external CPU state: | 765 | * Should be a barrier for any external CPU state: |
| 757 | */ | 766 | */ |
| 758 | cpu_init(); | 767 | cpu_init(); |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 6afbb2ca9a0a..8bc4decb14ca 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -2039,9 +2039,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | |||
| 2039 | 2039 | ||
| 2040 | switch (idx) { | 2040 | switch (idx) { |
| 2041 | case FIX_BTMAP_END ... FIX_BTMAP_BEGIN: | 2041 | case FIX_BTMAP_END ... FIX_BTMAP_BEGIN: |
| 2042 | #ifdef CONFIG_X86_F00F_BUG | 2042 | case FIX_RO_IDT: |
| 2043 | case FIX_F00F_IDT: | ||
| 2044 | #endif | ||
| 2045 | #ifdef CONFIG_X86_32 | 2043 | #ifdef CONFIG_X86_32 |
| 2046 | case FIX_WP_TEST: | 2044 | case FIX_WP_TEST: |
| 2047 | case FIX_VDSO: | 2045 | case FIX_VDSO: |
