]>
Commit | Line | Data |
---|---|---|
59d5af67 | 1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
321d628a FG |
2 | From: Thomas Gleixner <tglx@linutronix.de> |
3 | Date: Wed, 20 Dec 2017 18:07:42 +0100 | |
59d5af67 FG |
4 | Subject: [PATCH] x86/mm/dump_pagetables: Make the address hints correct and |
5 | readable | |
321d628a FG |
6 | MIME-Version: 1.0 |
7 | Content-Type: text/plain; charset=UTF-8 | |
8 | Content-Transfer-Encoding: 8bit | |
9 | ||
10 | CVE-2017-5754 | |
11 | ||
12 | The address hints are a trainwreck. The array entry numbers have to kept | |
13 | magically in sync with the actual hints, which is doomed as some of the | |
14 | array members are initialized at runtime via the entry numbers. | |
15 | ||
16 | Designated initializers have been around before this code was | |
17 | implemented.... | |
18 | ||
19 | Use the entry numbers to populate the address hints array and add the | |
20 | missing bits and pieces. Split 32 and 64 bit for readability sake. | |
21 | ||
22 | Signed-off-by: Thomas Gleixner <tglx@linutronix.de> | |
23 | Cc: Andy Lutomirski <luto@kernel.org> | |
24 | Cc: Borislav Petkov <bp@alien8.de> | |
25 | Cc: Dave Hansen <dave.hansen@linux.intel.com> | |
26 | Cc: H. Peter Anvin <hpa@zytor.com> | |
27 | Cc: Josh Poimboeuf <jpoimboe@redhat.com> | |
28 | Cc: Juergen Gross <jgross@suse.com> | |
29 | Cc: Linus Torvalds <torvalds@linux-foundation.org> | |
30 | Cc: Peter Zijlstra <peterz@infradead.org> | |
31 | Cc: linux-kernel@vger.kernel.org | |
32 | Signed-off-by: Ingo Molnar <mingo@kernel.org> | |
33 | (cherry picked from commit 146122e24bdf208015d629babba673e28d090709) | |
34 | Signed-off-by: Andy Whitcroft <apw@canonical.com> | |
35 | Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> | |
36 | (cherry picked from commit 7f4d9163531183fbaa0df1d1b1ceecbade4e58dc) | |
37 | Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> | |
38 | --- | |
39 | arch/x86/mm/dump_pagetables.c | 90 +++++++++++++++++++++++++------------------ | |
40 | 1 file changed, 53 insertions(+), 37 deletions(-) | |
41 | ||
42 | diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c | |
43 | index 91aa41c5e0dd..318a7c30e87e 100644 | |
44 | --- a/arch/x86/mm/dump_pagetables.c | |
45 | +++ b/arch/x86/mm/dump_pagetables.c | |
46 | @@ -44,10 +44,12 @@ struct addr_marker { | |
47 | unsigned long max_lines; | |
48 | }; | |
49 | ||
50 | -/* indices for address_markers; keep sync'd w/ address_markers below */ | |
51 | +/* Address space markers hints */ | |
52 | + | |
53 | +#ifdef CONFIG_X86_64 | |
54 | + | |
55 | enum address_markers_idx { | |
56 | USER_SPACE_NR = 0, | |
57 | -#ifdef CONFIG_X86_64 | |
58 | KERNEL_SPACE_NR, | |
59 | LOW_KERNEL_NR, | |
60 | VMALLOC_START_NR, | |
61 | @@ -56,56 +58,70 @@ enum address_markers_idx { | |
62 | KASAN_SHADOW_START_NR, | |
63 | KASAN_SHADOW_END_NR, | |
64 | #endif | |
65 | -# ifdef CONFIG_X86_ESPFIX64 | |
66 | +#ifdef CONFIG_X86_ESPFIX64 | |
67 | ESPFIX_START_NR, | |
68 | -# endif | |
69 | +#endif | |
70 | +#ifdef CONFIG_EFI | |
71 | + EFI_END_NR, | |
72 | +#endif | |
73 | HIGH_KERNEL_NR, | |
74 | MODULES_VADDR_NR, | |
75 | MODULES_END_NR, | |
76 | -#else | |
77 | + FIXADDR_START_NR, | |
78 | + END_OF_SPACE_NR, | |
79 | +}; | |
80 | + | |
81 | +static struct addr_marker address_markers[] = { | |
82 | + [USER_SPACE_NR] = { 0, "User Space" }, | |
83 | + [KERNEL_SPACE_NR] = { (1UL << 63), "Kernel Space" }, | |
84 | + [LOW_KERNEL_NR] = { 0UL, "Low Kernel Mapping" }, | |
85 | + [VMALLOC_START_NR] = { 0UL, "vmalloc() Area" }, | |
86 | + [VMEMMAP_START_NR] = { 0UL, "Vmemmap" }, | |
87 | +#ifdef CONFIG_KASAN | |
88 | + [KASAN_SHADOW_START_NR] = { KASAN_SHADOW_START, "KASAN shadow" }, | |
89 | + [KASAN_SHADOW_END_NR] = { KASAN_SHADOW_END, "KASAN shadow end" }, | |
90 | +#endif | |
91 | +#ifdef CONFIG_X86_ESPFIX64 | |
92 | + [ESPFIX_START_NR] = { ESPFIX_BASE_ADDR, "ESPfix Area", 16 }, | |
93 | +#endif | |
94 | +#ifdef CONFIG_EFI | |
95 | + [EFI_END_NR] = { EFI_VA_END, "EFI Runtime Services" }, | |
96 | +#endif | |
97 | + [HIGH_KERNEL_NR] = { __START_KERNEL_map, "High Kernel Mapping" }, | |
98 | + [MODULES_VADDR_NR] = { MODULES_VADDR, "Modules" }, | |
99 | + [MODULES_END_NR] = { MODULES_END, "End Modules" }, | |
100 | + [FIXADDR_START_NR] = { FIXADDR_START, "Fixmap Area" }, | |
101 | + [END_OF_SPACE_NR] = { -1, NULL } | |
102 | +}; | |
103 | + | |
104 | +#else /* CONFIG_X86_64 */ | |
105 | + | |
106 | +enum address_markers_idx { | |
107 | + USER_SPACE_NR = 0, | |
108 | KERNEL_SPACE_NR, | |
109 | VMALLOC_START_NR, | |
110 | VMALLOC_END_NR, | |
111 | -# ifdef CONFIG_HIGHMEM | |
112 | +#ifdef CONFIG_HIGHMEM | |
113 | PKMAP_BASE_NR, | |
114 | -# endif | |
115 | - FIXADDR_START_NR, | |
116 | #endif | |
117 | + FIXADDR_START_NR, | |
118 | + END_OF_SPACE_NR, | |
119 | }; | |
120 | ||
121 | -/* Address space markers hints */ | |
122 | static struct addr_marker address_markers[] = { | |
123 | - { 0, "User Space" }, | |
124 | -#ifdef CONFIG_X86_64 | |
125 | - { 0x8000000000000000UL, "Kernel Space" }, | |
126 | - { 0/* PAGE_OFFSET */, "Low Kernel Mapping" }, | |
127 | - { 0/* VMALLOC_START */, "vmalloc() Area" }, | |
128 | - { 0/* VMEMMAP_START */, "Vmemmap" }, | |
129 | -#ifdef CONFIG_KASAN | |
130 | - { KASAN_SHADOW_START, "KASAN shadow" }, | |
131 | - { KASAN_SHADOW_END, "KASAN shadow end" }, | |
132 | + [USER_SPACE_NR] = { 0, "User Space" }, | |
133 | + [KERNEL_SPACE_NR] = { PAGE_OFFSET, "Kernel Mapping" }, | |
134 | + [VMALLOC_START_NR] = { 0UL, "vmalloc() Area" }, | |
135 | + [VMALLOC_END_NR] = { 0UL, "vmalloc() End" }, | |
136 | +#ifdef CONFIG_HIGHMEM | |
137 | + [PKMAP_BASE_NR] = { 0UL, "Persistent kmap() Area" }, | |
138 | #endif | |
139 | -# ifdef CONFIG_X86_ESPFIX64 | |
140 | - { ESPFIX_BASE_ADDR, "ESPfix Area", 16 }, | |
141 | -# endif | |
142 | -# ifdef CONFIG_EFI | |
143 | - { EFI_VA_END, "EFI Runtime Services" }, | |
144 | -# endif | |
145 | - { __START_KERNEL_map, "High Kernel Mapping" }, | |
146 | - { MODULES_VADDR, "Modules" }, | |
147 | - { MODULES_END, "End Modules" }, | |
148 | -#else | |
149 | - { PAGE_OFFSET, "Kernel Mapping" }, | |
150 | - { 0/* VMALLOC_START */, "vmalloc() Area" }, | |
151 | - { 0/*VMALLOC_END*/, "vmalloc() End" }, | |
152 | -# ifdef CONFIG_HIGHMEM | |
153 | - { 0/*PKMAP_BASE*/, "Persistent kmap() Area" }, | |
154 | -# endif | |
155 | - { 0/*FIXADDR_START*/, "Fixmap Area" }, | |
156 | -#endif | |
157 | - { -1, NULL } /* End of list */ | |
158 | + [FIXADDR_START_NR] = { 0UL, "Fixmap area" }, | |
159 | + [END_OF_SPACE_NR] = { -1, NULL } | |
160 | }; | |
161 | ||
162 | +#endif /* !CONFIG_X86_64 */ | |
163 | + | |
164 | /* Multipliers for offsets within the PTEs */ | |
165 | #define PTE_LEVEL_MULT (PAGE_SIZE) | |
166 | #define PMD_LEVEL_MULT (PTRS_PER_PTE * PTE_LEVEL_MULT) | |
167 | -- | |
168 | 2.14.2 | |
169 |