diff options
Diffstat (limited to 'arch/riscv/include/asm/pgtable.h')
| -rw-r--r-- | arch/riscv/include/asm/pgtable.h | 86 | 
1 files changed, 66 insertions, 20 deletions
diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index bf204e7c1f74..e3549e50de95 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -13,6 +13,7 @@  #ifndef CONFIG_MMU  #define KERNEL_LINK_ADDR	PAGE_OFFSET +#define KERN_VIRT_SIZE		(UL(-1))  #else  #define ADDRESS_SPACE_END	(UL(-1)) @@ -24,8 +25,19 @@  #define KERNEL_LINK_ADDR	PAGE_OFFSET  #endif +/* Number of entries in the page global directory */ +#define PTRS_PER_PGD    (PAGE_SIZE / sizeof(pgd_t)) +/* Number of entries in the page table */ +#define PTRS_PER_PTE    (PAGE_SIZE / sizeof(pte_t)) + +/* + * Half of the kernel address space (half of the entries of the page global + * directory) is for the direct mapping. + */ +#define KERN_VIRT_SIZE          ((PTRS_PER_PGD / 2 * PGDIR_SIZE) / 2) +  #define VMALLOC_SIZE     (KERN_VIRT_SIZE >> 1) -#define VMALLOC_END      (PAGE_OFFSET - 1) +#define VMALLOC_END      PAGE_OFFSET  #define VMALLOC_START    (PAGE_OFFSET - VMALLOC_SIZE)  #define BPF_JIT_REGION_SIZE	(SZ_128M) @@ -39,8 +51,10 @@  /* Modules always live before the kernel */  #ifdef CONFIG_64BIT -#define MODULES_VADDR	(PFN_ALIGN((unsigned long)&_end) - SZ_2G) -#define MODULES_END	(PFN_ALIGN((unsigned long)&_start)) +/* This is used to define the end of the KASAN shadow region */ +#define MODULES_LOWEST_VADDR	(KERNEL_LINK_ADDR - SZ_2G) +#define MODULES_VADDR		(PFN_ALIGN((unsigned long)&_end) - SZ_2G) +#define MODULES_END		(PFN_ALIGN((unsigned long)&_start))  #endif  /* @@ -48,10 +62,16 @@   * struct pages to map half the virtual address space. Then   * position vmemmap directly below the VMALLOC region.   */ +#ifdef CONFIG_64BIT +#define VA_BITS		(pgtable_l4_enabled ? 48 : 39) +#else +#define VA_BITS		32 +#endif +  #define VMEMMAP_SHIFT \ -	(CONFIG_VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT) +	(VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT)  #define VMEMMAP_SIZE	BIT(VMEMMAP_SHIFT) -#define VMEMMAP_END	(VMALLOC_START - 1) +#define VMEMMAP_END	VMALLOC_START  #define VMEMMAP_START	(VMALLOC_START - VMEMMAP_SIZE)  /* @@ -83,8 +103,7 @@  #ifndef __ASSEMBLY__ -/* Page Upper Directory not used in RISC-V */ -#include <asm-generic/pgtable-nopud.h> +#include <asm-generic/pgtable-nop4d.h>  #include <asm/page.h>  #include <asm/tlbflush.h>  #include <linux/mm_types.h> @@ -107,19 +126,27 @@  #define XIP_FIXUP(addr)		(addr)  #endif /* CONFIG_XIP_KERNEL */ -#ifdef CONFIG_MMU -/* Number of entries in the page global directory */ -#define PTRS_PER_PGD    (PAGE_SIZE / sizeof(pgd_t)) -/* Number of entries in the page table */ -#define PTRS_PER_PTE    (PAGE_SIZE / sizeof(pte_t)) +struct pt_alloc_ops { +	pte_t *(*get_pte_virt)(phys_addr_t pa); +	phys_addr_t (*alloc_pte)(uintptr_t va); +#ifndef __PAGETABLE_PMD_FOLDED +	pmd_t *(*get_pmd_virt)(phys_addr_t pa); +	phys_addr_t (*alloc_pmd)(uintptr_t va); +	pud_t *(*get_pud_virt)(phys_addr_t pa); +	phys_addr_t (*alloc_pud)(uintptr_t va); +#endif +}; + +extern struct pt_alloc_ops pt_ops __initdata; +#ifdef CONFIG_MMU  /* Number of PGD entries that a user-mode program can use */  #define USER_PTRS_PER_PGD   (TASK_SIZE / PGDIR_SIZE)  /* Page protection bits */  #define _PAGE_BASE	(_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER) -#define PAGE_NONE		__pgprot(_PAGE_PROT_NONE) +#define PAGE_NONE		__pgprot(_PAGE_PROT_NONE | _PAGE_READ)  #define PAGE_READ		__pgprot(_PAGE_BASE | _PAGE_READ)  #define PAGE_WRITE		__pgprot(_PAGE_BASE | _PAGE_READ | _PAGE_WRITE)  #define PAGE_EXEC		__pgprot(_PAGE_BASE | _PAGE_EXEC) @@ -628,11 +655,12 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,   *   * Format of swap PTE:   *	bit            0:	_PAGE_PRESENT (zero) - *	bit            1:	_PAGE_PROT_NONE (zero) - *	bits      2 to 6:	swap type - *	bits 7 to XLEN-1:	swap offset + *	bit       1 to 3:       _PAGE_LEAF (zero) + *	bit            5:	_PAGE_PROT_NONE (zero) + *	bits      6 to 10:	swap type + *	bits 10 to XLEN-1:	swap offset   */ -#define __SWP_TYPE_SHIFT	2 +#define __SWP_TYPE_SHIFT	6  #define __SWP_TYPE_BITS		5  #define __SWP_TYPE_MASK		((1UL << __SWP_TYPE_BITS) - 1)  #define __SWP_OFFSET_SHIFT	(__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) @@ -648,12 +676,17 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,  #define __pte_to_swp_entry(pte)	((swp_entry_t) { pte_val(pte) })  #define __swp_entry_to_pte(x)	((pte_t) { (x).val }) +#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION +#define __pmd_to_swp_entry(pmd) ((swp_entry_t) { pmd_val(pmd) }) +#define __swp_entry_to_pmd(swp) __pmd((swp).val) +#endif /* CONFIG_ARCH_ENABLE_THP_MIGRATION */ +  /*   * In the RV64 Linux scheme, we give the user half of the virtual-address space   * and give the kernel the other (upper) half.   */  #ifdef CONFIG_64BIT -#define KERN_VIRT_START	(-(BIT(CONFIG_VA_BITS)) + TASK_SIZE) +#define KERN_VIRT_START	(-(BIT(VA_BITS)) + TASK_SIZE)  #else  #define KERN_VIRT_START	FIXADDR_START  #endif @@ -661,11 +694,22 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,  /*   * Task size is 0x4000000000 for RV64 or 0x9fc00000 for RV32.   * Note that PGDIR_SIZE must evenly divide TASK_SIZE. + * Task size is: + * -     0x9fc00000 (~2.5GB) for RV32. + * -   0x4000000000 ( 256GB) for RV64 using SV39 mmu + * - 0x800000000000 ( 128TB) for RV64 using SV48 mmu + * + * Note that PGDIR_SIZE must evenly divide TASK_SIZE since "RISC-V + * Instruction Set Manual Volume II: Privileged Architecture" states that + * "load and store effective addresses, which are 64bits, must have bits + * 63–48 all equal to bit 47, or else a page-fault exception will occur."   */  #ifdef CONFIG_64BIT -#define TASK_SIZE (PGDIR_SIZE * PTRS_PER_PGD / 2) +#define TASK_SIZE      (PGDIR_SIZE * PTRS_PER_PGD / 2) +#define TASK_SIZE_MIN  (PGDIR_SIZE_L3 * PTRS_PER_PGD / 2)  #else -#define TASK_SIZE FIXADDR_START +#define TASK_SIZE	FIXADDR_START +#define TASK_SIZE_MIN	TASK_SIZE  #endif  #else /* CONFIG_MMU */ @@ -691,6 +735,8 @@ extern uintptr_t _dtb_early_pa;  #define dtb_early_va	_dtb_early_va  #define dtb_early_pa	_dtb_early_pa  #endif /* CONFIG_XIP_KERNEL */ +extern u64 satp_mode; +extern bool pgtable_l4_enabled;  void paging_init(void);  void misc_mem_init(void);  |