1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
2 | /* |
3 | * Based on arch/arm/mm/copypage.c |
4 | * |
5 | * Copyright (C) 2002 Deep Blue Solutions Ltd, All Rights Reserved. |
6 | * Copyright (C) 2012 ARM Ltd. |
7 | */ |
8 | |
9 | #include <linux/bitops.h> |
10 | #include <linux/mm.h> |
11 | |
12 | #include <asm/page.h> |
13 | #include <asm/cacheflush.h> |
14 | #include <asm/cpufeature.h> |
15 | #include <asm/mte.h> |
16 | |
17 | void copy_highpage(struct page *to, struct page *from) |
18 | { |
19 | void *kto = page_address(to); |
20 | void *kfrom = page_address(from); |
21 | |
22 | copy_page(to: kto, from: kfrom); |
23 | |
24 | if (kasan_hw_tags_enabled()) |
25 | page_kasan_tag_reset(page: to); |
26 | |
27 | if (system_supports_mte() && page_mte_tagged(from)) { |
28 | /* It's a new page, shouldn't have been tagged yet */ |
29 | WARN_ON_ONCE(!try_page_mte_tagging(to)); |
30 | mte_copy_page_tags(kto, kfrom); |
31 | set_page_mte_tagged(to); |
32 | } |
33 | } |
34 | EXPORT_SYMBOL(copy_highpage); |
35 | |
36 | void copy_user_highpage(struct page *to, struct page *from, |
37 | unsigned long vaddr, struct vm_area_struct *vma) |
38 | { |
39 | copy_highpage(to, from); |
40 | flush_dcache_page(page: to); |
41 | } |
42 | EXPORT_SYMBOL_GPL(copy_user_highpage); |
43 |