1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2019 SiFive 4 */ 5 6 #ifndef _ASM_RISCV_SET_MEMORY_H 7 #define _ASM_RISCV_SET_MEMORY_H 8 9 #ifndef __ASSEMBLY__ 10 /* 11 * Functions to change memory attributes. 12 */ 13 #ifdef CONFIG_MMU 14 int set_memory_ro(unsigned long addr, int numpages); 15 int set_memory_rw(unsigned long addr, int numpages); 16 int set_memory_x(unsigned long addr, int numpages); 17 int set_memory_nx(unsigned long addr, int numpages); 18 int set_memory_rw_nx(unsigned long addr, int numpages); 19 static __always_inline int set_kernel_memory(char *startp, char *endp, 20 int (*set_memory)(unsigned long start, 21 int num_pages)) 22 { 23 unsigned long start = (unsigned long)startp; 24 unsigned long end = (unsigned long)endp; 25 int num_pages = PAGE_ALIGN(end - start) >> PAGE_SHIFT; 26 27 return set_memory(start, num_pages); 28 } 29 #else 30 static inline int set_memory_ro(unsigned long addr, int numpages) { return 0; } 31 static inline int set_memory_rw(unsigned long addr, int numpages) { return 0; } 32 static inline int set_memory_x(unsigned long addr, int numpages) { return 0; } 33 static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; } 34 static inline int set_memory_rw_nx(unsigned long addr, int numpages) { return 0; } 35 static inline int set_kernel_memory(char *startp, char *endp, 36 int (*set_memory)(unsigned long start, 37 int num_pages)) 38 { 39 return 0; 40 } 41 #endif 42 43 int set_direct_map_invalid_noflush(struct page *page); 44 int set_direct_map_default_noflush(struct page *page); 45 bool kernel_page_present(struct page *page); 46 47 #endif /* __ASSEMBLY__ */ 48 49 #ifdef CONFIG_STRICT_KERNEL_RWX 50 #ifdef CONFIG_64BIT 51 #define SECTION_ALIGN (1 << 21) 52 #else 53 #define SECTION_ALIGN (1 << 22) 54 #endif 55 #else /* !CONFIG_STRICT_KERNEL_RWX */ 56 #define SECTION_ALIGN L1_CACHE_BYTES 57 #endif /* CONFIG_STRICT_KERNEL_RWX */ 58 59 #endif /* _ASM_RISCV_SET_MEMORY_H */ 60