Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MIPS: Don't vmap things at address zero.

In the 64-bit kernel we use swapper_pg_dir for three different things.

1) xuseg mappings for kernel threads.

2) vmap mappings for all kernel-space accesses in xkseg.

3) vmap mappings for kernel modules in ksseg (kseg2).

Due to how the TLB refill handlers work, any mapping established in
xkseg or ksseg will also establish a xuseg mapping that should never
be used by the kernel.

In order to be able to use exceptions to trap NULL pointer
dereferences, we need to ensure that nothing is mapped at address
zero. Since vmap mappings in xkseg are reflected in xuseg, this means
we need to ensure that there are no vmap mappings established at the
start of xkseg. So we move back VMALLOC_START to avoid establishing
vmap mappings at the start of xkseg.

Signed-off-by: David Daney <ddaney@caviumnetworks.com>
To: linux-mips@linux-mips.org
Patchwork: http://patchwork.linux-mips.org/patch/1129/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by

David Daney and committed by
Ralf Baechle
c8f3cc0b b0b4ce38

+7 -2
+7 -2
arch/mips/include/asm/pgtable-64.h
··· 120 120 #endif 121 121 #define FIRST_USER_ADDRESS 0UL 122 122 123 - #define VMALLOC_START MAP_BASE 123 + /* 124 + * TLB refill handlers also map the vmalloc area into xuseg. Avoid 125 + * the first couple of pages so NULL pointer dereferences will still 126 + * reliably trap. 127 + */ 128 + #define VMALLOC_START (MAP_BASE + (2 * PAGE_SIZE)) 124 129 #define VMALLOC_END \ 125 - (VMALLOC_START + \ 130 + (MAP_BASE + \ 126 131 min(PTRS_PER_PGD * PTRS_PER_PMD * PTRS_PER_PTE * PAGE_SIZE, \ 127 132 (1UL << cpu_vmbits)) - (1UL << 32)) 128 133