1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/*
* boot.S - simple register setup code for stand-alone Linux booting
*
* Copyright (C) 2009 ARM Limited
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
.text
.globl _start
_start:
@
@ CPU initialisation
@
mrc p15, 0, r0, c0, c0, 5 @ MPIDR (ARMv7 only)
and r0, r0, #15 @ CPU number
cmp r0, #0 @ primary CPU?
beq 2f
@
@ Secondary CPUs (following the RealView SMP booting protocol)
@
ldr r1, =filesystem - 0x100
adr r2, 1f
ldmia r2, {r3 - r6} @ move the code to a location
stmia r1, {r3 - r6} @ less likely to be overridden
ldr r0, =0x10000030 @ RealView SYS_FLAGS register
mov pc, r1 @ branch to the relocated code
1: ldr r1, [r0]
cmp r1, #0
beq 1b
mov pc, r1 @ branch to the given address
@
@ UART initialisation (38400 8N1)
@
2: ldr r0, =0x10009000 @ UART base (RealView/EB)
mov r1, #0x10 @ ibrd
str r1, [r0, #0x24]
mov r1, #0xc300
orr r1, #0x0001 @ cr
str r1, [r0, #0x30]
@
@ Kernel parameters
@
mov r0, #0
ldr r1, =827 @ RealView/EB
adr r2, atags
mov r3, #0
ldr lr, =kernel
#ifdef THUMB2_KERNEL
orr lr, lr, #1 @ Thumb-2 kernel
#endif
mov pc, lr @ jump to the kernel
.org 0x100
atags:
@ ATAG_CORE
.long 2
.long 0x54410001
@ ATAG_CMDLINE
.long (1f - .) >> 2
.long 0x54410009
#ifdef USE_INITRD
.asciz "console=ttyAMA0 mem=256M earlyprintk"
#else
.asciz "root=/dev/nfs nfsroot=10.1.68.81:/work2/debootstrap/arm ip=dhcp console=ttyAMA0 mem=256M earlyprintk"
#endif
.align 2
1:
#ifdef USE_INITRD
@ ATAG_INITRD2
.long 4
.long 0x54420005
.long filesystem
.long fs_size
#endif
@ ATAG_NONE
.long 0
.long 0x00000000
|