arm64: clear_page() shouldn't use DC ZVA when DCZID_EL0.DZP == 1
authorReiji Watanabe <reijiw@google.com>
Mon, 6 Dec 2021 00:47:35 +0000 (16:47 -0800)
committerCatalin Marinas <catalin.marinas@arm.com>
Mon, 6 Dec 2021 17:02:10 +0000 (17:02 +0000)
Currently, clear_page() uses DC ZVA instruction unconditionally.  But it
should make sure that DCZID_EL0.DZP, which indicates whether or not use
of DC ZVA instruction is prohibited, is zero when using the instruction.
Use STNP instead when DCZID_EL0.DZP == 1.

Fixes: f27bb139c387 ("arm64: Miscellaneous library functions")
Signed-off-by: Reiji Watanabe <reijiw@google.com>
Reviewed-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/20211206004736.1520989-2-reijiw@google.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/lib/clear_page.S

index b84b179..1fd5d79 100644 (file)
@@ -16,6 +16,7 @@
  */
 SYM_FUNC_START_PI(clear_page)
        mrs     x1, dczid_el0
+       tbnz    x1, #4, 2f      /* Branch if DC ZVA is prohibited */
        and     w1, w1, #0xf
        mov     x2, #4
        lsl     x1, x2, x1
@@ -25,5 +26,14 @@ SYM_FUNC_START_PI(clear_page)
        tst     x0, #(PAGE_SIZE - 1)
        b.ne    1b
        ret
+
+2:     stnp    xzr, xzr, [x0]
+       stnp    xzr, xzr, [x0, #16]
+       stnp    xzr, xzr, [x0, #32]
+       stnp    xzr, xzr, [x0, #48]
+       add     x0, x0, #64
+       tst     x0, #(PAGE_SIZE - 1)
+       b.ne    2b
+       ret
 SYM_FUNC_END_PI(clear_page)
 EXPORT_SYMBOL(clear_page)