• Jon Medhurst's avatar
    ARM: 8667/3: Fix memory attribute inconsistencies when using fixmap · b089c31c
    Jon Medhurst authored
    To cope with the variety in ARM architectures and configurations, the
    pagetable attributes for kernel memory are generated at runtime to match
    the system the kernel finds itself on. This calculated value is stored
    in pgprot_kernel.
    
    However, when early fixmap support was added for ARM (commit
    a5f4c561) the attributes used for mappings were hard coded because
    pgprot_kernel is not set up early enough. Unfortunately, when fixmap is
    used after early boot this means the memory being mapped can have
    different attributes to existing mappings, potentially leading to
    unpredictable behaviour. A specific problem also exists due to the hard
    coded values not include the 'shareable' attribute which means on
    systems where this matters (e.g. those with multiple CPU clusters) the
    cache contents for a memory location can become inconsistent between
    CPUs.
    
    To resolve these issues we change fixmap to use the same memory
    attributes (from pgprot_kernel) that the rest of the kernel uses. To
    enable this we need to refactor the initialisation code so
    build_mem_type_table() is called early enough. Note, that relies on early
    param parsing for memory type overrides passed via the kernel command
    line, so we need to make sure this call is still after
    parse_early_params().
    
    [ardb: keep early_fixmap_init() before param parsing, for earlycon]
    
    Fixes: a5f4c561 ("ARM: 8415/1: early fixmap support for earlycon")
    Cc: <stable@vger.kernel.org> # v4.3+
    Tested-by: default avatarafzal mohammed <afzal.mohd.ma@gmail.com>
    Signed-off-by: default avatarJon Medhurst <tixy@linaro.org>
    Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    b089c31c
setup.c 30.9 KB