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

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
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@
 * published by the Free Software Foundation.
 */
#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
@@ -20,11 +22,6 @@
	.section .init.text,"ax"
	.global _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 */
	lddpc	r2, bss_start_addr
	lddpc   r3, end_addr
@@ -34,6 +31,25 @@ _start:
	cp      r2, r3
	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
	 * _after_ .bss has been initialized...
@@ -53,6 +69,10 @@ bss_start_addr:
	.long   __bss_start
end_addr:
	.long   _end
init_sr:
	.long	0x007f0000	/* Supervisor mode, everything masked */
stack_addr:
	.long	init_thread_union

no_tag_table:
	sub	r12, pc, (. - 2f)
+0 −20
Original line number Diff line number Diff line
@@ -10,33 +10,13 @@
#include <linux/linkage.h>

#include <asm/page.h>
#include <asm/thread_info.h>
#include <asm/sysreg.h>

	.section .init.text,"ax"
	.global 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 */
	lddpc   pc, kernel_start_addr

	.align  2
init_sr:
	.long   0x007f0000	/* Supervisor mode, everything masked */
stack_addr:
	.long   init_thread_union
kernel_start_addr:
	.long   start_kernel