Linux 3.12.28
[linux/fpc-iii.git] / arch / arm64 / lib / copy_page.S
blob512b9a7b980e98bbed9a699107e936e4b1913dca
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  */
17 #include <linux/linkage.h>
18 #include <linux/const.h>
19 #include <asm/assembler.h>
20 #include <asm/page.h>
23  * Copy a page from src to dest (both are page aligned)
24  *
25  * Parameters:
26  *      x0 - dest
27  *      x1 - src
28  */
29 ENTRY(copy_page)
30         /* Assume cache line size is 64 bytes. */
31         prfm    pldl1strm, [x1, #64]
32 1:      ldp     x2, x3, [x1]
33         ldp     x4, x5, [x1, #16]
34         ldp     x6, x7, [x1, #32]
35         ldp     x8, x9, [x1, #48]
36         add     x1, x1, #64
37         prfm    pldl1strm, [x1, #64]
38         stnp    x2, x3, [x0]
39         stnp    x4, x5, [x0, #16]
40         stnp    x6, x7, [x0, #32]
41         stnp    x8, x9, [x0, #48]
42         add     x0, x0, #64
43         tst     x1, #(PAGE_SIZE - 1)
44         b.ne    1b
45         ret
46 ENDPROC(copy_page)