ARM: 9164/1: mm: Provide set_memory_valid()
This function validates and invalidates PTE entries, it will be used in the later patch. Acked-by: Marco Elver <elver@google.com> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
This commit is contained in:
parent
dcc0a8f6b6
commit
0ba8695e3d
@ -11,6 +11,7 @@ int set_memory_ro(unsigned long addr, int numpages);
|
||||
int set_memory_rw(unsigned long addr, int numpages);
|
||||
int set_memory_x(unsigned long addr, int numpages);
|
||||
int set_memory_nx(unsigned long addr, int numpages);
|
||||
int set_memory_valid(unsigned long addr, int numpages, int enable);
|
||||
#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; }
|
||||
|
@ -32,14 +32,31 @@ static bool in_range(unsigned long start, unsigned long size,
|
||||
size <= range_end - start;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function assumes that the range is mapped with PAGE_SIZE pages.
|
||||
*/
|
||||
static int __change_memory_common(unsigned long start, unsigned long size,
|
||||
pgprot_t set_mask, pgprot_t clear_mask)
|
||||
{
|
||||
struct page_change_data data;
|
||||
int ret;
|
||||
|
||||
data.set_mask = set_mask;
|
||||
data.clear_mask = clear_mask;
|
||||
|
||||
ret = apply_to_page_range(&init_mm, start, size, change_page_range,
|
||||
&data);
|
||||
|
||||
flush_tlb_kernel_range(start, start + size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int change_memory_common(unsigned long addr, int numpages,
|
||||
pgprot_t set_mask, pgprot_t clear_mask)
|
||||
{
|
||||
unsigned long start = addr & PAGE_MASK;
|
||||
unsigned long end = PAGE_ALIGN(addr) + numpages * PAGE_SIZE;
|
||||
unsigned long size = end - start;
|
||||
int ret;
|
||||
struct page_change_data data;
|
||||
|
||||
WARN_ON_ONCE(start != addr);
|
||||
|
||||
@ -50,14 +67,7 @@ static int change_memory_common(unsigned long addr, int numpages,
|
||||
!in_range(start, size, VMALLOC_START, VMALLOC_END))
|
||||
return -EINVAL;
|
||||
|
||||
data.set_mask = set_mask;
|
||||
data.clear_mask = clear_mask;
|
||||
|
||||
ret = apply_to_page_range(&init_mm, start, size, change_page_range,
|
||||
&data);
|
||||
|
||||
flush_tlb_kernel_range(start, end);
|
||||
return ret;
|
||||
return __change_memory_common(start, size, set_mask, clear_mask);
|
||||
}
|
||||
|
||||
int set_memory_ro(unsigned long addr, int numpages)
|
||||
@ -87,3 +97,15 @@ int set_memory_x(unsigned long addr, int numpages)
|
||||
__pgprot(0),
|
||||
__pgprot(L_PTE_XN));
|
||||
}
|
||||
|
||||
int set_memory_valid(unsigned long addr, int numpages, int enable)
|
||||
{
|
||||
if (enable)
|
||||
return __change_memory_common(addr, PAGE_SIZE * numpages,
|
||||
__pgprot(L_PTE_VALID),
|
||||
__pgprot(0));
|
||||
else
|
||||
return __change_memory_common(addr, PAGE_SIZE * numpages,
|
||||
__pgprot(0),
|
||||
__pgprot(L_PTE_VALID));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user