mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 01:10:04 +00:00
ARM: Pass VMA to copy_user_highpage() implementations
Our copy_user_highpage() implementations may require cache maintainence. Ensure that implementations have all necessary details to perform this maintainence. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
8a0382f6fc
commit
f00a75c094
9 changed files with 13 additions and 12 deletions
|
@ -117,11 +117,12 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct page;
|
struct page;
|
||||||
|
struct vm_area_struct;
|
||||||
|
|
||||||
struct cpu_user_fns {
|
struct cpu_user_fns {
|
||||||
void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr);
|
void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr);
|
||||||
void (*cpu_copy_user_highpage)(struct page *to, struct page *from,
|
void (*cpu_copy_user_highpage)(struct page *to, struct page *from,
|
||||||
unsigned long vaddr);
|
unsigned long vaddr, struct vm_area_struct *vma);
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef MULTI_USER
|
#ifdef MULTI_USER
|
||||||
|
@ -137,7 +138,7 @@ extern struct cpu_user_fns cpu_user;
|
||||||
|
|
||||||
extern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr);
|
extern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr);
|
||||||
extern void __cpu_copy_user_highpage(struct page *to, struct page *from,
|
extern void __cpu_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr);
|
unsigned long vaddr, struct vm_area_struct *vma);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define clear_user_highpage(page,vaddr) \
|
#define clear_user_highpage(page,vaddr) \
|
||||||
|
@ -145,7 +146,7 @@ extern void __cpu_copy_user_highpage(struct page *to, struct page *from,
|
||||||
|
|
||||||
#define __HAVE_ARCH_COPY_USER_HIGHPAGE
|
#define __HAVE_ARCH_COPY_USER_HIGHPAGE
|
||||||
#define copy_user_highpage(to,from,vaddr,vma) \
|
#define copy_user_highpage(to,from,vaddr,vma) \
|
||||||
__cpu_copy_user_highpage(to, from, vaddr)
|
__cpu_copy_user_highpage(to, from, vaddr, vma)
|
||||||
|
|
||||||
#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
|
#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
|
||||||
extern void copy_page(void *to, const void *from);
|
extern void copy_page(void *to, const void *from);
|
||||||
|
|
|
@ -68,7 +68,7 @@ feroceon_copy_user_page(void *kto, const void *kfrom)
|
||||||
}
|
}
|
||||||
|
|
||||||
void feroceon_copy_user_highpage(struct page *to, struct page *from,
|
void feroceon_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto, *kfrom;
|
void *kto, *kfrom;
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ v3_copy_user_page(void *kto, const void *kfrom)
|
||||||
}
|
}
|
||||||
|
|
||||||
void v3_copy_user_highpage(struct page *to, struct page *from,
|
void v3_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto, *kfrom;
|
void *kto, *kfrom;
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ mc_copy_user_page(void *from, void *to)
|
||||||
}
|
}
|
||||||
|
|
||||||
void v4_mc_copy_user_highpage(struct page *to, struct page *from,
|
void v4_mc_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto = kmap_atomic(to, KM_USER1);
|
void *kto = kmap_atomic(to, KM_USER1);
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ v4wb_copy_user_page(void *kto, const void *kfrom)
|
||||||
}
|
}
|
||||||
|
|
||||||
void v4wb_copy_user_highpage(struct page *to, struct page *from,
|
void v4wb_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto, *kfrom;
|
void *kto, *kfrom;
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ v4wt_copy_user_page(void *kto, const void *kfrom)
|
||||||
}
|
}
|
||||||
|
|
||||||
void v4wt_copy_user_highpage(struct page *to, struct page *from,
|
void v4wt_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto, *kfrom;
|
void *kto, *kfrom;
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ static DEFINE_SPINLOCK(v6_lock);
|
||||||
* attack the kernel's existing mapping of these pages.
|
* attack the kernel's existing mapping of these pages.
|
||||||
*/
|
*/
|
||||||
static void v6_copy_user_highpage_nonaliasing(struct page *to,
|
static void v6_copy_user_highpage_nonaliasing(struct page *to,
|
||||||
struct page *from, unsigned long vaddr)
|
struct page *from, unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto, *kfrom;
|
void *kto, *kfrom;
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ static void discard_old_kernel_data(void *kto)
|
||||||
* Copy the page, taking account of the cache colour.
|
* Copy the page, taking account of the cache colour.
|
||||||
*/
|
*/
|
||||||
static void v6_copy_user_highpage_aliasing(struct page *to,
|
static void v6_copy_user_highpage_aliasing(struct page *to,
|
||||||
struct page *from, unsigned long vaddr)
|
struct page *from, unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
unsigned int offset = CACHE_COLOUR(vaddr);
|
unsigned int offset = CACHE_COLOUR(vaddr);
|
||||||
unsigned long kfrom, kto;
|
unsigned long kfrom, kto;
|
||||||
|
|
|
@ -71,7 +71,7 @@ xsc3_mc_copy_user_page(void *kto, const void *kfrom)
|
||||||
}
|
}
|
||||||
|
|
||||||
void xsc3_mc_copy_user_highpage(struct page *to, struct page *from,
|
void xsc3_mc_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto, *kfrom;
|
void *kto, *kfrom;
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ mc_copy_user_page(void *from, void *to)
|
||||||
}
|
}
|
||||||
|
|
||||||
void xscale_mc_copy_user_highpage(struct page *to, struct page *from,
|
void xscale_mc_copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
void *kto = kmap_atomic(to, KM_USER1);
|
void *kto = kmap_atomic(to, KM_USER1);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue