xref: /openbmc/linux/arch/arm64/mm/copypage.c (revision e059853d)
1caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21d18c47cSCatalin Marinas /*
31d18c47cSCatalin Marinas  * Based on arch/arm/mm/copypage.c
41d18c47cSCatalin Marinas  *
51d18c47cSCatalin Marinas  * Copyright (C) 2002 Deep Blue Solutions Ltd, All Rights Reserved.
61d18c47cSCatalin Marinas  * Copyright (C) 2012 ARM Ltd.
71d18c47cSCatalin Marinas  */
81d18c47cSCatalin Marinas 
92563776bSVincenzo Frascino #include <linux/bitops.h>
101d18c47cSCatalin Marinas #include <linux/mm.h>
111d18c47cSCatalin Marinas 
121d18c47cSCatalin Marinas #include <asm/page.h>
131d18c47cSCatalin Marinas #include <asm/cacheflush.h>
142563776bSVincenzo Frascino #include <asm/cpufeature.h>
152563776bSVincenzo Frascino #include <asm/mte.h>
161d18c47cSCatalin Marinas 
172563776bSVincenzo Frascino void copy_highpage(struct page *to, struct page *from)
181d18c47cSCatalin Marinas {
19921d161fSTong Tiangen 	void *kto = page_address(to);
20921d161fSTong Tiangen 	void *kfrom = page_address(from);
212563776bSVincenzo Frascino 
221d18c47cSCatalin Marinas 	copy_page(kto, kfrom);
232563776bSVincenzo Frascino 
24*e059853dSCatalin Marinas 	if (system_supports_mte() && page_mte_tagged(from)) {
25*e059853dSCatalin Marinas 		page_kasan_tag_reset(to);
262563776bSVincenzo Frascino 		mte_copy_page_tags(kto, kfrom);
27*e059853dSCatalin Marinas 		set_page_mte_tagged(to);
281d18c47cSCatalin Marinas 	}
292563776bSVincenzo Frascino }
302563776bSVincenzo Frascino EXPORT_SYMBOL(copy_highpage);
312563776bSVincenzo Frascino 
322563776bSVincenzo Frascino void copy_user_highpage(struct page *to, struct page *from,
332563776bSVincenzo Frascino 			unsigned long vaddr, struct vm_area_struct *vma)
342563776bSVincenzo Frascino {
352563776bSVincenzo Frascino 	copy_highpage(to, from);
362563776bSVincenzo Frascino 	flush_dcache_page(to);
372563776bSVincenzo Frascino }
382563776bSVincenzo Frascino EXPORT_SYMBOL_GPL(copy_user_highpage);
39