2 * linux/arch/arm/kernel/head-armo.S
4 * Copyright (C) 1994-2000 Russell King
5 * Copyright (C) 2003 Ian Molton
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * 26-bit kernel startup code
13 #include <linux/config.h>
14 #include <linux/linkage.h>
15 #include <asm/mach-types.h>
18 .equ swapper_pg_dir, 0x0207d000
23 .section ".init.text",#alloc,#execinstr
25 __entry: cmp pc, #0x02000000
26 ldrlt pc, LC0 @ if 0x01800000, call at 0x02080000
27 teq r0, #0 @ Check for old calling method
28 blne oldparams @ Move page if old
30 ldmib r0, {r2-r5, sp} @ Setup stack (and fetch other values)
32 mov r0, #0 @ Clear BSS
42 #ifdef CONFIG_XIP_KERNEL
43 ldr r3, ETEXT @ data section copy
57 .word __bss_start @ r2
59 .word processor_id @ r4
60 .word __machine_arch_type @ r5
61 .word init_thread_union+8192 @ sp
62 #ifdef CONFIG_XIP_KERNEL
65 EDATA: .word __bss_start
68 arm2_id: .long 0x41560200 @ ARM2 and 250 dont have a CPUID
69 arm250_id: .long 0x41560250 @ So we create some after probing for them
72 oldparams: mov r4, #0x02000000
73 add r3, r4, #0x00080000
74 add r4, r4, #0x0007c000
75 1: ldmia r0!, {r5 - r12}
82 * We need some way to automatically detect the difference between
83 * these two machines. Unfortunately, it is not possible to detect
84 * the presence of the SuperIO chip, because that will hang the old
85 * Archimedes machines solid.
87 /* DAG: Outdated, these have been combined !!!!!!! */
89 #if defined(CONFIG_ARCH_ARC)
90 mov r0, #MACH_TYPE_ARCHIMEDES
91 #elif defined(CONFIG_ARCH_A5K)
92 mov r0, #MACH_TYPE_A5K
98 mov r2, #0xea000000 @ Point undef instr to continuation
100 orr r0, r2, r0, lsr #2
104 swp r2, r2, [r1] @ check for swp (ARM2 cant)
106 mrc 15, 0, r3, c0, c0 @ check for CP#15 (ARM250 cant)
108 continue: mov r2, #0xeb000000 @ Make undef vector loop