lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 333/663] ARM: 9046/1: decompressor: Do not clear SCTLR.nTLSMD for ARMv7+ cores
    Date
    From: Vladimir Murzin <vladimir.murzin@arm.com>

    [ Upstream commit 2acb909750431030b65a0a2a17fd8afcbd813a84 ]

    It was observed that decompressor running on hardware implementing ARM v8.2
    Load/Store Multiple Atomicity and Ordering Control (LSMAOC), say, as guest,
    would stuck just after:

    Uncompressing Linux... done, booting the kernel.

    The reason is that it clears nTLSMD bit when disabling caches:

    nTLSMD, bit [3]

    When ARMv8.2-LSMAOC is implemented:

    No Trap Load Multiple and Store Multiple to
    Device-nGRE/Device-nGnRE/Device-nGnRnE memory.

    0b0 All memory accesses by A32 and T32 Load Multiple and Store
    Multiple at EL1 or EL0 that are marked at stage 1 as
    Device-nGRE/Device-nGnRE/Device-nGnRnE memory are trapped and
    generate a stage 1 Alignment fault.

    0b1 All memory accesses by A32 and T32 Load Multiple and Store
    Multiple at EL1 or EL0 that are marked at stage 1 as
    Device-nGRE/Device-nGnRE/Device-nGnRnE memory are not trapped.

    This bit is permitted to be cached in a TLB.

    This field resets to 1.

    Otherwise:

    Reserved, RES1

    So as effect we start getting traps we are not quite ready for.

    Looking into history it seems that mask used for SCTLR clear came from
    the similar code for ARMv4, where bit[3] is the enable/disable bit for
    the write buffer. That not applicable to ARMv7 and onwards, so retire
    that bit from the masks.

    Fixes: 7d09e85448dfa78e3e58186c934449aaf6d49b50 ("[ARM] 4393/2: ARMv7: Add uncompressing code for the new CPU Id format")
    Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm/boot/compressed/head.S | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
    index 3a392983ac079..a0de09f994d88 100644
    --- a/arch/arm/boot/compressed/head.S
    +++ b/arch/arm/boot/compressed/head.S
    @@ -1175,9 +1175,9 @@ __armv4_mmu_cache_off:
    __armv7_mmu_cache_off:
    mrc p15, 0, r0, c1, c0
    #ifdef CONFIG_MMU
    - bic r0, r0, #0x000d
    + bic r0, r0, #0x0005
    #else
    - bic r0, r0, #0x000c
    + bic r0, r0, #0x0004
    #endif
    mcr p15, 0, r0, c1, c0 @ turn MMU and cache off
    mov r0, #0
    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-02 04:10    [W:5.529 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site