GNU Linux-libre 6.9.1-gnu
[releases.git] / arch / arm64 / lib / copy_page.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2012 ARM Ltd.
4  */
5
6 #include <linux/linkage.h>
7 #include <linux/const.h>
8 #include <asm/assembler.h>
9 #include <asm/page.h>
10 #include <asm/cpufeature.h>
11 #include <asm/alternative.h>
12
13 /*
14  * Copy a page from src to dest (both are page aligned)
15  *
16  * Parameters:
17  *      x0 - dest
18  *      x1 - src
19  */
20 SYM_FUNC_START(__pi_copy_page)
21         ldp     x2, x3, [x1]
22         ldp     x4, x5, [x1, #16]
23         ldp     x6, x7, [x1, #32]
24         ldp     x8, x9, [x1, #48]
25         ldp     x10, x11, [x1, #64]
26         ldp     x12, x13, [x1, #80]
27         ldp     x14, x15, [x1, #96]
28         ldp     x16, x17, [x1, #112]
29
30         add     x0, x0, #256
31         add     x1, x1, #128
32 1:
33         tst     x0, #(PAGE_SIZE - 1)
34
35         stnp    x2, x3, [x0, #-256]
36         ldp     x2, x3, [x1]
37         stnp    x4, x5, [x0, #16 - 256]
38         ldp     x4, x5, [x1, #16]
39         stnp    x6, x7, [x0, #32 - 256]
40         ldp     x6, x7, [x1, #32]
41         stnp    x8, x9, [x0, #48 - 256]
42         ldp     x8, x9, [x1, #48]
43         stnp    x10, x11, [x0, #64 - 256]
44         ldp     x10, x11, [x1, #64]
45         stnp    x12, x13, [x0, #80 - 256]
46         ldp     x12, x13, [x1, #80]
47         stnp    x14, x15, [x0, #96 - 256]
48         ldp     x14, x15, [x1, #96]
49         stnp    x16, x17, [x0, #112 - 256]
50         ldp     x16, x17, [x1, #112]
51
52         add     x0, x0, #128
53         add     x1, x1, #128
54
55         b.ne    1b
56
57         stnp    x2, x3, [x0, #-256]
58         stnp    x4, x5, [x0, #16 - 256]
59         stnp    x6, x7, [x0, #32 - 256]
60         stnp    x8, x9, [x0, #48 - 256]
61         stnp    x10, x11, [x0, #64 - 256]
62         stnp    x12, x13, [x0, #80 - 256]
63         stnp    x14, x15, [x0, #96 - 256]
64         stnp    x16, x17, [x0, #112 - 256]
65
66         ret
67 SYM_FUNC_END(__pi_copy_page)
68 SYM_FUNC_ALIAS(copy_page, __pi_copy_page)
69 EXPORT_SYMBOL(copy_page)