diff options
author | Andrey Ryabinin <aryabinin@virtuozzo.com> | 2017-12-28 11:06:20 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-01-04 17:04:57 -0500 |
commit | f5a40711fa58f1c109165a4fec6078bf2dfd2bdc (patch) | |
tree | 5c07133fe140bdd20a8db5fdae3ed9ba8d643aac | |
parent | 2fd9c41aea47f4ad071accf94b94f94f2c4d31eb (diff) |
x86/mm: Set MODULES_END to 0xffffffffff000000
Since f06bdd4001c2 ("x86/mm: Adapt MODULES_END based on fixmap section size")
kasan_mem_to_shadow(MODULES_END) could be not aligned to a page boundary.
So passing page unaligned address to kasan_populate_zero_shadow() have two
possible effects:
1) It may leave one page hole in supposed to be populated area. After commit
21506525fb8d ("x86/kasan/64: Teach KASAN about the cpu_entry_area") that
hole happens to be in the shadow covering fixmap area and leads to crash:
BUG: unable to handle kernel paging request at fffffbffffe8ee04
RIP: 0010:check_memory_region+0x5c/0x190
Call Trace:
<NMI>
memcpy+0x1f/0x50
ghes_copy_tofrom_phys+0xab/0x180
ghes_read_estatus+0xfb/0x280
ghes_notify_nmi+0x2b2/0x410
nmi_handle+0x115/0x2c0
default_do_nmi+0x57/0x110
do_nmi+0xf8/0x150
end_repeat_nmi+0x1a/0x1e
Note, the crash likely disappeared after commit 92a0f81d8957, which
changed kasan_populate_zero_shadow() call the way it was before
commit 21506525fb8d.
2) Attempt to load module near MODULES_END will fail, because
__vmalloc_node_range() called from kasan_module_alloc() will hit the
WARN_ON(!pte_none(*pte)) in the vmap_pte_range() and bail out with error.
To fix this we need to make kasan_mem_to_shadow(MODULES_END) page aligned
which means that MODULES_END should be 8*PAGE_SIZE aligned.
The whole point of commit f06bdd4001c2 was to move MODULES_END down if
NR_CPUS is big, so the cpu_entry_area takes a lot of space.
But since 92a0f81d8957 ("x86/cpu_entry_area: Move it out of the fixmap")
the cpu_entry_area is no longer in fixmap, so we could just set
MODULES_END to a fixed 8*PAGE_SIZE aligned address.
Fixes: f06bdd4001c2 ("x86/mm: Adapt MODULES_END based on fixmap section size")
Reported-by: Jakub Kicinski <kubakici@wp.pl>
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Thomas Garnier <thgarnie@google.com>
Link: https://lkml.kernel.org/r/20171228160620.23818-1-aryabinin@virtuozzo.com
-rw-r--r-- | Documentation/x86/x86_64/mm.txt | 5 | ||||
-rw-r--r-- | arch/x86/include/asm/pgtable_64_types.h | 2 |
2 files changed, 2 insertions, 5 deletions
diff --git a/Documentation/x86/x86_64/mm.txt b/Documentation/x86/x86_64/mm.txt index ad41b3813f0a..ddd5ffd31bd0 100644 --- a/Documentation/x86/x86_64/mm.txt +++ b/Documentation/x86/x86_64/mm.txt | |||
@@ -43,7 +43,7 @@ ffffff0000000000 - ffffff7fffffffff (=39 bits) %esp fixup stacks | |||
43 | ffffffef00000000 - fffffffeffffffff (=64 GB) EFI region mapping space | 43 | ffffffef00000000 - fffffffeffffffff (=64 GB) EFI region mapping space |
44 | ... unused hole ... | 44 | ... unused hole ... |
45 | ffffffff80000000 - ffffffff9fffffff (=512 MB) kernel text mapping, from phys 0 | 45 | ffffffff80000000 - ffffffff9fffffff (=512 MB) kernel text mapping, from phys 0 |
46 | ffffffffa0000000 - [fixmap start] (~1526 MB) module mapping space | 46 | ffffffffa0000000 - fffffffffeffffff (1520 MB) module mapping space |
47 | [fixmap start] - ffffffffff5fffff kernel-internal fixmap range | 47 | [fixmap start] - ffffffffff5fffff kernel-internal fixmap range |
48 | ffffffffff600000 - ffffffffff600fff (=4 kB) legacy vsyscall ABI | 48 | ffffffffff600000 - ffffffffff600fff (=4 kB) legacy vsyscall ABI |
49 | ffffffffffe00000 - ffffffffffffffff (=2 MB) unused hole | 49 | ffffffffffe00000 - ffffffffffffffff (=2 MB) unused hole |
@@ -67,9 +67,6 @@ memory window (this size is arbitrary, it can be raised later if needed). | |||
67 | The mappings are not part of any other kernel PGD and are only available | 67 | The mappings are not part of any other kernel PGD and are only available |
68 | during EFI runtime calls. | 68 | during EFI runtime calls. |
69 | 69 | ||
70 | The module mapping space size changes based on the CONFIG requirements for the | ||
71 | following fixmap section. | ||
72 | |||
73 | Note that if CONFIG_RANDOMIZE_MEMORY is enabled, the direct mapping of all | 70 | Note that if CONFIG_RANDOMIZE_MEMORY is enabled, the direct mapping of all |
74 | physical memory, vmalloc/ioremap space and virtual memory map are randomized. | 71 | physical memory, vmalloc/ioremap space and virtual memory map are randomized. |
75 | Their order is preserved but their base will be offset early at boot time. | 72 | Their order is preserved but their base will be offset early at boot time. |
diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h index b97a539bcdee..6233e5595389 100644 --- a/arch/x86/include/asm/pgtable_64_types.h +++ b/arch/x86/include/asm/pgtable_64_types.h | |||
@@ -104,7 +104,7 @@ typedef struct { pteval_t pte; } pte_t; | |||
104 | 104 | ||
105 | #define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE) | 105 | #define MODULES_VADDR (__START_KERNEL_map + KERNEL_IMAGE_SIZE) |
106 | /* The module sections ends with the start of the fixmap */ | 106 | /* The module sections ends with the start of the fixmap */ |
107 | #define MODULES_END __fix_to_virt(__end_of_fixed_addresses + 1) | 107 | #define MODULES_END _AC(0xffffffffff000000, UL) |
108 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 108 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
109 | 109 | ||
110 | #define ESPFIX_PGD_ENTRY _AC(-2, UL) | 110 | #define ESPFIX_PGD_ENTRY _AC(-2, UL) |