| From 6f16f4998f98e42e3f2dedf663cfb691ff0324af Mon Sep 17 00:00:00 2001 |
| From: Nicolas Pitre <nicolas.pitre@linaro.org> |
| Date: Tue, 15 Jan 2013 18:51:32 +0100 |
| Subject: ARM: 7628/1: head.S: map one extra section for the ATAG/DTB area |
| |
| From: Nicolas Pitre <nicolas.pitre@linaro.org> |
| |
| commit 6f16f4998f98e42e3f2dedf663cfb691ff0324af upstream. |
| |
| We currently use a temporary 1MB section aligned to a 1MB boundary for |
| mapping the provided device tree until the final page table is created. |
| However, if the device tree happens to cross that 1MB boundary, the end |
| of it remains unmapped and the kernel crashes when it attempts to access |
| it. Given no restriction on the location of that DTB, it could end up |
| with only a few bytes mapped at the end of a section. |
| |
| Solve this issue by mapping two consecutive sections. |
| |
| Signed-off-by: Nicolas Pitre <nico@linaro.org> |
| Tested-by: Sascha Hauer <s.hauer@pengutronix.de> |
| Tested-by: Tomasz Figa <t.figa@samsung.com> |
| Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/arm/kernel/head.S | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/arch/arm/kernel/head.S |
| +++ b/arch/arm/kernel/head.S |
| @@ -246,6 +246,7 @@ __create_page_tables: |
| |
| /* |
| * Then map boot params address in r2 if specified. |
| + * We map 2 sections in case the ATAGs/DTB crosses a section boundary. |
| */ |
| mov r0, r2, lsr #SECTION_SHIFT |
| movs r0, r0, lsl #SECTION_SHIFT |
| @@ -253,6 +254,8 @@ __create_page_tables: |
| addne r3, r3, #PAGE_OFFSET |
| addne r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER) |
| orrne r6, r7, r0 |
| + strne r6, [r3], #1 << PMD_ORDER |
| + addne r6, r6, #1 << SECTION_SHIFT |
| strne r6, [r3] |
| |
| #ifdef CONFIG_DEBUG_LL |