Linux 6.7-rc7
[linux-modified.git] / arch / arm64 / lib / clear_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
11 /*
12  * Clear page @dest
13  *
14  * Parameters:
15  *      x0 - dest
16  */
17 SYM_FUNC_START(__pi_clear_page)
18         mrs     x1, dczid_el0
19         tbnz    x1, #4, 2f      /* Branch if DC ZVA is prohibited */
20         and     w1, w1, #0xf
21         mov     x2, #4
22         lsl     x1, x2, x1
23
24 1:      dc      zva, x0
25         add     x0, x0, x1
26         tst     x0, #(PAGE_SIZE - 1)
27         b.ne    1b
28         ret
29
30 2:      stnp    xzr, xzr, [x0]
31         stnp    xzr, xzr, [x0, #16]
32         stnp    xzr, xzr, [x0, #32]
33         stnp    xzr, xzr, [x0, #48]
34         add     x0, x0, #64
35         tst     x0, #(PAGE_SIZE - 1)
36         b.ne    2b
37         ret
38 SYM_FUNC_END(__pi_clear_page)
39 SYM_FUNC_ALIAS(clear_page, __pi_clear_page)
40 EXPORT_SYMBOL(clear_page)