• Ard Biesheuvel's avatar
    ARM: 8941/1: decompressor: enable CP15 barrier instructions in v7 cache setup code · 8239fc77
    Ard Biesheuvel authored
    Commit e17b1af9
    
      "ARM: 8857/1: efi: enable CP15 DMB instructions before cleaning the cache"
    
    added some explicit handling of the CP15BEN bit in the SCTLR system
    register, to ensure that CP15 barrier instructions are enabled, even
    if we enter the decompressor via the EFI stub.
    
    However, as it turns out, there are other ways in which we may end up
    using CP15 barrier instructions without them being enabled. I.e., when
    the decompressor startup code skips the cache_on() initially, we end
    up calling cache_clean_flush() with the caches and MMU off, in which
    case the CP15BEN bit in SCTLR may not be programmed either. And in
    fact, cache_on() itself issues CP15 barrier instructions before actually
    enabling them by programming the new SCTLR value (and issuing an ISB)
    
    Since these routines are shared between v7 CPUs and older ones that
    implement the CPUID extension as well, using the ordinary v7 barrier
    instructions in this code is not possible, and so we should enable the
    CP15 ones explicitly before issuing them. Note that a v7 ISB is still
    required between programming the SCTLR register and using the CP15 barrier
    instructions, and we should take care to branch over it if the CP15BEN
    bit is already set, given that in that case, the CPU may not support it.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    8239fc77
head.S 37.8 KB