avr32: setup crt for early panic()
Before the CRT was (fully) set up in kernel_entry (bss cleared before in _start, but also not before jump to panic() in no_tag_table case). This patch fixes this up to have a fully working CRT when branching to panic() in no_tag_table. Signed-off-by: Andreas Bießmann <andreas@biessmann.de> Acked-by: Hans-Christian Egtvedt <egtvedt@samfundet.no> Cc: Haavard Skinnemoen <hskinnemoen@gmail.com> Cc: stable@vger.kernel.org
This commit is contained in:
parent
b4789b8e6b
commit
7a2a74f4b8
@ -8,6 +8,8 @@
|
|||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
#include <asm/sysreg.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The kernel is loaded where we want it to be and all caches
|
* The kernel is loaded where we want it to be and all caches
|
||||||
@ -20,11 +22,6 @@
|
|||||||
.section .init.text,"ax"
|
.section .init.text,"ax"
|
||||||
.global _start
|
.global _start
|
||||||
_start:
|
_start:
|
||||||
/* Check if the boot loader actually provided a tag table */
|
|
||||||
lddpc r0, magic_number
|
|
||||||
cp.w r12, r0
|
|
||||||
brne no_tag_table
|
|
||||||
|
|
||||||
/* Initialize .bss */
|
/* Initialize .bss */
|
||||||
lddpc r2, bss_start_addr
|
lddpc r2, bss_start_addr
|
||||||
lddpc r3, end_addr
|
lddpc r3, end_addr
|
||||||
@ -34,6 +31,25 @@ _start:
|
|||||||
cp r2, r3
|
cp r2, r3
|
||||||
brlo 1b
|
brlo 1b
|
||||||
|
|
||||||
|
/* Initialize status register */
|
||||||
|
lddpc r0, init_sr
|
||||||
|
mtsr SYSREG_SR, r0
|
||||||
|
|
||||||
|
/* Set initial stack pointer */
|
||||||
|
lddpc sp, stack_addr
|
||||||
|
sub sp, -THREAD_SIZE
|
||||||
|
|
||||||
|
#ifdef CONFIG_FRAME_POINTER
|
||||||
|
/* Mark last stack frame */
|
||||||
|
mov lr, 0
|
||||||
|
mov r7, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check if the boot loader actually provided a tag table */
|
||||||
|
lddpc r0, magic_number
|
||||||
|
cp.w r12, r0
|
||||||
|
brne no_tag_table
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save the tag table address for later use. This must be done
|
* Save the tag table address for later use. This must be done
|
||||||
* _after_ .bss has been initialized...
|
* _after_ .bss has been initialized...
|
||||||
@ -53,6 +69,10 @@ bss_start_addr:
|
|||||||
.long __bss_start
|
.long __bss_start
|
||||||
end_addr:
|
end_addr:
|
||||||
.long _end
|
.long _end
|
||||||
|
init_sr:
|
||||||
|
.long 0x007f0000 /* Supervisor mode, everything masked */
|
||||||
|
stack_addr:
|
||||||
|
.long init_thread_union
|
||||||
|
|
||||||
no_tag_table:
|
no_tag_table:
|
||||||
sub r12, pc, (. - 2f)
|
sub r12, pc, (. - 2f)
|
||||||
|
@ -10,33 +10,13 @@
|
|||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/thread_info.h>
|
|
||||||
#include <asm/sysreg.h>
|
|
||||||
|
|
||||||
.section .init.text,"ax"
|
.section .init.text,"ax"
|
||||||
.global kernel_entry
|
.global kernel_entry
|
||||||
kernel_entry:
|
kernel_entry:
|
||||||
/* Initialize status register */
|
|
||||||
lddpc r0, init_sr
|
|
||||||
mtsr SYSREG_SR, r0
|
|
||||||
|
|
||||||
/* Set initial stack pointer */
|
|
||||||
lddpc sp, stack_addr
|
|
||||||
sub sp, -THREAD_SIZE
|
|
||||||
|
|
||||||
#ifdef CONFIG_FRAME_POINTER
|
|
||||||
/* Mark last stack frame */
|
|
||||||
mov lr, 0
|
|
||||||
mov r7, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Start the show */
|
/* Start the show */
|
||||||
lddpc pc, kernel_start_addr
|
lddpc pc, kernel_start_addr
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
init_sr:
|
|
||||||
.long 0x007f0000 /* Supervisor mode, everything masked */
|
|
||||||
stack_addr:
|
|
||||||
.long init_thread_union
|
|
||||||
kernel_start_addr:
|
kernel_start_addr:
|
||||||
.long start_kernel
|
.long start_kernel
|
||||||
|
Loading…
Reference in New Issue
Block a user