aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill A. Shutemov <kirill.shutemov@linux.intel.com>2018-10-26 08:28:54 -0400
committerThomas Gleixner <tglx@linutronix.de>2018-11-06 15:35:11 -0500
commitd52888aa2753e3063a9d3a0c9f72f94aa9809c15 (patch)
treefbbb33771ac6c392caeb283163a594f1a7e6d04d
parente8a308e5f47e545e0d41d0686c00f5f5217c5f61 (diff)
x86/mm: Move LDT remap out of KASLR region on 5-level paging
On 5-level paging the LDT remap area is placed in the middle of the KASLR randomization region and it can overlap with the direct mapping, the vmalloc or the vmap area. The LDT mapping is per mm, so it cannot be moved into the P4D page table next to the CPU_ENTRY_AREA without complicating PGD table allocation for 5-level paging. The 4 PGD slot gap just before the direct mapping is reserved for hypervisors, so it cannot be used. Move the direct mapping one slot deeper and use the resulting gap for the LDT remap area. The resulting layout is the same for 4 and 5 level paging. [ tglx: Massaged changelog ] Fixes: f55f0501cbf6 ("x86/pti: Put the LDT in its own PGD if PTI is on") Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Andy Lutomirski <luto@kernel.org> Cc: bp@alien8.de Cc: hpa@zytor.com Cc: dave.hansen@linux.intel.com Cc: peterz@infradead.org Cc: boris.ostrovsky@oracle.com Cc: jgross@suse.com Cc: bhe@redhat.com Cc: willy@infradead.org Cc: linux-mm@kvack.org Cc: stable@vger.kernel.org Link: https://lkml.kernel.org/r/20181026122856.66224-2-kirill.shutemov@linux.intel.com
-rw-r--r--Documentation/x86/x86_64/mm.txt34
-rw-r--r--arch/x86/include/asm/page_64_types.h12
-rw-r--r--arch/x86/include/asm/pgtable_64_types.h4
-rw-r--r--arch/x86/xen/mmu_pv.c6
4 files changed, 29 insertions, 27 deletions
diff --git a/Documentation/x86/x86_64/mm.txt b/Documentation/x86/x86_64/mm.txt
index 73aaaa3da436..804f9426ed17 100644
--- a/Documentation/x86/x86_64/mm.txt
+++ b/Documentation/x86/x86_64/mm.txt
@@ -34,23 +34,24 @@ __________________|____________|__________________|_________|___________________
34____________________________________________________________|___________________________________________________________ 34____________________________________________________________|___________________________________________________________
35 | | | | 35 | | | |
36 ffff800000000000 | -128 TB | ffff87ffffffffff | 8 TB | ... guard hole, also reserved for hypervisor 36 ffff800000000000 | -128 TB | ffff87ffffffffff | 8 TB | ... guard hole, also reserved for hypervisor
37 ffff880000000000 | -120 TB | ffffc7ffffffffff | 64 TB | direct mapping of all physical memory (page_offset_base) 37 ffff880000000000 | -120 TB | ffff887fffffffff | 0.5 TB | LDT remap for PTI
38 ffffc80000000000 | -56 TB | ffffc8ffffffffff | 1 TB | ... unused hole 38 ffff888000000000 | -119.5 TB | ffffc87fffffffff | 64 TB | direct mapping of all physical memory (page_offset_base)
39 ffffc88000000000 | -55.5 TB | ffffc8ffffffffff | 0.5 TB | ... unused hole
39 ffffc90000000000 | -55 TB | ffffe8ffffffffff | 32 TB | vmalloc/ioremap space (vmalloc_base) 40 ffffc90000000000 | -55 TB | ffffe8ffffffffff | 32 TB | vmalloc/ioremap space (vmalloc_base)
40 ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole 41 ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole
41 ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base) 42 ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base)
42 ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole 43 ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole
43 ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory 44 ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory
44 fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
45 | | | | vaddr_end for KASLR
46 fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
47 fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | LDT remap for PTI
48 ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
49__________________|____________|__________________|_________|____________________________________________________________ 45__________________|____________|__________________|_________|____________________________________________________________
50 | 46 |
51 | Identical layout to the 47-bit one from here on: 47 | Identical layout to the 56-bit one from here on:
52____________________________________________________________|____________________________________________________________ 48____________________________________________________________|____________________________________________________________
53 | | | | 49 | | | |
50 fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
51 | | | | vaddr_end for KASLR
52 fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
53 fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
54 ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
54 ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole 55 ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
55 ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space 56 ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
56 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole 57 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
@@ -83,7 +84,7 @@ Notes:
83__________________|____________|__________________|_________|___________________________________________________________ 84__________________|____________|__________________|_________|___________________________________________________________
84 | | | | 85 | | | |
85 0000800000000000 | +64 PB | ffff7fffffffffff | ~16K PB | ... huge, still almost 64 bits wide hole of non-canonical 86 0000800000000000 | +64 PB | ffff7fffffffffff | ~16K PB | ... huge, still almost 64 bits wide hole of non-canonical
86 | | | | virtual memory addresses up to the -128 TB 87 | | | | virtual memory addresses up to the -64 PB
87 | | | | starting offset of kernel mappings. 88 | | | | starting offset of kernel mappings.
88__________________|____________|__________________|_________|___________________________________________________________ 89__________________|____________|__________________|_________|___________________________________________________________
89 | 90 |
@@ -91,23 +92,24 @@ __________________|____________|__________________|_________|___________________
91____________________________________________________________|___________________________________________________________ 92____________________________________________________________|___________________________________________________________
92 | | | | 93 | | | |
93 ff00000000000000 | -64 PB | ff0fffffffffffff | 4 PB | ... guard hole, also reserved for hypervisor 94 ff00000000000000 | -64 PB | ff0fffffffffffff | 4 PB | ... guard hole, also reserved for hypervisor
94 ff10000000000000 | -60 PB | ff8fffffffffffff | 32 PB | direct mapping of all physical memory (page_offset_base) 95 ff10000000000000 | -60 PB | ff10ffffffffffff | 0.25 PB | LDT remap for PTI
95 ff90000000000000 | -28 PB | ff9fffffffffffff | 4 PB | LDT remap for PTI 96 ff11000000000000 | -59.75 PB | ff90ffffffffffff | 32 PB | direct mapping of all physical memory (page_offset_base)
97 ff91000000000000 | -27.75 PB | ff9fffffffffffff | 3.75 PB | ... unused hole
96 ffa0000000000000 | -24 PB | ffd1ffffffffffff | 12.5 PB | vmalloc/ioremap space (vmalloc_base) 98 ffa0000000000000 | -24 PB | ffd1ffffffffffff | 12.5 PB | vmalloc/ioremap space (vmalloc_base)
97 ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole 99 ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole
98 ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base) 100 ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base)
99 ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole 101 ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole
100 ffdf000000000000 | -8.25 PB | fffffdffffffffff | ~8 PB | KASAN shadow memory 102 ffdf000000000000 | -8.25 PB | fffffdffffffffff | ~8 PB | KASAN shadow memory
101 fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
102 | | | | vaddr_end for KASLR
103 fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
104 fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
105 ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
106__________________|____________|__________________|_________|____________________________________________________________ 103__________________|____________|__________________|_________|____________________________________________________________
107 | 104 |
108 | Identical layout to the 47-bit one from here on: 105 | Identical layout to the 47-bit one from here on:
109____________________________________________________________|____________________________________________________________ 106____________________________________________________________|____________________________________________________________
110 | | | | 107 | | | |
108 fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
109 | | | | vaddr_end for KASLR
110 fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
111 fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
112 ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
111 ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole 113 ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
112 ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space 114 ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
113 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole 115 ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h
index cd0cf1c568b4..8f657286d599 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -33,12 +33,14 @@
33 33
34/* 34/*
35 * Set __PAGE_OFFSET to the most negative possible address + 35 * Set __PAGE_OFFSET to the most negative possible address +
36 * PGDIR_SIZE*16 (pgd slot 272). The gap is to allow a space for a 36 * PGDIR_SIZE*17 (pgd slot 273).
37 * hypervisor to fit. Choosing 16 slots here is arbitrary, but it's 37 *
38 * what Xen requires. 38 * The gap is to allow a space for LDT remap for PTI (1 pgd slot) and space for
39 * a hypervisor (16 slots). Choosing 16 slots for a hypervisor is arbitrary,
40 * but it's what Xen requires.
39 */ 41 */
40#define __PAGE_OFFSET_BASE_L5 _AC(0xff10000000000000, UL) 42#define __PAGE_OFFSET_BASE_L5 _AC(0xff11000000000000, UL)
41#define __PAGE_OFFSET_BASE_L4 _AC(0xffff880000000000, UL) 43#define __PAGE_OFFSET_BASE_L4 _AC(0xffff888000000000, UL)
42 44
43#ifdef CONFIG_DYNAMIC_MEMORY_LAYOUT 45#ifdef CONFIG_DYNAMIC_MEMORY_LAYOUT
44#define __PAGE_OFFSET page_offset_base 46#define __PAGE_OFFSET page_offset_base
diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h
index 04edd2d58211..84bd9bdc1987 100644
--- a/arch/x86/include/asm/pgtable_64_types.h
+++ b/arch/x86/include/asm/pgtable_64_types.h
@@ -111,9 +111,7 @@ extern unsigned int ptrs_per_p4d;
111 */ 111 */
112#define MAXMEM (1UL << MAX_PHYSMEM_BITS) 112#define MAXMEM (1UL << MAX_PHYSMEM_BITS)
113 113
114#define LDT_PGD_ENTRY_L4 -3UL 114#define LDT_PGD_ENTRY -240UL
115#define LDT_PGD_ENTRY_L5 -112UL
116#define LDT_PGD_ENTRY (pgtable_l5_enabled() ? LDT_PGD_ENTRY_L5 : LDT_PGD_ENTRY_L4)
117#define LDT_BASE_ADDR (LDT_PGD_ENTRY << PGDIR_SHIFT) 115#define LDT_BASE_ADDR (LDT_PGD_ENTRY << PGDIR_SHIFT)
118#define LDT_END_ADDR (LDT_BASE_ADDR + PGDIR_SIZE) 116#define LDT_END_ADDR (LDT_BASE_ADDR + PGDIR_SIZE)
119 117
diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
index 0d7b3ae4960b..a5d7ed125337 100644
--- a/arch/x86/xen/mmu_pv.c
+++ b/arch/x86/xen/mmu_pv.c
@@ -1905,7 +1905,7 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
1905 init_top_pgt[0] = __pgd(0); 1905 init_top_pgt[0] = __pgd(0);
1906 1906
1907 /* Pre-constructed entries are in pfn, so convert to mfn */ 1907 /* Pre-constructed entries are in pfn, so convert to mfn */
1908 /* L4[272] -> level3_ident_pgt */ 1908 /* L4[273] -> level3_ident_pgt */
1909 /* L4[511] -> level3_kernel_pgt */ 1909 /* L4[511] -> level3_kernel_pgt */
1910 convert_pfn_mfn(init_top_pgt); 1910 convert_pfn_mfn(init_top_pgt);
1911 1911
@@ -1925,8 +1925,8 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
1925 addr[0] = (unsigned long)pgd; 1925 addr[0] = (unsigned long)pgd;
1926 addr[1] = (unsigned long)l3; 1926 addr[1] = (unsigned long)l3;
1927 addr[2] = (unsigned long)l2; 1927 addr[2] = (unsigned long)l2;
1928 /* Graft it onto L4[272][0]. Note that we creating an aliasing problem: 1928 /* Graft it onto L4[273][0]. Note that we creating an aliasing problem:
1929 * Both L4[272][0] and L4[511][510] have entries that point to the same 1929 * Both L4[273][0] and L4[511][510] have entries that point to the same
1930 * L2 (PMD) tables. Meaning that if you modify it in __va space 1930 * L2 (PMD) tables. Meaning that if you modify it in __va space
1931 * it will be also modified in the __ka space! (But if you just 1931 * it will be also modified in the __ka space! (But if you just
1932 * modify the PMD table to point to other PTE's or none, then you 1932 * modify the PMD table to point to other PTE's or none, then you