Thomas Gleixner | caab277 | 2019-06-03 07:44:50 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Marc Zyngier | f27bb13 | 2012-03-05 11:49:33 +0000 | [diff] [blame] | 2 | /* |
| 3 | * Copyright (C) 2012 ARM Ltd. |
Marc Zyngier | f27bb13 | 2012-03-05 11:49:33 +0000 | [diff] [blame] | 4 | */ |
| 5 | |
| 6 | #include <linux/linkage.h> |
| 7 | #include <linux/const.h> |
| 8 | #include <asm/assembler.h> |
| 9 | #include <asm/page.h> |
Andrew Pinski | 60e0a09 | 2016-02-02 12:46:26 +0000 | [diff] [blame] | 10 | #include <asm/cpufeature.h> |
| 11 | #include <asm/alternative.h> |
Marc Zyngier | f27bb13 | 2012-03-05 11:49:33 +0000 | [diff] [blame] | 12 | |
| 13 | /* |
| 14 | * Copy a page from src to dest (both are page aligned) |
| 15 | * |
| 16 | * Parameters: |
| 17 | * x0 - dest |
| 18 | * x1 - src |
| 19 | */ |
Mark Brown | 3ac0f45 | 2020-01-06 19:58:17 +0000 | [diff] [blame] | 20 | SYM_FUNC_START(copy_page) |
Mark Rutland | 6ba3b55 | 2016-09-07 11:07:09 +0100 | [diff] [blame] | 21 | alternative_if ARM64_HAS_NO_HW_PREFETCH |
Ard Biesheuvel | 288be97 | 2017-07-12 15:44:14 +0100 | [diff] [blame] | 22 | // Prefetch three cache lines ahead. |
| 23 | prfm pldl1strm, [x1, #128] |
| 24 | prfm pldl1strm, [x1, #256] |
| 25 | prfm pldl1strm, [x1, #384] |
Mark Rutland | 6ba3b55 | 2016-09-07 11:07:09 +0100 | [diff] [blame] | 26 | alternative_else_nop_endif |
Andrew Pinski | 60e0a09 | 2016-02-02 12:46:26 +0000 | [diff] [blame] | 27 | |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 28 | ldp x2, x3, [x1] |
Marc Zyngier | f27bb13 | 2012-03-05 11:49:33 +0000 | [diff] [blame] | 29 | ldp x4, x5, [x1, #16] |
| 30 | ldp x6, x7, [x1, #32] |
| 31 | ldp x8, x9, [x1, #48] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 32 | ldp x10, x11, [x1, #64] |
| 33 | ldp x12, x13, [x1, #80] |
| 34 | ldp x14, x15, [x1, #96] |
| 35 | ldp x16, x17, [x1, #112] |
| 36 | |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 37 | add x0, x0, #256 |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 38 | add x1, x1, #128 |
| 39 | 1: |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 40 | tst x0, #(PAGE_SIZE - 1) |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 41 | |
Mark Rutland | 6ba3b55 | 2016-09-07 11:07:09 +0100 | [diff] [blame] | 42 | alternative_if ARM64_HAS_NO_HW_PREFETCH |
Ard Biesheuvel | 288be97 | 2017-07-12 15:44:14 +0100 | [diff] [blame] | 43 | prfm pldl1strm, [x1, #384] |
Mark Rutland | 6ba3b55 | 2016-09-07 11:07:09 +0100 | [diff] [blame] | 44 | alternative_else_nop_endif |
Andrew Pinski | 60e0a09 | 2016-02-02 12:46:26 +0000 | [diff] [blame] | 45 | |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 46 | stnp x2, x3, [x0, #-256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 47 | ldp x2, x3, [x1] |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 48 | stnp x4, x5, [x0, #16 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 49 | ldp x4, x5, [x1, #16] |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 50 | stnp x6, x7, [x0, #32 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 51 | ldp x6, x7, [x1, #32] |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 52 | stnp x8, x9, [x0, #48 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 53 | ldp x8, x9, [x1, #48] |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 54 | stnp x10, x11, [x0, #64 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 55 | ldp x10, x11, [x1, #64] |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 56 | stnp x12, x13, [x0, #80 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 57 | ldp x12, x13, [x1, #80] |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 58 | stnp x14, x15, [x0, #96 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 59 | ldp x14, x15, [x1, #96] |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 60 | stnp x16, x17, [x0, #112 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 61 | ldp x16, x17, [x1, #112] |
| 62 | |
| 63 | add x0, x0, #128 |
| 64 | add x1, x1, #128 |
| 65 | |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 66 | b.ne 1b |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 67 | |
Ard Biesheuvel | 7f153cc | 2019-12-06 14:13:38 -0800 | [diff] [blame] | 68 | stnp x2, x3, [x0, #-256] |
| 69 | stnp x4, x5, [x0, #16 - 256] |
| 70 | stnp x6, x7, [x0, #32 - 256] |
| 71 | stnp x8, x9, [x0, #48 - 256] |
| 72 | stnp x10, x11, [x0, #64 - 256] |
| 73 | stnp x12, x13, [x0, #80 - 256] |
| 74 | stnp x14, x15, [x0, #96 - 256] |
| 75 | stnp x16, x17, [x0, #112 - 256] |
Will Deacon | 223e23e | 2016-02-02 12:46:25 +0000 | [diff] [blame] | 76 | |
Marc Zyngier | f27bb13 | 2012-03-05 11:49:33 +0000 | [diff] [blame] | 77 | ret |
Mark Brown | 3ac0f45 | 2020-01-06 19:58:17 +0000 | [diff] [blame] | 78 | SYM_FUNC_END(copy_page) |
Mark Rutland | 50fdecb | 2018-12-07 18:08:19 +0000 | [diff] [blame] | 79 | EXPORT_SYMBOL(copy_page) |