diff options
Diffstat (limited to 'arch/riscv/include/asm/pgtable.h')
| -rw-r--r-- | arch/riscv/include/asm/pgtable.h | 62 | 
1 files changed, 32 insertions, 30 deletions
| diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h index 3399257780b2..16301966d65b 100644 --- a/arch/riscv/include/asm/pgtable.h +++ b/arch/riscv/include/asm/pgtable.h @@ -20,8 +20,6 @@  #ifndef __ASSEMBLY__ -#ifdef CONFIG_MMU -  /* Page Upper Directory not used in RISC-V */  #include <asm-generic/pgtable-nopud.h>  #include <asm/page.h> @@ -178,28 +176,6 @@ static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long addr)  #define pte_offset_map(dir, addr)	pte_offset_kernel((dir), (addr))  #define pte_unmap(pte)			((void)(pte)) -/* - * Certain architectures need to do special things when PTEs within - * a page table are directly modified.  Thus, the following hook is - * made available. - */ -static inline void set_pte(pte_t *ptep, pte_t pteval) -{ -	*ptep = pteval; -} - -static inline void set_pte_at(struct mm_struct *mm, -	unsigned long addr, pte_t *ptep, pte_t pteval) -{ -	set_pte(ptep, pteval); -} - -static inline void pte_clear(struct mm_struct *mm, -	unsigned long addr, pte_t *ptep) -{ -	set_pte_at(mm, addr, ptep, __pte(0)); -} -  static inline int pte_present(pte_t pte)  {  	return (pte_val(pte) & _PAGE_PRESENT); @@ -210,21 +186,22 @@ static inline int pte_none(pte_t pte)  	return (pte_val(pte) == 0);  } -/* static inline int pte_read(pte_t pte) */ -  static inline int pte_write(pte_t pte)  {  	return pte_val(pte) & _PAGE_WRITE;  } +static inline int pte_exec(pte_t pte) +{ +	return pte_val(pte) & _PAGE_EXEC; +} +  static inline int pte_huge(pte_t pte)  {  	return pte_present(pte)  		&& (pte_val(pte) & (_PAGE_READ | _PAGE_WRITE | _PAGE_EXEC));  } -/* static inline int pte_exec(pte_t pte) */ -  static inline int pte_dirty(pte_t pte)  {  	return pte_val(pte) & _PAGE_DIRTY; @@ -311,6 +288,33 @@ static inline int pte_same(pte_t pte_a, pte_t pte_b)  	return pte_val(pte_a) == pte_val(pte_b);  } +/* + * Certain architectures need to do special things when PTEs within + * a page table are directly modified.  Thus, the following hook is + * made available. + */ +static inline void set_pte(pte_t *ptep, pte_t pteval) +{ +	*ptep = pteval; +} + +void flush_icache_pte(pte_t pte); + +static inline void set_pte_at(struct mm_struct *mm, +	unsigned long addr, pte_t *ptep, pte_t pteval) +{ +	if (pte_present(pteval) && pte_exec(pteval)) +		flush_icache_pte(pteval); + +	set_pte(ptep, pteval); +} + +static inline void pte_clear(struct mm_struct *mm, +	unsigned long addr, pte_t *ptep) +{ +	set_pte_at(mm, addr, ptep, __pte(0)); +} +  #define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS  static inline int ptep_set_access_flags(struct vm_area_struct *vma,  					unsigned long address, pte_t *ptep, @@ -407,8 +411,6 @@ static inline void pgtable_cache_init(void)  	/* No page table caches to initialize */  } -#endif /* CONFIG_MMU */ -  #define VMALLOC_SIZE     (KERN_VIRT_SIZE >> 1)  #define VMALLOC_END      (PAGE_OFFSET - 1)  #define VMALLOC_START    (PAGE_OFFSET - VMALLOC_SIZE) |