From: mark.rutland@arm.com (Mark Rutland)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] arm64: mm: use correct mapping granularity under DEBUG_RODATA
Date: Mon, 16 Nov 2015 11:57:40 +0000 [thread overview]
Message-ID: <20151116115740.GD20696@leverpostej> (raw)
In-Reply-To: <1447669094-31076-1-git-send-email-ard.biesheuvel@linaro.org>
Hi Ard,
On Mon, Nov 16, 2015 at 11:18:14AM +0100, 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.
I assume for the above that you mean the kernel is loaded TEXT_OFFSET
above these addresses. It's only a nit, but it might make things harder
for otehrs to reason about in future.
Perhaps re-word in terms of PHYS_OFFSET/memstart_addr? e.g. "when
PHYS_OFFSET is not a multiple of SECTION_SIZE ...".
> ---[ 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@linaro.org>
This looks good to me. With or without the rewording above:
Acked-by: Mark Rutland <mark.rutland@arm.com>
Does this need to be backported to stable?
Mark.
> ---
> arch/arm64/mm/mmu.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
> index e3f563c81c48..32ddd893da9a 100644
> --- a/arch/arm64/mm/mmu.c
> +++ b/arch/arm64/mm/mmu.c
> @@ -362,8 +362,8 @@ static void __init __map_memblock(phys_addr_t start, phys_addr_t end)
> * for now. This will get more fine grained later once all memory
> * is mapped
> */
> - unsigned long kernel_x_start = round_down(__pa(_stext), SECTION_SIZE);
> - unsigned long kernel_x_end = round_up(__pa(__init_end), SECTION_SIZE);
> + unsigned long kernel_x_start = round_down(__pa(_stext), SWAPPER_BLOCK_SIZE);
> + unsigned long kernel_x_end = round_up(__pa(__init_end), SWAPPER_BLOCK_SIZE);
>
> if (end < kernel_x_start) {
> create_mapping(start, __phys_to_virt(start),
> @@ -451,18 +451,18 @@ static void __init fixup_executable(void)
> {
> #ifdef CONFIG_DEBUG_RODATA
> /* now that we are actually fully mapped, make the start/end more fine grained */
> - if (!IS_ALIGNED((unsigned long)_stext, SECTION_SIZE)) {
> + if (!IS_ALIGNED((unsigned long)_stext, SWAPPER_BLOCK_SIZE)) {
> unsigned long aligned_start = round_down(__pa(_stext),
> - SECTION_SIZE);
> + SWAPPER_BLOCK_SIZE);
>
> create_mapping(aligned_start, __phys_to_virt(aligned_start),
> __pa(_stext) - aligned_start,
> PAGE_KERNEL);
> }
>
> - if (!IS_ALIGNED((unsigned long)__init_end, SECTION_SIZE)) {
> + if (!IS_ALIGNED((unsigned long)__init_end, SWAPPER_BLOCK_SIZE)) {
> unsigned long aligned_end = round_up(__pa(__init_end),
> - SECTION_SIZE);
> + SWAPPER_BLOCK_SIZE);
> create_mapping(__pa(__init_end), (unsigned long)__init_end,
> aligned_end - __pa(__init_end),
> PAGE_KERNEL);
> --
> 1.9.1
>
next prev parent reply other threads:[~2015-11-16 11:57 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-16 10:18 [PATCH] arm64: mm: use correct mapping granularity under DEBUG_RODATA Ard Biesheuvel
2015-11-16 11:57 ` Mark Rutland [this message]
2015-11-16 12:00 ` Ard Biesheuvel
2015-11-16 12:16 ` Mark Rutland
2015-11-16 12:18 ` Ard Biesheuvel
2015-11-17 11:11 ` Catalin Marinas
2015-11-17 11:14 ` Ard Biesheuvel
2015-11-16 23:14 ` Laura Abbott
-- strict thread matches above, loose matches on Subject: below --
2016-01-28 8:54 Ard Biesheuvel
2016-01-28 8:54 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151116115740.GD20696@leverpostej \
--to=mark.rutland@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.