summaryrefslogtreecommitdiffstats
path: root/bsps/lm32/shared/start/start.S
blob: 71cbb54119093eb373edf5f01921ddd8392baa84 (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
/*  LM32 startup code
 *
 *  This is the entry point on reset and when loading the
 *  executive from a bootloader.
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.org/license/LICENSE.
 *
 *  Jukka Pietarinen <jukka.pietarinen@mrf.fi>, 2008,
 *  Micro-Research Finland Oy
 */

#include "bspopts.h"

     .section .boot,"a",@progbits
     .align    4

     .globl  start
     .type   start,@function
     .globl  _start
     .type   _start,@function
     .globl  __start
     .type   __start,@function
     .globl  LatticeDDInit
     .type   LatticeDDInit,@function
     .globl  crt0
     .type   crt0,@function

LatticeDDInit:
__start:
_start:
start:
	/* Clear r0 */
	xor	r0,r0,r0
	/* Disable interrupts */
	wcsr	IE, r0
	/* Mask all interrupts */
	wcsr	IM,r0
	/* Set exception base address */
	mvhi	r1, hi(start)
	ori	r1, r1, lo(start)
	wcsr	EBA, r1
	bi	crt0
	nop
/*
 * Unused handlers call debug handlers
 */
breakpoint_handler:
	rcsr	r7, DEBA
	addi	r7, r7, 32
	b	r7
	nop
	nop
	nop
	nop
	nop
instruction_bus_error_handler:
	rcsr	r7, DEBA
	addi	r7, r7, 64
	b	r7
	nop
	nop
	nop
	nop
	nop
watchpoint_handler:
	rcsr	r7, DEBA
	addi	r7, r7, 96
	b	r7
	nop
	nop
	nop
	nop
	nop
data_bus_error_handler:
	rcsr	r7, DEBA
	addi	r7, r7, 128
	b	r7
	nop
	nop
	nop
	nop
	nop
divide_by_zero_handler:
	rcsr	r7, DEBA
	addi	r7, r7, 160
	b	r7
	nop
	nop
	nop
	nop
	nop
interrupt_handler:
	.extern _ISR_Handler
	mvhi	r0, hi(_ISR_Handler)
	ori	r0, r0, lo(_ISR_Handler)
	b	r0
	nop
	nop
	nop
	nop
	nop
system_call_handler:
	rcsr	r7, DEBA
	addi	r7, r7, 224
	b	r7
	nop
	nop
	nop
	nop
	nop

crt0:
	/* Flush data cache */
	addi	r1, r0, 1
	wcsr	DCC, r1
	nop
	nop
	nop
	nop
	/* Flush Instruction Cache */
	wcsr	ICC, r1
	nop
	nop
	nop
	nop
	/* Initialize stack pointer */
	mvhi	sp, hi(_fstack-4)
	ori	sp, sp, lo(_fstack-4)
	/* Initialize global pointer */
	mvhi	gp, hi(_edata)
	ori	gp, gp, lo(_edata)
	/* Clear bss */
	mvhi	r1, hi(_clear_start)
	ori	r1, r1, lo(_clear_start)
	mvhi	r3, hi(_clear_end)
	ori	r3, r3, lo(_clear_end)
.clear_bss:
	be	r1, r3, .end_clear_bss
	sw	(r1+0), r0
	addi	r1, r1, 4
	bi	.clear_bss
.end_clear_bss:
	mvi	r1, 0
	be	r4, r0, .no_rescue
	mvhi	r1, hi(.rescue_str)
	ori	r1, r1, lo(.rescue_str)
.no_rescue:
	mvhi	r7, hi(boot_card)
	ori	r7, r7, lo(boot_card)
	call	r7
	# boot_card returns when RTEMS is shutdown
.dead_end:
	bi	.dead_end

.section .rodata
.rescue_str:
	.ascii "rescue"