[PATCH] arm64: mm: use correct mapping granularity under DEBUG_RODATA

Laura Abbott labbott at redhat.com
Mon Nov 16 15:14:16 PST 2015


On 11/16/2015 02:18 AM, Ard Biesheuvel wrote:
> When booting a 64k pages kernel that is built with CONFIG_DEBUG_RODATA
> and resides at an offset that is not a multiple of 512 MB, the rounding
> that occurs in __map_memblock() and fixup_executable() results in
> incorrect regions being mapped.
>
> The following snippet from /sys/kernel/debug/kernel_page_tables shows
> how, when the kernel is loaded 2 MB above the base of DRAM at 0x40000000,
> the first 2 MB of memory (which may be inaccessible from non-secure EL1
> or just reserved by the firmware) is inadvertently mapped into the end of
> the module region.
>
>    ---[ Modules start ]---
>    0xfffffdffffe00000-0xfffffe0000000000     2M RW NX ... UXN MEM/NORMAL
>    ---[ Modules end ]---
>    ---[ Kernel Mapping ]---
>    0xfffffe0000000000-0xfffffe0000090000   576K RW NX ... UXN MEM/NORMAL
>    0xfffffe0000090000-0xfffffe0000200000  1472K ro x  ... UXN MEM/NORMAL
>    0xfffffe0000200000-0xfffffe0000800000     6M ro x  ... UXN MEM/NORMAL
>    0xfffffe0000800000-0xfffffe0000810000    64K ro x  ... UXN MEM/NORMAL
>    0xfffffe0000810000-0xfffffe0000a00000  1984K RW NX ... UXN MEM/NORMAL
>    0xfffffe0000a00000-0xfffffe00ffe00000  4084M RW NX ... UXN MEM/NORMAL
>
> The same issue is likely to occur on 16k pages kernels whose load
> address is not a multiple of 32 MB (i.e., SECTION_SIZE). So round to
> SWAPPER_BLOCK_SIZE instead of SECTION_SIZE.
>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>

Acked-by: Laura Abbott <labbott at redhat.com>

Thanks,
Laura




More information about the linux-arm-kernel mailing list