summaryrefslogtreecommitdiff
path: root/arch/riscv/mm/pageattr.c
diff options
context:
space:
mode:
authorZong Li <zong.li@sifive.com>2020-03-09 19:55:37 +0300
committerPalmer Dabbelt <palmerdabbelt@google.com>2020-03-26 19:24:33 +0300
commit395a21ff859c9c2471ea62d7d56af8a85ec333f7 (patch)
tree9e3d35bc7de9b774b388dbfb154332fbf2751ebe /arch/riscv/mm/pageattr.c
parentd3ab332a5021235a74fd832a49c6a99404920d88 (diff)
downloadlinux-395a21ff859c9c2471ea62d7d56af8a85ec333f7.tar.xz
riscv: add ARCH_HAS_SET_DIRECT_MAP support
Add set_direct_map_*() functions for setting the direct map alias for the page to its default permissions and to an invalid state that cannot be cached in a TLB. (See d253ca0c ("x86/mm/cpa: Add set_direct_map_*() functions")) Add a similar implementation for RISC-V. Signed-off-by: Zong Li <zong.li@sifive.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
Diffstat (limited to 'arch/riscv/mm/pageattr.c')
-rw-r--r--arch/riscv/mm/pageattr.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/riscv/mm/pageattr.c b/arch/riscv/mm/pageattr.c
index fcd59ef2835b..7be6cd67e2ef 100644
--- a/arch/riscv/mm/pageattr.c
+++ b/arch/riscv/mm/pageattr.c
@@ -148,3 +148,27 @@ int set_memory_nx(unsigned long addr, int numpages)
{
return __set_memory(addr, numpages, __pgprot(0), __pgprot(_PAGE_EXEC));
}
+
+int set_direct_map_invalid_noflush(struct page *page)
+{
+ unsigned long start = (unsigned long)page_address(page);
+ unsigned long end = start + PAGE_SIZE;
+ struct pageattr_masks masks = {
+ .set_mask = __pgprot(0),
+ .clear_mask = __pgprot(_PAGE_PRESENT)
+ };
+
+ return walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
+}
+
+int set_direct_map_default_noflush(struct page *page)
+{
+ unsigned long start = (unsigned long)page_address(page);
+ unsigned long end = start + PAGE_SIZE;
+ struct pageattr_masks masks = {
+ .set_mask = PAGE_KERNEL,
+ .clear_mask = __pgprot(0)
+ };
+
+ return walk_page_range(&init_mm, start, end, &pageattr_ops, &masks);
+}