diff options
Diffstat (limited to 'arch/arm/kernel/head.S')
| -rw-r--r-- | arch/arm/kernel/head.S | 26 | 
1 files changed, 22 insertions, 4 deletions
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 486a15ae901..e0eb9a1cae7 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -184,13 +184,22 @@ __create_page_tables:  	orr	r3, r3, #3			@ PGD block type  	mov	r6, #4				@ PTRS_PER_PGD  	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	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  	subs	r6, r6, #1  	bne	1b  	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  	ldr	r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags @@ -258,6 +267,11 @@ __create_page_tables:  	addne	r6, r6, #1 << SECTION_SHIFT  	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  #if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING)  	/* @@ -276,13 +290,17 @@ __create_page_tables:  	orr	r3, r7, r3, lsl #SECTION_SHIFT  #ifdef CONFIG_ARM_LPAE  	mov	r7, #1 << (54 - 32)		@ XN +#ifdef CONFIG_CPU_ENDIAN_BE8 +	str	r7, [r0], #4 +	str	r3, [r0], #4  #else -	orr	r3, r3, #PMD_SECT_XN -#endif  	str	r3, [r0], #4 -#ifdef CONFIG_ARM_LPAE  	str	r7, [r0], #4  #endif +#else +	orr	r3, r3, #PMD_SECT_XN +	str	r3, [r0], #4 +#endif  #else /* CONFIG_DEBUG_ICEDCC || CONFIG_DEBUG_SEMIHOSTING */  	/* we don't need any serial debugging mappings */  |