ARM: 7657/1: head: fix swapper and idmap population with LPAE and big-endian
The LPAE page table format uses 64-bit descriptors, so we need to take endianness into account when populating the swapper and idmap tables during early initialisation. This patch ensures that we store the two words making up each page table entry in the correct order when running big-endian. Cc: <stable@vger.kernel.org> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Tested-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Родитель
904464b91e
Коммит
d61947a164
|
@ -184,13 +184,22 @@ __create_page_tables:
|
||||||
orr r3, r3, #3 @ PGD block type
|
orr r3, r3, #3 @ PGD block type
|
||||||
mov r6, #4 @ PTRS_PER_PGD
|
mov r6, #4 @ PTRS_PER_PGD
|
||||||
mov r7, #1 << (55 - 32) @ L_PGD_SWAPPER
|
mov r7, #1 << (55 - 32) @ L_PGD_SWAPPER
|
||||||
1: str r3, [r0], #4 @ set bottom PGD entry bits
|
1:
|
||||||
|
#ifdef CONFIG_CPU_ENDIAN_BE8
|
||||||
str r7, [r0], #4 @ set top PGD entry bits
|
str r7, [r0], #4 @ set top PGD entry bits
|
||||||
|
str r3, [r0], #4 @ set bottom PGD entry bits
|
||||||
|
#else
|
||||||
|
str r3, [r0], #4 @ set bottom PGD entry bits
|
||||||
|
str r7, [r0], #4 @ set top PGD entry bits
|
||||||
|
#endif
|
||||||
add r3, r3, #0x1000 @ next PMD table
|
add r3, r3, #0x1000 @ next PMD table
|
||||||
subs r6, r6, #1
|
subs r6, r6, #1
|
||||||
bne 1b
|
bne 1b
|
||||||
|
|
||||||
add r4, r4, #0x1000 @ point to the PMD tables
|
add r4, r4, #0x1000 @ point to the PMD tables
|
||||||
|
#ifdef CONFIG_CPU_ENDIAN_BE8
|
||||||
|
add r4, r4, #4 @ we only write the bottom word
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags
|
ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags
|
||||||
|
@ -258,6 +267,11 @@ __create_page_tables:
|
||||||
addne r6, r6, #1 << SECTION_SHIFT
|
addne r6, r6, #1 << SECTION_SHIFT
|
||||||
strne r6, [r3]
|
strne r6, [r3]
|
||||||
|
|
||||||
|
#if defined(CONFIG_LPAE) && defined(CONFIG_CPU_ENDIAN_BE8)
|
||||||
|
sub r4, r4, #4 @ Fixup page table pointer
|
||||||
|
@ for 64-bit descriptors
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_LL
|
#ifdef CONFIG_DEBUG_LL
|
||||||
#if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING)
|
#if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING)
|
||||||
/*
|
/*
|
||||||
|
@ -276,12 +290,16 @@ __create_page_tables:
|
||||||
orr r3, r7, r3, lsl #SECTION_SHIFT
|
orr r3, r7, r3, lsl #SECTION_SHIFT
|
||||||
#ifdef CONFIG_ARM_LPAE
|
#ifdef CONFIG_ARM_LPAE
|
||||||
mov r7, #1 << (54 - 32) @ XN
|
mov r7, #1 << (54 - 32) @ XN
|
||||||
|
#ifdef CONFIG_CPU_ENDIAN_BE8
|
||||||
|
str r7, [r0], #4
|
||||||
|
str r3, [r0], #4
|
||||||
|
#else
|
||||||
|
str r3, [r0], #4
|
||||||
|
str r7, [r0], #4
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
orr r3, r3, #PMD_SECT_XN
|
orr r3, r3, #PMD_SECT_XN
|
||||||
#endif
|
|
||||||
str r3, [r0], #4
|
str r3, [r0], #4
|
||||||
#ifdef CONFIG_ARM_LPAE
|
|
||||||
str r7, [r0], #4
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else /* CONFIG_DEBUG_ICEDCC || CONFIG_DEBUG_SEMIHOSTING */
|
#else /* CONFIG_DEBUG_ICEDCC || CONFIG_DEBUG_SEMIHOSTING */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче