|
@@ -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,8 +69,15 @@ bss_start_addr:
|
|
|
.long __bss_start
|
|
|
end_addr:
|
|
|
.long _end
|
|
|
+init_sr:
|
|
|
+ .long 0x007f0000 /* Supervisor mode, everything masked */
|
|
|
+stack_addr:
|
|
|
+ .long init_thread_union
|
|
|
+panic_addr:
|
|
|
+ .long panic
|
|
|
|
|
|
no_tag_table:
|
|
|
sub r12, pc, (. - 2f)
|
|
|
- bral panic
|
|
|
+ /* branch to panic() which can be far away with that construct */
|
|
|
+ lddpc pc, panic_addr
|
|
|
2: .asciz "Boot loader didn't provide correct magic number\n"
|