summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/shared/start/start.S
blob: 26e5c7274773dbfa9a87564ec707b0ff33af8b96 (plain) (blame)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/**
 * @file
 *
 * @brief Boot and system start code.
 */

/*
 * Copyright (c) 2008
 * Embedded Brains GmbH
 * Obere Lagerstr. 30
 * D-82178 Puchheim
 * Germany
 * rtems@embedded-brains.de
 *
 * The license and distribution terms for this file may be found in the file
 * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
 */

#include <bsp/linker-symbols.h>
#include <bsp/start.h>

/* External symbols */

.extern bsp_reset
.extern boot_card

/* Global symbols */

.globl start
.globl SWI_Handler

/* Program Status Register definitions */

.equ PSR_MODE_USR,   0x10
.equ PSR_MODE_FIQ,   0x11
.equ PSR_MODE_IRQ,   0x12
.equ PSR_MODE_SVC,   0x13
.equ PSR_MODE_ABT,   0x17
.equ PSR_MODE_UNDEF, 0x1b
.equ PSR_MODE_SYS,   0x1f
.equ PSR_I,          0x80
.equ PSR_F,          0x40
.equ PSR_T,          0x20

.section ".entry"

/*
 * This is the exception vector table and the pointers to the default
 * exceptions handlers.
 */

vector_block:

	ldr	pc, handler_addr_reset
	ldr	pc, handler_addr_undef
	ldr	pc, handler_addr_swi
	ldr	pc, handler_addr_prefetch
	ldr	pc, handler_addr_abort

	/* Program signature checked by boot loader */
	.word	0xb8a06f58

	ldr	pc, handler_addr_irq
	ldr	pc, handler_addr_fiq

handler_addr_reset:

	.word	start

handler_addr_undef:

	.word	twiddle

handler_addr_swi:

	.word	twiddle

handler_addr_prefetch:

	.word	twiddle

handler_addr_abort:

	.word	twiddle

handler_addr_reserved:

	.word	twiddle

handler_addr_irq:

	.word	twiddle

handler_addr_fiq:

	.word	twiddle

/* Start entry */

start:

        /*
         * We do not save the context since we do not return to the boot
         * loader.
         */

        /*
         * Set SVC mode, disable interrupts and enable ARM instructions.
         */
	mov	r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
	msr	cpsr, r0

        /* Initialize stack pointer registers for the various modes */

        /* Enter IRQ mode and set up the IRQ stack pointer */
	mov	r0, #(PSR_MODE_IRQ | PSR_I | PSR_F)
	msr	cpsr, r0
	ldr	r1, =bsp_stack_irq_size
	ldr	sp, =bsp_stack_irq_start
	add	sp, sp, r1

        /* Enter FIQ mode and set up the FIQ stack pointer */
	mov	r0, #(PSR_MODE_FIQ | PSR_I | PSR_F)
	msr	cpsr, r0
	ldr	r1, =bsp_stack_fiq_size
	ldr	sp, =bsp_stack_fiq_start
	add	sp, sp, r1

        /* Enter ABT mode and set up the ABT stack pointer */
	mov	r0, #(PSR_MODE_ABT | PSR_I | PSR_F)
	msr	cpsr, r0
	ldr	r1, =bsp_stack_abt_size
	ldr	sp, =bsp_stack_abt_start
	add	sp, sp, r1

        /* Enter UNDEF mode and set up the UNDEF stack pointer */
	mov	r0, #(PSR_MODE_UNDEF | PSR_I | PSR_F)
	msr	cpsr, r0
	ldr	r1, =bsp_stack_undef_size
	ldr	sp, =bsp_stack_undef_start
	add	sp, sp, r1

        /* Enter SVC mode and set up the SVC stack pointer */
	mov	r0, #(PSR_MODE_SVC | PSR_I | PSR_F)
	msr	cpsr, r0
	ldr	r1, =bsp_stack_svc_size
	ldr	sp, =bsp_stack_svc_start
	add	sp, sp, r1

        /* Stay in SVC mode */

        /* Brach to start hook 0 */
	bl	bsp_start_hook_0

        /*
	 * Initialize the exception vectors.  This includes the exceptions
	 * vectors and the pointers to the default exception handlers.
         */

	ldr	r0, =bsp_section_vector_start
	adr	r1, vector_block
	ldmia	r1!, {r2-r9}
	stmia	r0!, {r2-r9}
	ldmia	r1!, {r2-r9}
	stmia	r0!, {r2-r9}

        /* Brach to start hook 1 */
	bl	bsp_start_hook_1


        /* Brach to boot card */
	bl	boot_card

        /* Branch to reset function */
	bl	bsp_reset

        /* Spin forever */

SWI_Handler:

twiddle:

	b	twiddle