diff options
Diffstat (limited to 'arch/x86/kernel/cpu/common.c')
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c6049650c093..2346c95c6ab1 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/archrandom.h> | 19 | #include <asm/archrandom.h> |
20 | #include <asm/hypervisor.h> | 20 | #include <asm/hypervisor.h> |
21 | #include <asm/processor.h> | 21 | #include <asm/processor.h> |
22 | #include <asm/tlbflush.h> | ||
22 | #include <asm/debugreg.h> | 23 | #include <asm/debugreg.h> |
23 | #include <asm/sections.h> | 24 | #include <asm/sections.h> |
24 | #include <asm/vsyscall.h> | 25 | #include <asm/vsyscall.h> |
@@ -278,7 +279,7 @@ __setup("nosmep", setup_disable_smep); | |||
278 | static __always_inline void setup_smep(struct cpuinfo_x86 *c) | 279 | static __always_inline void setup_smep(struct cpuinfo_x86 *c) |
279 | { | 280 | { |
280 | if (cpu_has(c, X86_FEATURE_SMEP)) | 281 | if (cpu_has(c, X86_FEATURE_SMEP)) |
281 | set_in_cr4(X86_CR4_SMEP); | 282 | cr4_set_bits(X86_CR4_SMEP); |
282 | } | 283 | } |
283 | 284 | ||
284 | static __init int setup_disable_smap(char *arg) | 285 | static __init int setup_disable_smap(char *arg) |
@@ -298,9 +299,9 @@ static __always_inline void setup_smap(struct cpuinfo_x86 *c) | |||
298 | 299 | ||
299 | if (cpu_has(c, X86_FEATURE_SMAP)) { | 300 | if (cpu_has(c, X86_FEATURE_SMAP)) { |
300 | #ifdef CONFIG_X86_SMAP | 301 | #ifdef CONFIG_X86_SMAP |
301 | set_in_cr4(X86_CR4_SMAP); | 302 | cr4_set_bits(X86_CR4_SMAP); |
302 | #else | 303 | #else |
303 | clear_in_cr4(X86_CR4_SMAP); | 304 | cr4_clear_bits(X86_CR4_SMAP); |
304 | #endif | 305 | #endif |
305 | } | 306 | } |
306 | } | 307 | } |
@@ -491,17 +492,18 @@ u16 __read_mostly tlb_lld_2m[NR_INFO]; | |||
491 | u16 __read_mostly tlb_lld_4m[NR_INFO]; | 492 | u16 __read_mostly tlb_lld_4m[NR_INFO]; |
492 | u16 __read_mostly tlb_lld_1g[NR_INFO]; | 493 | u16 __read_mostly tlb_lld_1g[NR_INFO]; |
493 | 494 | ||
494 | void cpu_detect_tlb(struct cpuinfo_x86 *c) | 495 | static void cpu_detect_tlb(struct cpuinfo_x86 *c) |
495 | { | 496 | { |
496 | if (this_cpu->c_detect_tlb) | 497 | if (this_cpu->c_detect_tlb) |
497 | this_cpu->c_detect_tlb(c); | 498 | this_cpu->c_detect_tlb(c); |
498 | 499 | ||
499 | printk(KERN_INFO "Last level iTLB entries: 4KB %d, 2MB %d, 4MB %d\n" | 500 | pr_info("Last level iTLB entries: 4KB %d, 2MB %d, 4MB %d\n", |
500 | "Last level dTLB entries: 4KB %d, 2MB %d, 4MB %d, 1GB %d\n", | ||
501 | tlb_lli_4k[ENTRIES], tlb_lli_2m[ENTRIES], | 501 | tlb_lli_4k[ENTRIES], tlb_lli_2m[ENTRIES], |
502 | tlb_lli_4m[ENTRIES], tlb_lld_4k[ENTRIES], | 502 | tlb_lli_4m[ENTRIES]); |
503 | tlb_lld_2m[ENTRIES], tlb_lld_4m[ENTRIES], | 503 | |
504 | tlb_lld_1g[ENTRIES]); | 504 | pr_info("Last level dTLB entries: 4KB %d, 2MB %d, 4MB %d, 1GB %d\n", |
505 | tlb_lld_4k[ENTRIES], tlb_lld_2m[ENTRIES], | ||
506 | tlb_lld_4m[ENTRIES], tlb_lld_1g[ENTRIES]); | ||
505 | } | 507 | } |
506 | 508 | ||
507 | void detect_ht(struct cpuinfo_x86 *c) | 509 | void detect_ht(struct cpuinfo_x86 *c) |
@@ -1294,6 +1296,12 @@ void cpu_init(void) | |||
1294 | wait_for_master_cpu(cpu); | 1296 | wait_for_master_cpu(cpu); |
1295 | 1297 | ||
1296 | /* | 1298 | /* |
1299 | * Initialize the CR4 shadow before doing anything that could | ||
1300 | * try to read it. | ||
1301 | */ | ||
1302 | cr4_init_shadow(); | ||
1303 | |||
1304 | /* | ||
1297 | * Load microcode on this cpu if a valid microcode is available. | 1305 | * Load microcode on this cpu if a valid microcode is available. |
1298 | * This is early microcode loading procedure. | 1306 | * This is early microcode loading procedure. |
1299 | */ | 1307 | */ |
@@ -1312,7 +1320,7 @@ void cpu_init(void) | |||
1312 | 1320 | ||
1313 | pr_debug("Initializing CPU#%d\n", cpu); | 1321 | pr_debug("Initializing CPU#%d\n", cpu); |
1314 | 1322 | ||
1315 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); | 1323 | cr4_clear_bits(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); |
1316 | 1324 | ||
1317 | /* | 1325 | /* |
1318 | * Initialize the per-CPU GDT with the boot GDT, | 1326 | * Initialize the per-CPU GDT with the boot GDT, |
@@ -1332,7 +1340,7 @@ void cpu_init(void) | |||
1332 | barrier(); | 1340 | barrier(); |
1333 | 1341 | ||
1334 | x86_configure_nx(); | 1342 | x86_configure_nx(); |
1335 | enable_x2apic(); | 1343 | x2apic_setup(); |
1336 | 1344 | ||
1337 | /* | 1345 | /* |
1338 | * set up and load the per-CPU TSS | 1346 | * set up and load the per-CPU TSS |
@@ -1388,12 +1396,18 @@ void cpu_init(void) | |||
1388 | 1396 | ||
1389 | wait_for_master_cpu(cpu); | 1397 | wait_for_master_cpu(cpu); |
1390 | 1398 | ||
1399 | /* | ||
1400 | * Initialize the CR4 shadow before doing anything that could | ||
1401 | * try to read it. | ||
1402 | */ | ||
1403 | cr4_init_shadow(); | ||
1404 | |||
1391 | show_ucode_info_early(); | 1405 | show_ucode_info_early(); |
1392 | 1406 | ||
1393 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); | 1407 | printk(KERN_INFO "Initializing CPU#%d\n", cpu); |
1394 | 1408 | ||
1395 | if (cpu_feature_enabled(X86_FEATURE_VME) || cpu_has_tsc || cpu_has_de) | 1409 | if (cpu_feature_enabled(X86_FEATURE_VME) || cpu_has_tsc || cpu_has_de) |
1396 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); | 1410 | cr4_clear_bits(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); |
1397 | 1411 | ||
1398 | load_current_idt(); | 1412 | load_current_idt(); |
1399 | switch_to_new_gdt(cpu); | 1413 | switch_to_new_gdt(cpu); |