aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/head_64.S')
-rw-r--r--arch/x86/kernel/head_64.S35
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
1841: 1841:
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; \
442GLOBAL(name) 442GLOBAL(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; \
459GLOBAL(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
453NEXT_PAGE(early_level4_pgt) 474NEXT_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
457NEXT_PAGE(early_dynamic_pgts) 479NEXT_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
463NEXT_PAGE(init_level4_pgt) 485NEXT_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
466NEXT_PAGE(init_level4_pgt) 489NEXT_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
474NEXT_PAGE(level3_ident_pgt) 498NEXT_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
484NEXT_PAGE(level3_kernel_pgt) 509NEXT_PAGE(level3_kernel_pgt)
485 .fill L3_START_KERNEL,8,0 510 .fill L3_START_KERNEL,8,0