18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Based on arch/arm/mm/copypage.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2002 Deep Blue Solutions Ltd, All Rights Reserved. 68c2ecf20Sopenharmony_ci * Copyright (C) 2012 ARM Ltd. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/bitops.h> 108c2ecf20Sopenharmony_ci#include <linux/mm.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <asm/page.h> 138c2ecf20Sopenharmony_ci#include <asm/cacheflush.h> 148c2ecf20Sopenharmony_ci#include <asm/cpufeature.h> 158c2ecf20Sopenharmony_ci#include <asm/mte.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_civoid copy_highpage(struct page *to, struct page *from) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci void *kto = page_address(to); 208c2ecf20Sopenharmony_ci void *kfrom = page_address(from); 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci copy_page(kto, kfrom); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci if (system_supports_mte() && test_bit(PG_mte_tagged, &from->flags)) { 258c2ecf20Sopenharmony_ci set_bit(PG_mte_tagged, &to->flags); 268c2ecf20Sopenharmony_ci mte_copy_page_tags(kto, kfrom); 278c2ecf20Sopenharmony_ci } 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ciEXPORT_SYMBOL(copy_highpage); 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_civoid copy_user_highpage(struct page *to, struct page *from, 328c2ecf20Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci copy_highpage(to, from); 358c2ecf20Sopenharmony_ci flush_dcache_page(to); 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(copy_user_highpage); 38