xref: /openbmc/linux/arch/arm64/mm/copypage.c (revision 2efbafb9)
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 
copy_highpage(struct page * to,struct page * from)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 
24e74a6846SPeter Collingbourne 	if (kasan_hw_tags_enabled())
25e059853dSCatalin Marinas 		page_kasan_tag_reset(to);
26*2efbafb9SPeter Collingbourne 
27*2efbafb9SPeter Collingbourne 	if (system_supports_mte() && page_mte_tagged(from)) {
28d77e59a8SCatalin Marinas 		/* It's a new page, shouldn't have been tagged yet */
29d77e59a8SCatalin Marinas 		WARN_ON_ONCE(!try_page_mte_tagging(to));
302563776bSVincenzo Frascino 		mte_copy_page_tags(kto, kfrom);
31e059853dSCatalin Marinas 		set_page_mte_tagged(to);
321d18c47cSCatalin Marinas 	}
332563776bSVincenzo Frascino }
342563776bSVincenzo Frascino EXPORT_SYMBOL(copy_highpage);
352563776bSVincenzo Frascino 
copy_user_highpage(struct page * to,struct page * from,unsigned long vaddr,struct vm_area_struct * vma)362563776bSVincenzo Frascino void copy_user_highpage(struct page *to, struct page *from,
372563776bSVincenzo Frascino 			unsigned long vaddr, struct vm_area_struct *vma)
382563776bSVincenzo Frascino {
392563776bSVincenzo Frascino 	copy_highpage(to, from);
402563776bSVincenzo Frascino 	flush_dcache_page(to);
412563776bSVincenzo Frascino }
422563776bSVincenzo Frascino EXPORT_SYMBOL_GPL(copy_user_highpage);
43