aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm')
-rw-r--r--arch/arm/mm/mmu.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 9ec715f12224..09033890c8b0 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -345,6 +345,44 @@ const struct mem_type *get_mem_type(unsigned int type)
345} 345}
346EXPORT_SYMBOL(get_mem_type); 346EXPORT_SYMBOL(get_mem_type);
347 347
348#define PTE_SET_FN(_name, pteop) \
349static int pte_set_##_name(pte_t *ptep, pgtable_t token, unsigned long addr, \
350 void *data) \
351{ \
352 pte_t pte = pteop(*ptep); \
353\
354 set_pte_ext(ptep, pte, 0); \
355 return 0; \
356} \
357
358#define SET_MEMORY_FN(_name, callback) \
359int set_memory_##_name(unsigned long addr, int numpages) \
360{ \
361 unsigned long start = addr; \
362 unsigned long size = PAGE_SIZE*numpages; \
363 unsigned end = start + size; \
364\
365 if (start < MODULES_VADDR || start >= MODULES_END) \
366 return -EINVAL;\
367\
368 if (end < MODULES_VADDR || end >= MODULES_END) \
369 return -EINVAL; \
370\
371 apply_to_page_range(&init_mm, start, size, callback, NULL); \
372 flush_tlb_kernel_range(start, end); \
373 return 0;\
374}
375
376PTE_SET_FN(ro, pte_wrprotect)
377PTE_SET_FN(rw, pte_mkwrite)
378PTE_SET_FN(x, pte_mkexec)
379PTE_SET_FN(nx, pte_mknexec)
380
381SET_MEMORY_FN(ro, pte_set_ro)
382SET_MEMORY_FN(rw, pte_set_rw)
383SET_MEMORY_FN(x, pte_set_x)
384SET_MEMORY_FN(nx, pte_set_nx)
385
348/* 386/*
349 * Adjust the PMD section entries according to the CPU in use. 387 * Adjust the PMD section entries according to the CPU in use.
350 */ 388 */