@@ -22,4 +22,5 @@ extern void mmu_set_range_sect(pgd_t *pgtable, uintptr_t virt_offset,
extern void mmu_set_range_ptes(pgd_t *pgtable, uintptr_t virt_offset,
phys_addr_t phys_start, phys_addr_t phys_end,
pgprot_t prot);
+extern void mmu_clear_user(unsigned long vaddr);
#endif
@@ -217,3 +217,18 @@ unsigned long __phys_to_virt(phys_addr_t addr)
assert(!mmu_enabled() || __virt_to_phys(addr) == addr);
return addr;
}
+
+void mmu_clear_user(unsigned long vaddr)
+{
+ pgd_t *pgtable;
+ pteval_t *pte;
+
+ if (!mmu_enabled())
+ return;
+
+ pgtable = current_thread_info()->pgtable;
+ pte = get_pte(pgtable, vaddr);
+
+ *pte &= ~PTE_USER;
+ flush_tlb_page(vaddr);
+}