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