Merge tag 'for-linus-4.9-ofs1' of git://git.kernel.org/pub/scm/linux/kernel/git/hubca...
[sfrench/cifs-2.6.git] / arch / arm64 / lib / copy_page.S
1 /*
2  * Copyright (C) 2012 ARM Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15  */
16
17 #include <linux/linkage.h>
18 #include <linux/const.h>
19 #include <asm/assembler.h>
20 #include <asm/page.h>
21 #include <asm/cpufeature.h>
22 #include <asm/alternative.h>
23
24 /*
25  * Copy a page from src to dest (both are page aligned)
26  *
27  * Parameters:
28  *      x0 - dest
29  *      x1 - src
30  */
31 ENTRY(copy_page)
32 alternative_if ARM64_HAS_NO_HW_PREFETCH
33         # Prefetch two cache lines ahead.
34         prfm    pldl1strm, [x1, #128]
35         prfm    pldl1strm, [x1, #256]
36 alternative_else_nop_endif
37
38         ldp     x2, x3, [x1]
39         ldp     x4, x5, [x1, #16]
40         ldp     x6, x7, [x1, #32]
41         ldp     x8, x9, [x1, #48]
42         ldp     x10, x11, [x1, #64]
43         ldp     x12, x13, [x1, #80]
44         ldp     x14, x15, [x1, #96]
45         ldp     x16, x17, [x1, #112]
46
47         mov     x18, #(PAGE_SIZE - 128)
48         add     x1, x1, #128
49 1:
50         subs    x18, x18, #128
51
52 alternative_if ARM64_HAS_NO_HW_PREFETCH
53         prfm    pldl1strm, [x1, #384]
54 alternative_else_nop_endif
55
56         stnp    x2, x3, [x0]
57         ldp     x2, x3, [x1]
58         stnp    x4, x5, [x0, #16]
59         ldp     x4, x5, [x1, #16]
60         stnp    x6, x7, [x0, #32]
61         ldp     x6, x7, [x1, #32]
62         stnp    x8, x9, [x0, #48]
63         ldp     x8, x9, [x1, #48]
64         stnp    x10, x11, [x0, #64]
65         ldp     x10, x11, [x1, #64]
66         stnp    x12, x13, [x0, #80]
67         ldp     x12, x13, [x1, #80]
68         stnp    x14, x15, [x0, #96]
69         ldp     x14, x15, [x1, #96]
70         stnp    x16, x17, [x0, #112]
71         ldp     x16, x17, [x1, #112]
72
73         add     x0, x0, #128
74         add     x1, x1, #128
75
76         b.gt    1b
77
78         stnp    x2, x3, [x0]
79         stnp    x4, x5, [x0, #16]
80         stnp    x6, x7, [x0, #32]
81         stnp    x8, x9, [x0, #48]
82         stnp    x10, x11, [x0, #64]
83         stnp    x12, x13, [x0, #80]
84         stnp    x14, x15, [x0, #96]
85         stnp    x16, x17, [x0, #112]
86
87         ret
88 ENDPROC(copy_page)