arm64: fix "dc cvau" cache operation on errata-affected core
authorAndre Przywara <andre.przywara@arm.com>
Tue, 28 Jun 2016 17:07:28 +0000 (18:07 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 1 Jul 2016 10:26:20 +0000 (11:26 +0100)
The ARM errata 819472, 826319, 827319 and 824069 for affected
Cortex-A53 cores demand to promote "dc cvau" instructions to
"dc civac" as well.
Attribute the usage of the instruction in __flush_cache_user_range
to also be covered by our alternative patching efforts.
For that we introduce an assembly macro which both deals with
alternatives while still tagging the instructions as USER.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/alternative.h
arch/arm64/mm/cache.S

index 7288071195e1cb4dc174b707858bbbdfcf972d98..8746ff6abd7782210abe56c56b549e0c4e67ac68 100644 (file)
@@ -133,6 +133,10 @@ void apply_alternatives(void *start, size_t length);
 #define _ALTERNATIVE_CFG(insn1, insn2, cap, cfg, ...)  \
        alternative_insn insn1, insn2, cap, IS_ENABLED(cfg)
 
+.macro user_alt, label, oldinstr, newinstr, cond
+9999:  alternative_insn "\oldinstr", "\newinstr", \cond
+       _ASM_EXTABLE 9999b, \label
+.endm
 
 /*
  * Generate the assembly for UAO alternatives with exception table entries.
index 50ff9ba3a2367283e0340bb082c48f24678a5daa..07d7352d7c3896cb70d1640bb3215d09b3dc1ad6 100644 (file)
@@ -52,7 +52,7 @@ ENTRY(__flush_cache_user_range)
        sub     x3, x2, #1
        bic     x4, x0, x3
 1:
-USER(9f, dc    cvau, x4        )               // clean D line to PoU
+user_alt 9f, "dc cvau, x4",  "dc civac, x4",  ARM64_WORKAROUND_CLEAN_CACHE
        add     x4, x4, x2
        cmp     x4, x1
        b.lo    1b