aboutsummaryrefslogtreecommitdiff
path: root/init-m.S
blob: 9f5114d5e3f9b6a3cb36e04dbd9409380adcc3bd (plain)
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
.thumb
.syntax unified

.section .text.start
.global _boot_reset
.align 7
_boot_reset:
.word _main_stack_top
.word _start /* reset */
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck

.section .data
.global run_table
.align 7
run_table:
.word _main_stack_top
.word _vec_stuck /* reset */
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck
.word _vec_stuck


.section .text

.global _start
.thumb_func
_start:
  /* zero bss */
  mov r0, #0
  ldr r1, =__bss_start
  ldr r2, =__bss_end

_bss_loop:
  cmp r1, r2
  itt ne
  strbne r0, [r1], 1
  bne _bss_loop

  /* copy data */
  ldr r1, =__data_start
  ldr r2, =__data_end
  ldr r3, =__data_load

_data_loop:
  cmp r1, r2
  ittt ne
  ldrbne r0, [r3], 1
  strbne r0, [r1], 1
  bne _data_loop

  ldr r0, =run_table
  ldr r1, =0xe000e000
  str r0, [r1, #0xd08] /* VTOR */

  mov r0, _proc_stack_top
  msr PSP, r0

  blx board_setup
  blx main
  
  /* fall through to abort() */

.global abort
.thumb_func
abort:
  cpsid if

  ldr sp, =_main_stack_top

  ldr r0, =0x05fa0004 /* reset request */
  ldr r1, =0xe000e000
  str r0, [r1, #0xd0c] /* AIRCR */
  dsb

_stuck:
  b _stuck


.thumb_func
_vec_stuck:
  mov r0, #'S'
  ldr r1, =0x4000c000
  str r0, [r1]
  mrs r0, IPSR
  str r0, [r1]
  bl abort

.section .bss
.align 4

.global _main_stack_bot
_main_stack_bot:
.skip 0x400
.global _main_stack_top
_main_stack_top:

.global _proc_stack_bot
_proc_stack_bot:
.skip 0x400
.global _proc_stack_top
_proc_stack_top: