Commit 7a2a74f4 authored by Andreas Bießmann's avatar Andreas Bießmann Committed by Hans-Christian Egtvedt

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: default avatarAndreas Bießmann <andreas@biessmann.de>
Acked-by: default avatarHans-Christian Egtvedt <egtvedt@samfundet.no>
Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
Cc: stable@vger.kernel.org
parent b4789b8e
...@@ -8,6 +8,8 @@ ...@@ -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 @@ ...@@ -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: ...@@ -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: ...@@ -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 @@ ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment