Linux-2.6.12-rc2
[safe/jmp/linux-2.6] / arch / arm26 / kernel / head.S
1 /*
2  *  linux/arch/arm26/kernel/head.S
3  *
4  *  Copyright (C) 1994-2000 Russell King
5  *  Copyright (C) 2003 Ian Molton
6  *
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.
10  *
11  *  26-bit kernel startup code
12  */
13 #include <linux/config.h>
14 #include <linux/linkage.h>
15 #include <asm/mach-types.h>
16
17                 .globl  swapper_pg_dir
18                 .equ    swapper_pg_dir, 0x0207d000
19
20 /*
21  * Entry point.
22  */
23                 .section ".init.text",#alloc,#execinstr
24 ENTRY(stext)
25
26 __entry:
27                 cmp     pc, #0x02000000
28                 ldrlt   pc, LC0                 @ if 0x01800000, call at 0x02080000
29                 teq     r0, #0                  @ Check for old calling method
30                 blne    oldparams               @ Move page if old
31
32                 adr     r0, LC0
33                 ldmib   r0, {r2-r5, sp}         @ Setup stack (and fetch other values)
34
35                 mov     r0, #0                  @ Clear BSS
36 1:              cmp     r2, r3
37                 strcc   r0, [r2], #4
38                 bcc     1b
39
40                 bl      detect_proc_type
41                 str     r0, [r4]
42                 bl      detect_arch_type
43                 str     r0, [r5]
44
45 #ifdef CONFIG_XIP_KERNEL
46                ldr     r3, ETEXT                       @ data section copy
47                ldr     r4, SDATA
48                ldr     r5, EDATA
49 1:
50                ldr     r6, [r3], #4
51                str     r6, [r4], #4
52                cmp     r4, r5
53                blt     1b
54 #endif
55                 mov     fp, #0
56                 b       start_kernel
57
58 LC0:            .word   _stext
59                 .word   __bss_start             @ r2
60                 .word   _end                    @ r3
61                 .word   processor_id            @ r4
62                 .word   __machine_arch_type     @ r5
63                 .word   init_thread_union+8192  @ sp
64 #ifdef CONFIG_XIP_KERNEL
65 ETEXT:          .word   _endtext
66 SDATA:          .word   _sdata
67 EDATA:          .word   __bss_start
68 #endif
69
70 arm2_id:        .long   0x41560200  @ ARM2 and 250 dont have a CPUID
71 arm250_id:      .long   0x41560250  @ So we create some after probing for them
72                 .align
73
74 oldparams:      mov     r4, #0x02000000
75                 add     r3, r4, #0x00080000
76                 add     r4, r4, #0x0007c000
77 1:              ldmia   r0!, {r5 - r12}
78                 stmia   r4!, {r5 - r12}
79                 cmp     r4, r3
80                 blt     1b
81                 mov     pc, lr
82
83 /*
84  * We need some way to automatically detect the difference between
85  * these two machines.  Unfortunately, it is not possible to detect
86  * the presence of the SuperIO chip, because that will hang the old
87  * Archimedes machines solid.
88  */
89 /* DAG: Outdated, these have been combined !!!!!!! */
90 detect_arch_type:
91 #if defined(CONFIG_ARCH_ARC)
92                 mov     r0, #MACH_TYPE_ARCHIMEDES
93 #elif defined(CONFIG_ARCH_A5K)
94                 mov     r0, #MACH_TYPE_A5K
95 #endif
96                 mov     pc, lr
97
98 detect_proc_type:
99                 mov     ip, lr
100                 mov     r2, #0xea000000         @ Point undef instr to continuation
101                 adr     r0, continue - 12
102                 orr     r0, r2, r0, lsr #2
103                 mov     r1, #0
104                 str     r0, [r1, #4]
105                 ldr     r0, arm2_id
106                 swp     r2, r2, [r1]            @ check for swp (ARM2 cant)
107                 ldr     r0, arm250_id
108                 mrc     15, 0, r3, c0, c0       @ check for CP#15 (ARM250 cant)
109                 mov     r0, r3
110 continue:       mov     r2, #0xeb000000         @ Make undef vector loop
111                 sub     r2, r2, #2
112                 str     r2, [r1, #4]
113                 mov     pc, ip