@@ -1,16 +1,24 @@
#ifndef _ASM_FIXMAP_H
#define _ASM_FIXMAP_H
+/*
+ * The fixmap uses 2MB. The KMAP fixmap needs 64k per CPU, so make room for
+ * 16 CPUs (taking 1MB) and leave the rest for additional fixmap areas.
+ */
#define FIXADDR_START 0xffc00000UL
#define FIXADDR_END 0xffe00000UL
#define FIXADDR_TOP (FIXADDR_END - PAGE_SIZE)
#define FIXADDR_SIZE (FIXADDR_END - FIXADDR_START)
-#define FIX_KMAP_NR_PTES (FIXADDR_SIZE >> PAGE_SHIFT)
+/* 16 PTEs per CPU (64k of 4k pages). */
+#define FIX_KMAP_NR_PTES 16
+#define FIX_KMAP_NR_CPUS 16
enum fixed_addresses {
+ /* Support 16 CPUs for kmap as the first region of fixmap entries. */
FIX_KMAP_BEGIN,
- FIX_KMAP_END = FIX_KMAP_NR_PTES - 1,
+ FIX_KMAP_END = (FIX_KMAP_NR_PTES * FIX_KMAP_NR_CPUS) - 1,
+
__end_of_fixed_addresses
};
@@ -18,8 +18,6 @@
#include <asm/tlbflush.h>
#include "mm.h"
-pte_t *fixmap_page_table;
-
static inline void set_fixmap_pte(int idx, pte_t pte)
{
unsigned long vaddr = __fix_to_virt(idx);
@@ -7,6 +7,9 @@
/* the upper-most page table pointer */
extern pmd_t *top_pmd;
+/* The fixmap PTE. */
+extern pte_t *fixmap_page_table;
+
/*
* 0xffff8000 to 0xffffffff is reserved for any ARM architecture
* specific hacks for copying pages efficiently, while 0xffff4000
@@ -53,6 +53,9 @@ EXPORT_SYMBOL(empty_zero_page);
*/
pmd_t *top_pmd;
+/* The fixmap PTE. */
+pte_t *fixmap_page_table;
+
#define CPOLICY_UNCACHED 0
#define CPOLICY_BUFFERED 1
#define CPOLICY_WRITETHROUGH 2
@@ -1342,10 +1345,10 @@ static void __init kmap_init(void)
#ifdef CONFIG_HIGHMEM
pkmap_page_table = early_pte_alloc(pmd_off_k(PKMAP_BASE),
PKMAP_BASE, _PAGE_KERNEL_TABLE);
+#endif
fixmap_page_table = early_pte_alloc(pmd_off_k(FIXADDR_START),
FIXADDR_START, _PAGE_KERNEL_TABLE);
-#endif
}
static void __init map_lowmem(void)
More room is needed in the fixmap range for non-kmap fixmap entries. This reduces the kmap range from 32 to 16 CPUs. Additionally, add PTE entry for fixmap regardless of CONFIG_HIGHMEM. Signed-off-by: Kees Cook <keescook@chromium.org> --- arch/arm/include/asm/fixmap.h | 12 ++++++++++-- arch/arm/mm/highmem.c | 2 -- arch/arm/mm/mm.h | 3 +++ arch/arm/mm/mmu.c | 5 ++++- 4 files changed, 17 insertions(+), 5 deletions(-)