diff options
Diffstat (limited to 'arch/x86/kernel/head_64.S')
-rw-r--r-- | arch/x86/kernel/head_64.S | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index ffdc0e860390..4034e905741a 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
@@ -183,8 +183,8 @@ ENTRY(secondary_startup_64) | |||
183 | movq $(init_level4_pgt - __START_KERNEL_map), %rax | 183 | movq $(init_level4_pgt - __START_KERNEL_map), %rax |
184 | 1: | 184 | 1: |
185 | 185 | ||
186 | /* Enable PAE mode and PGE */ | 186 | /* Enable PAE and PSE, but defer PGE until kaiser_enabled is decided */ |
187 | movl $(X86_CR4_PAE | X86_CR4_PGE), %ecx | 187 | movl $(X86_CR4_PAE | X86_CR4_PSE), %ecx |
188 | movq %rcx, %cr4 | 188 | movq %rcx, %cr4 |
189 | 189 | ||
190 | /* Setup early boot stage 4 level pagetables. */ | 190 | /* Setup early boot stage 4 level pagetables. */ |
@@ -441,6 +441,27 @@ early_idt_ripmsg: | |||
441 | .balign PAGE_SIZE; \ | 441 | .balign PAGE_SIZE; \ |
442 | GLOBAL(name) | 442 | GLOBAL(name) |
443 | 443 | ||
444 | #ifdef CONFIG_PAGE_TABLE_ISOLATION | ||
445 | /* | ||
446 | * Each PGD needs to be 8k long and 8k aligned. We do not | ||
447 | * ever go out to userspace with these, so we do not | ||
448 | * strictly *need* the second page, but this allows us to | ||
449 | * have a single set_pgd() implementation that does not | ||
450 | * need to worry about whether it has 4k or 8k to work | ||
451 | * with. | ||
452 | * | ||
453 | * This ensures PGDs are 8k long: | ||
454 | */ | ||
455 | #define KAISER_USER_PGD_FILL 512 | ||
456 | /* This ensures they are 8k-aligned: */ | ||
457 | #define NEXT_PGD_PAGE(name) \ | ||
458 | .balign 2 * PAGE_SIZE; \ | ||
459 | GLOBAL(name) | ||
460 | #else | ||
461 | #define NEXT_PGD_PAGE(name) NEXT_PAGE(name) | ||
462 | #define KAISER_USER_PGD_FILL 0 | ||
463 | #endif | ||
464 | |||
444 | /* Automate the creation of 1 to 1 mapping pmd entries */ | 465 | /* Automate the creation of 1 to 1 mapping pmd entries */ |
445 | #define PMDS(START, PERM, COUNT) \ | 466 | #define PMDS(START, PERM, COUNT) \ |
446 | i = 0 ; \ | 467 | i = 0 ; \ |
@@ -450,9 +471,10 @@ GLOBAL(name) | |||
450 | .endr | 471 | .endr |
451 | 472 | ||
452 | __INITDATA | 473 | __INITDATA |
453 | NEXT_PAGE(early_level4_pgt) | 474 | NEXT_PGD_PAGE(early_level4_pgt) |
454 | .fill 511,8,0 | 475 | .fill 511,8,0 |
455 | .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE | 476 | .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE |
477 | .fill KAISER_USER_PGD_FILL,8,0 | ||
456 | 478 | ||
457 | NEXT_PAGE(early_dynamic_pgts) | 479 | NEXT_PAGE(early_dynamic_pgts) |
458 | .fill 512*EARLY_DYNAMIC_PAGE_TABLES,8,0 | 480 | .fill 512*EARLY_DYNAMIC_PAGE_TABLES,8,0 |
@@ -460,16 +482,18 @@ NEXT_PAGE(early_dynamic_pgts) | |||
460 | .data | 482 | .data |
461 | 483 | ||
462 | #ifndef CONFIG_XEN | 484 | #ifndef CONFIG_XEN |
463 | NEXT_PAGE(init_level4_pgt) | 485 | NEXT_PGD_PAGE(init_level4_pgt) |
464 | .fill 512,8,0 | 486 | .fill 512,8,0 |
487 | .fill KAISER_USER_PGD_FILL,8,0 | ||
465 | #else | 488 | #else |
466 | NEXT_PAGE(init_level4_pgt) | 489 | NEXT_PGD_PAGE(init_level4_pgt) |
467 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE | 490 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE |
468 | .org init_level4_pgt + L4_PAGE_OFFSET*8, 0 | 491 | .org init_level4_pgt + L4_PAGE_OFFSET*8, 0 |
469 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE | 492 | .quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE |
470 | .org init_level4_pgt + L4_START_KERNEL*8, 0 | 493 | .org init_level4_pgt + L4_START_KERNEL*8, 0 |
471 | /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */ | 494 | /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */ |
472 | .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE | 495 | .quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE |
496 | .fill KAISER_USER_PGD_FILL,8,0 | ||
473 | 497 | ||
474 | NEXT_PAGE(level3_ident_pgt) | 498 | NEXT_PAGE(level3_ident_pgt) |
475 | .quad level2_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE | 499 | .quad level2_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE |
@@ -480,6 +504,7 @@ NEXT_PAGE(level2_ident_pgt) | |||
480 | */ | 504 | */ |
481 | PMDS(0, __PAGE_KERNEL_IDENT_LARGE_EXEC, PTRS_PER_PMD) | 505 | PMDS(0, __PAGE_KERNEL_IDENT_LARGE_EXEC, PTRS_PER_PMD) |
482 | #endif | 506 | #endif |
507 | .fill KAISER_USER_PGD_FILL,8,0 | ||
483 | 508 | ||
484 | NEXT_PAGE(level3_kernel_pgt) | 509 | NEXT_PAGE(level3_kernel_pgt) |
485 | .fill L3_START_KERNEL,8,0 | 510 | .fill L3_START_KERNEL,8,0 |