arm64: Move swapper pagetable definitions
Move the kernel pagetable (both swapper and idmap) definitions from the generic asm/page.h to a new file, asm/kernel-pgtable.h. This is mostly a cosmetic change, to clean up the asm/page.h to get rid of the arch specific details which are not needed by the generic code. Also renames the symbols to prevent conflicts. e.g, BLOCK_SHIFT => SWAPPER_BLOCK_SHIFT Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Suzuki K. Poulose <suzuki.poulose@arm.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
fbc61a26e6
commit
87d1587bef
arch/arm64
65
arch/arm64/include/asm/kernel-pgtable.h
Normal file
65
arch/arm64/include/asm/kernel-pgtable.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Kernel page table mapping
|
||||||
|
*
|
||||||
|
* Copyright (C) 2015 ARM Ltd.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM_KERNEL_PGTABLE_H
|
||||||
|
#define __ASM_KERNEL_PGTABLE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The idmap and swapper page tables need some space reserved in the kernel
|
||||||
|
* image. Both require pgd, pud (4 levels only) and pmd tables to (section)
|
||||||
|
* map the kernel. With the 64K page configuration, swapper and idmap need to
|
||||||
|
* map to pte level. The swapper also maps the FDT (see __create_page_tables
|
||||||
|
* for more information). Note that the number of ID map translation levels
|
||||||
|
* could be increased on the fly if system RAM is out of reach for the default
|
||||||
|
* VA range, so 3 pages are reserved in all cases.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_ARM64_64K_PAGES
|
||||||
|
#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS)
|
||||||
|
#else
|
||||||
|
#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SWAPPER_DIR_SIZE (SWAPPER_PGTABLE_LEVELS * PAGE_SIZE)
|
||||||
|
#define IDMAP_DIR_SIZE (3 * PAGE_SIZE)
|
||||||
|
|
||||||
|
/* Initial memory map size */
|
||||||
|
#ifdef CONFIG_ARM64_64K_PAGES
|
||||||
|
#define SWAPPER_BLOCK_SHIFT PAGE_SHIFT
|
||||||
|
#define SWAPPER_BLOCK_SIZE PAGE_SIZE
|
||||||
|
#define SWAPPER_TABLE_SHIFT PMD_SHIFT
|
||||||
|
#else
|
||||||
|
#define SWAPPER_BLOCK_SHIFT SECTION_SHIFT
|
||||||
|
#define SWAPPER_BLOCK_SIZE SECTION_SIZE
|
||||||
|
#define SWAPPER_TABLE_SHIFT PUD_SHIFT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initial memory map attributes.
|
||||||
|
*/
|
||||||
|
#define SWAPPER_PTE_FLAGS (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED)
|
||||||
|
#define SWAPPER_PMD_FLAGS (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S)
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM64_64K_PAGES
|
||||||
|
#define SWAPPER_MM_MMUFLAGS (PTE_ATTRINDX(MT_NORMAL) | SWAPPER_PTE_FLAGS)
|
||||||
|
#else
|
||||||
|
#define SWAPPER_MM_MMUFLAGS (PMD_ATTRINDX(MT_NORMAL) | SWAPPER_PMD_FLAGS)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __ASM_KERNEL_PGTABLE_H */
|
@ -34,24 +34,6 @@
|
|||||||
#define CONT_SIZE (_AC(1, UL) << (CONT_SHIFT + PAGE_SHIFT))
|
#define CONT_SIZE (_AC(1, UL) << (CONT_SHIFT + PAGE_SHIFT))
|
||||||
#define CONT_MASK (~(CONT_SIZE-1))
|
#define CONT_MASK (~(CONT_SIZE-1))
|
||||||
|
|
||||||
/*
|
|
||||||
* The idmap and swapper page tables need some space reserved in the kernel
|
|
||||||
* image. Both require pgd, pud (4 levels only) and pmd tables to (section)
|
|
||||||
* map the kernel. With the 64K page configuration, swapper and idmap need to
|
|
||||||
* map to pte level. The swapper also maps the FDT (see __create_page_tables
|
|
||||||
* for more information). Note that the number of ID map translation levels
|
|
||||||
* could be increased on the fly if system RAM is out of reach for the default
|
|
||||||
* VA range, so 3 pages are reserved in all cases.
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_ARM64_64K_PAGES
|
|
||||||
#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS)
|
|
||||||
#else
|
|
||||||
#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SWAPPER_DIR_SIZE (SWAPPER_PGTABLE_LEVELS * PAGE_SIZE)
|
|
||||||
#define IDMAP_DIR_SIZE (3 * PAGE_SIZE)
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <asm/pgtable-types.h>
|
#include <asm/pgtable-types.h>
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/cputype.h>
|
#include <asm/cputype.h>
|
||||||
|
#include <asm/kernel-pgtable.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/pgtable-hwdef.h>
|
#include <asm/pgtable-hwdef.h>
|
||||||
@ -46,31 +47,9 @@
|
|||||||
#error TEXT_OFFSET must be less than 2MB
|
#error TEXT_OFFSET must be less than 2MB
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64_64K_PAGES
|
|
||||||
#define BLOCK_SHIFT PAGE_SHIFT
|
|
||||||
#define BLOCK_SIZE PAGE_SIZE
|
|
||||||
#define TABLE_SHIFT PMD_SHIFT
|
|
||||||
#else
|
|
||||||
#define BLOCK_SHIFT SECTION_SHIFT
|
|
||||||
#define BLOCK_SIZE SECTION_SIZE
|
|
||||||
#define TABLE_SHIFT PUD_SHIFT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define KERNEL_START _text
|
#define KERNEL_START _text
|
||||||
#define KERNEL_END _end
|
#define KERNEL_END _end
|
||||||
|
|
||||||
/*
|
|
||||||
* Initial memory map attributes.
|
|
||||||
*/
|
|
||||||
#define PTE_FLAGS PTE_TYPE_PAGE | PTE_AF | PTE_SHARED
|
|
||||||
#define PMD_FLAGS PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S
|
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64_64K_PAGES
|
|
||||||
#define MM_MMUFLAGS PTE_ATTRINDX(MT_NORMAL) | PTE_FLAGS
|
|
||||||
#else
|
|
||||||
#define MM_MMUFLAGS PMD_ATTRINDX(MT_NORMAL) | PMD_FLAGS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kernel startup entry point.
|
* Kernel startup entry point.
|
||||||
* ---------------------------
|
* ---------------------------
|
||||||
@ -293,7 +272,7 @@ ENDPROC(preserve_boot_args)
|
|||||||
.macro create_pgd_entry, tbl, virt, tmp1, tmp2
|
.macro create_pgd_entry, tbl, virt, tmp1, tmp2
|
||||||
create_table_entry \tbl, \virt, PGDIR_SHIFT, PTRS_PER_PGD, \tmp1, \tmp2
|
create_table_entry \tbl, \virt, PGDIR_SHIFT, PTRS_PER_PGD, \tmp1, \tmp2
|
||||||
#if SWAPPER_PGTABLE_LEVELS == 3
|
#if SWAPPER_PGTABLE_LEVELS == 3
|
||||||
create_table_entry \tbl, \virt, TABLE_SHIFT, PTRS_PER_PTE, \tmp1, \tmp2
|
create_table_entry \tbl, \virt, SWAPPER_TABLE_SHIFT, PTRS_PER_PTE, \tmp1, \tmp2
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
@ -305,15 +284,15 @@ ENDPROC(preserve_boot_args)
|
|||||||
* Corrupts: phys, start, end, pstate
|
* Corrupts: phys, start, end, pstate
|
||||||
*/
|
*/
|
||||||
.macro create_block_map, tbl, flags, phys, start, end
|
.macro create_block_map, tbl, flags, phys, start, end
|
||||||
lsr \phys, \phys, #BLOCK_SHIFT
|
lsr \phys, \phys, #SWAPPER_BLOCK_SHIFT
|
||||||
lsr \start, \start, #BLOCK_SHIFT
|
lsr \start, \start, #SWAPPER_BLOCK_SHIFT
|
||||||
and \start, \start, #PTRS_PER_PTE - 1 // table index
|
and \start, \start, #PTRS_PER_PTE - 1 // table index
|
||||||
orr \phys, \flags, \phys, lsl #BLOCK_SHIFT // table entry
|
orr \phys, \flags, \phys, lsl #SWAPPER_BLOCK_SHIFT // table entry
|
||||||
lsr \end, \end, #BLOCK_SHIFT
|
lsr \end, \end, #SWAPPER_BLOCK_SHIFT
|
||||||
and \end, \end, #PTRS_PER_PTE - 1 // table end index
|
and \end, \end, #PTRS_PER_PTE - 1 // table end index
|
||||||
9999: str \phys, [\tbl, \start, lsl #3] // store the entry
|
9999: str \phys, [\tbl, \start, lsl #3] // store the entry
|
||||||
add \start, \start, #1 // next entry
|
add \start, \start, #1 // next entry
|
||||||
add \phys, \phys, #BLOCK_SIZE // next block
|
add \phys, \phys, #SWAPPER_BLOCK_SIZE // next block
|
||||||
cmp \start, \end
|
cmp \start, \end
|
||||||
b.ls 9999b
|
b.ls 9999b
|
||||||
.endm
|
.endm
|
||||||
@ -350,7 +329,7 @@ __create_page_tables:
|
|||||||
cmp x0, x6
|
cmp x0, x6
|
||||||
b.lo 1b
|
b.lo 1b
|
||||||
|
|
||||||
ldr x7, =MM_MMUFLAGS
|
ldr x7, =SWAPPER_MM_MMUFLAGS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the identity mapping.
|
* Create the identity mapping.
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
|
#include <asm/kernel-pgtable.h>
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
Loading…
Reference in New Issue
Block a user