2012-03-05 19:49:27 +08:00
|
|
|
/*
|
|
|
|
* Based on arch/arm/include/asm/page.h
|
|
|
|
*
|
|
|
|
* Copyright (C) 1995-2003 Russell King
|
|
|
|
* Copyright (C) 2012 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_PAGE_H
|
|
|
|
#define __ASM_PAGE_H
|
|
|
|
|
|
|
|
/* PAGE_SHIFT determines the page size */
|
|
|
|
#ifdef CONFIG_ARM64_64K_PAGES
|
|
|
|
#define PAGE_SHIFT 16
|
|
|
|
#else
|
|
|
|
#define PAGE_SHIFT 12
|
|
|
|
#endif
|
|
|
|
#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
|
|
|
|
#define PAGE_MASK (~(PAGE_SIZE-1))
|
|
|
|
|
2014-06-24 23:51:35 +08:00
|
|
|
/*
|
|
|
|
* The idmap and swapper page tables need some space reserved in the kernel
|
2014-05-12 17:40:51 +08:00
|
|
|
* image. Both require pgd, pud (4 levels only) and pmd tables to (section)
|
2014-07-21 22:54:50 +08:00
|
|
|
* 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
|
arm64: mm: increase VA range of identity map
The page size and the number of translation levels, and hence the supported
virtual address range, are build-time configurables on arm64 whose optimal
values are use case dependent. However, in the current implementation, if
the system's RAM is located at a very high offset, the virtual address range
needs to reflect that merely because the identity mapping, which is only used
to enable or disable the MMU, requires the extended virtual range to map the
physical memory at an equal virtual offset.
This patch relaxes that requirement, by increasing the number of translation
levels for the identity mapping only, and only when actually needed, i.e.,
when system RAM's offset is found to be out of reach at runtime.
Tested-by: Laura Abbott <lauraa@codeaurora.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
2015-03-20 00:42:27 +08:00
|
|
|
* 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.
|
2014-06-24 23:51:35 +08:00
|
|
|
*/
|
2014-07-21 22:54:50 +08:00
|
|
|
#ifdef CONFIG_ARM64_64K_PAGES
|
2015-04-15 06:45:39 +08:00
|
|
|
#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS)
|
2014-05-12 17:40:51 +08:00
|
|
|
#else
|
2015-04-15 06:45:39 +08:00
|
|
|
#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1)
|
2014-05-12 17:40:51 +08:00
|
|
|
#endif
|
2014-06-24 23:51:35 +08:00
|
|
|
|
2014-07-21 22:54:50 +08:00
|
|
|
#define SWAPPER_DIR_SIZE (SWAPPER_PGTABLE_LEVELS * PAGE_SIZE)
|
arm64: mm: increase VA range of identity map
The page size and the number of translation levels, and hence the supported
virtual address range, are build-time configurables on arm64 whose optimal
values are use case dependent. However, in the current implementation, if
the system's RAM is located at a very high offset, the virtual address range
needs to reflect that merely because the identity mapping, which is only used
to enable or disable the MMU, requires the extended virtual range to map the
physical memory at an equal virtual offset.
This patch relaxes that requirement, by increasing the number of translation
levels for the identity mapping only, and only when actually needed, i.e.,
when system RAM's offset is found to be out of reach at runtime.
Tested-by: Laura Abbott <lauraa@codeaurora.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
2015-03-20 00:42:27 +08:00
|
|
|
#define IDMAP_DIR_SIZE (3 * PAGE_SIZE)
|
2014-07-21 22:54:50 +08:00
|
|
|
|
2012-03-05 19:49:27 +08:00
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
2014-07-15 23:35:38 +08:00
|
|
|
#include <asm/pgtable-types.h>
|
2012-03-05 19:49:27 +08:00
|
|
|
|
|
|
|
extern void __cpu_clear_user_page(void *p, unsigned long user);
|
|
|
|
extern void __cpu_copy_user_page(void *to, const void *from,
|
|
|
|
unsigned long user);
|
|
|
|
extern void copy_page(void *to, const void *from);
|
|
|
|
extern void clear_page(void *to);
|
|
|
|
|
|
|
|
#define clear_user_page(addr,vaddr,pg) __cpu_clear_user_page(addr, vaddr)
|
|
|
|
#define copy_user_page(to,from,vaddr,pg) __cpu_copy_user_page(to, from, vaddr)
|
|
|
|
|
|
|
|
typedef struct page *pgtable_t;
|
|
|
|
|
|
|
|
#ifdef CONFIG_HAVE_ARCH_PFN_VALID
|
|
|
|
extern int pfn_valid(unsigned long);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <asm/memory.h>
|
|
|
|
|
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
|
|
|
|
#define VM_DATA_DEFAULT_FLAGS \
|
|
|
|
(((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \
|
|
|
|
VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
|
|
|
|
|
|
|
#include <asm-generic/getorder.h>
|
|
|
|
|
|
|
|
#endif
|