From: Xueyuan Chen Implement set_direct_map_ro_noflush() for arm64 with update_range_prot() on the linear map, setting PTE_RDONLY and clearing PTE_WRITE. Keep the existing can_set_direct_map() guard and leave TLB invalidation to the caller. Co-developed-by: Lance Yang Signed-off-by: Lance Yang Signed-off-by: Xueyuan Chen --- arch/arm64/include/asm/set_memory.h | 2 ++ arch/arm64/mm/pageattr.c | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/arch/arm64/include/asm/set_memory.h b/arch/arm64/include/asm/set_memory.h index 90f61b17275e..7083260303c3 100644 --- a/arch/arm64/include/asm/set_memory.h +++ b/arch/arm64/include/asm/set_memory.h @@ -14,6 +14,8 @@ int set_memory_valid(unsigned long addr, int numpages, int enable); int set_direct_map_invalid_noflush(struct page *page); int set_direct_map_default_noflush(struct page *page); int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid); +int set_direct_map_ro_noflush(const void *addr, unsigned long nr_pages); +#define set_direct_map_ro_noflush set_direct_map_ro_noflush bool kernel_page_present(struct page *page); int set_memory_encrypted(unsigned long addr, int numpages); diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c index bbe98ac9ad8c..1a6769073558 100644 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@ -365,6 +365,16 @@ int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid) return set_memory_valid(addr, nr, valid); } +int set_direct_map_ro_noflush(const void *addr, unsigned long nr_pages) +{ + if (!can_set_direct_map()) + return 0; + + return update_range_prot((unsigned long)addr, PAGE_SIZE * nr_pages, + __pgprot(PTE_RDONLY), + __pgprot(PTE_WRITE)); +} + #ifdef CONFIG_DEBUG_PAGEALLOC /* * This is - apart from the return value - doing the same -- 2.49.0