summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/head-armo.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/head-armo.S')
-rw-r--r--arch/arm/kernel/head-armo.S87
1 files changed, 56 insertions, 31 deletions
diff --git a/arch/arm/kernel/head-armo.S b/arch/arm/kernel/head-armo.S
index df5b02ae8..f0360a3d9 100644
--- a/arch/arm/kernel/head-armo.S
+++ b/arch/arm/kernel/head-armo.S
@@ -1,11 +1,13 @@
/*
* linux/arch/arm/kernel/head-armo.S
*
- * Copyright (C) 1994, 1995, 1996, 1997 Russell King
+ * Copyright (C) 1994-2000 Russell King
*
* 26-bit kernel startup code
*/
+#include <linux/config.h>
#include <linux/linkage.h>
+#include <asm/mach-types.h>
.globl SYMBOL_NAME(swapper_pg_dir)
.equ SYMBOL_NAME(swapper_pg_dir), 0x0207d000
@@ -17,46 +19,69 @@
ENTRY(stext)
ENTRY(_stext)
__entry: cmp pc, #0x02000000
- ldrlt pc, LC1 @ if 0x01800000, call at 0x02080000
+ ldrlt pc, LC0 @ if 0x01800000, call at 0x02080000
teq r0, #0 @ Check for old calling method
- blne Loldparams @ Move page if old
- adr r5, LC0
- ldmia r5, {r5, r6, sl, sp} @ Setup stack
- mov r4, #0
-1: cmp r5, sl @ Clear BSS
- strcc r4, [r5], #4
+ blne oldparams @ Move page if old
+ adr r0, LC0
+ ldmib r0, {r2-r5, sp} @ Setup stack
+ mov r0, #0
+1: cmp r2, r3 @ Clear BSS
+ strcc r0, [r2], #4
bcc 1b
- mov r0, #0xea000000 @ Point undef instr to continuation
- adr r5, Lcontinue - 12
- orr r5, r0, r5, lsr #2
- str r5, [r4, #4]
- mov r2, r4
- ldr r5, Larm2_id
- swp r0, r0, [r2] @ check for swp (ARM2 can't)
- ldr r5, Larm250_id
- mrc 15, 0, r0, c0, c0 @ check for CP#15 (ARM250 can't)
- mov r5, r0 @ Use processor ID if we do have CP#15
-Lcontinue: str r5, [r6]
- mov r5, #0xeb000000 @ Point undef instr vector to itself
- sub r5, r5, #2
- str r5, [r4, #4]
+
+ bl detect_proc_type
+ str r0, [r4]
+ bl detect_arch_type
+ str r0, [r5]
+
mov fp, #0
b SYMBOL_NAME(start_kernel)
-LC1: .word SYMBOL_NAME(_stext)
-LC0: .word SYMBOL_NAME(__bss_start)
- .word SYMBOL_NAME(processor_id)
- .word SYMBOL_NAME(_end)
- .word SYMBOL_NAME(init_task_union)+8192
-Larm2_id: .long 0x41560200
-Larm250_id: .long 0x41560250
+LC0: .word SYMBOL_NAME(_stext)
+ .word SYMBOL_NAME(__bss_start) @ r2
+ .word SYMBOL_NAME(_end) @ r3
+ .word SYMBOL_NAME(processor_id) @ r4
+ .word SYMBOL_NAME(__machine_arch_type) @ r5
+ .word SYMBOL_NAME(init_task_union)+8192 @ sp
+arm2_id: .long 0x41560200
+arm250_id: .long 0x41560250
.align
-Loldparams: mov r4, #0x02000000
+oldparams: mov r4, #0x02000000
add r3, r4, #0x00080000
add r4, r4, #0x0007c000
1: ldmia r0!, {r5 - r12}
stmia r4!, {r5 - r12}
cmp r4, r3
blt 1b
- movs pc, lr
+ mov pc, lr
+
+/*
+ * We need some way to automatically detect the difference between
+ * these two machines. Unfortunately, it is not possible to detect
+ * the presence of the SuperIO chip, because that will hang the old
+ * Archimedes machines solid.
+ */
+/* DAG: Outdated, these have been combined !!!!!!! */
+detect_arch_type:
+#if defined(CONFIG_ARCH_ARC)
+ mov r0, #MACH_TYPE_ARCHIMEDES
+#elif defined(CONFIG_ARCH_A5K)
+ mov r0, #MACH_TYPE_A5K
+#endif
+ mov pc, lr
+
+detect_proc_type:
+ mov r2, #0xea000000 @ Point undef instr to continuation
+ adr r0, continue - 12
+ orr r0, r2, r0, lsr #2
+ mov r1, #0
+ str r0, [r1, #4]
+ ldr r0, arm2_id
+ swp r2, r2, [r1] @ check for swp (ARM2 can't)
+ ldr r0, arm250_id
+ mrc 15, 0, r0, c0, c0 @ check for CP#15 (ARM250 can't)
+continue: mov r2, #0xeb000000 @ Make undef vector loop
+ sub r2, r2, #2
+ str r2, [r1, #4]
+ mov pc, lr