riscv: Introduce set_kernel_memory helper
authorAlexandre Ghiti <alex@ghiti.fr>
Thu, 24 Jun 2021 12:00:40 +0000 (14:00 +0200)
committerPalmer Dabbelt <palmerdabbelt@google.com>
Thu, 1 Jul 2021 03:56:50 +0000 (20:56 -0700)
This helper should be used for setting permissions to the kernel
mapping as it takes pointers as arguments and then avoids explicit cast
to unsigned long needed for the set_memory_* API.

Suggested-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Alexandre Ghiti <alex@ghiti.fr>
Reviewed-by: Anup Patel <anup@brainfault.org>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Reviewed-by: Jisheng Zhang <jszhang@kernel.org>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
arch/riscv/include/asm/set_memory.h

index 086f757..135f726 100644 (file)
@@ -17,6 +17,16 @@ int set_memory_x(unsigned long addr, int numpages);
 int set_memory_nx(unsigned long addr, int numpages);
 int set_memory_rw_nx(unsigned long addr, int numpages);
 void protect_kernel_text_data(void);
+static __always_inline int set_kernel_memory(char *startp, char *endp,
+                                            int (*set_memory)(unsigned long start,
+                                                              int num_pages))
+{
+       unsigned long start = (unsigned long)startp;
+       unsigned long end = (unsigned long)endp;
+       int num_pages = PAGE_ALIGN(end - start) >> PAGE_SHIFT;
+
+       return set_memory(start, num_pages);
+}
 #else
 static inline int set_memory_ro(unsigned long addr, int numpages) { return 0; }
 static inline int set_memory_rw(unsigned long addr, int numpages) { return 0; }
@@ -24,6 +34,12 @@ static inline int set_memory_x(unsigned long addr, int numpages) { return 0; }
 static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; }
 static inline void protect_kernel_text_data(void) {}
 static inline int set_memory_rw_nx(unsigned long addr, int numpages) { return 0; }
+static inline int set_kernel_memory(char *startp, char *endp,
+                                   int (*set_memory)(unsigned long start,
+                                                     int num_pages))
+{
+       return 0;
+}
 #endif
 
 #if defined(CONFIG_64BIT) && defined(CONFIG_STRICT_KERNEL_RWX)