~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/arch/m68k/cpu/mcf547x_8x/start.S

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2003   Josef Baumgartner <josef.baumgartner@telex.de>
 
3
 * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
 
4
 *
 
5
 * SPDX-License-Identifier:     GPL-2.0+
 
6
 */
 
7
 
 
8
#include <asm-offsets.h>
 
9
#include <config.h>
 
10
#include "version.h"
 
11
#include <asm/cache.h>
 
12
 
 
13
#ifndef  CONFIG_IDENT_STRING
 
14
#define  CONFIG_IDENT_STRING ""
 
15
#endif
 
16
 
 
17
#define _START  _start
 
18
#define _FAULT  _fault
 
19
 
 
20
#define SAVE_ALL                                                \
 
21
        move.w  #0x2700,%sr;            /* disable intrs */     \
 
22
        subl    #60,%sp;                /* space for 15 regs */ \
 
23
        moveml  %d0-%d7/%a0-%a6,%sp@;
 
24
 
 
25
#define RESTORE_ALL                                             \
 
26
        moveml  %sp@,%d0-%d7/%a0-%a6;                           \
 
27
        addl    #60,%sp;                /* space for 15 regs */ \
 
28
        rte;
 
29
 
 
30
.text
 
31
/*
 
32
 *      Vector table. This is used for initial platform startup.
 
33
 *      These vectors are to catch any un-intended traps.
 
34
 */
 
35
_vectors:
 
36
 
 
37
INITSP:         .long   0x00000000      /* Initial SP   */
 
38
INITPC:         .long   _START  /* Initial PC           */
 
39
vector02:       .long   _FAULT  /* Access Error         */
 
40
vector03:       .long   _FAULT  /* Address Error        */
 
41
vector04:       .long   _FAULT  /* Illegal Instruction  */
 
42
vector05:       .long   _FAULT  /* Reserved             */
 
43
vector06:       .long   _FAULT  /* Reserved             */
 
44
vector07:       .long   _FAULT  /* Reserved             */
 
45
vector08:       .long   _FAULT  /* Privilege Violation  */
 
46
vector09:       .long   _FAULT  /* Trace                */
 
47
vector0A:       .long   _FAULT  /* Unimplemented A-Line */
 
48
vector0B:       .long   _FAULT  /* Unimplemented F-Line */
 
49
vector0C:       .long   _FAULT  /* Debug Interrupt      */
 
50
vector0D:       .long   _FAULT  /* Reserved             */
 
51
vector0E:       .long   _FAULT  /* Format Error         */
 
52
vector0F:       .long   _FAULT  /* Unitialized Int.     */
 
53
 
 
54
/* Reserved */
 
55
vector10_17:
 
56
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
57
 
 
58
vector18:       .long   _FAULT  /* Spurious Interrupt   */
 
59
vector19:       .long   _FAULT  /* Autovector Level 1   */
 
60
vector1A:       .long   _FAULT  /* Autovector Level 2   */
 
61
vector1B:       .long   _FAULT  /* Autovector Level 3   */
 
62
vector1C:       .long   _FAULT  /* Autovector Level 4   */
 
63
vector1D:       .long   _FAULT  /* Autovector Level 5   */
 
64
vector1E:       .long   _FAULT  /* Autovector Level 6   */
 
65
vector1F:       .long   _FAULT  /* Autovector Level 7   */
 
66
 
 
67
/* TRAP #0 - #15 */
 
68
vector20_2F:
 
69
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
70
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
71
 
 
72
/* Reserved     */
 
73
vector30_3F:
 
74
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
75
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
76
 
 
77
vector64_127:
 
78
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
79
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
80
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
81
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
82
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
83
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
84
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
85
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
86
 
 
87
vector128_191:
 
88
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
89
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
90
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
91
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
92
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
93
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
94
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
95
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
96
 
 
97
vector192_255:
 
98
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
99
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
100
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
101
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
102
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
103
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
104
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
105
.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
 
106
 
 
107
        .text
 
108
 
 
109
        .globl  _start
 
110
_start:
 
111
        nop
 
112
        nop
 
113
        move.w #0x2700,%sr              /* Mask off Interrupt */
 
114
 
 
115
        /* Set vector base register at the beginning of the Flash */
 
116
        move.l  #CONFIG_SYS_FLASH_BASE, %d0
 
117
        movec   %d0, %VBR
 
118
 
 
119
        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
 
120
        movec   %d0, %RAMBAR0
 
121
 
 
122
        move.l  #(CONFIG_SYS_INIT_RAM1_ADDR + CONFIG_SYS_INIT_RAM1_CTRL), %d0
 
123
        movec   %d0, %RAMBAR1
 
124
 
 
125
        move.l  #CONFIG_SYS_MBAR, %d0           /* set MBAR address */
 
126
        move.c  %d0, %MBAR
 
127
 
 
128
        /* invalidate and disable cache */
 
129
        move.l  #0x01040100, %d0        /* Invalidate cache cmd */
 
130
        movec   %d0, %CACR              /* Invalidate cache */
 
131
        move.l  #0, %d0
 
132
        movec   %d0, %ACR0
 
133
        movec   %d0, %ACR1
 
134
        movec   %d0, %ACR2
 
135
        movec   %d0, %ACR3
 
136
 
 
137
        /* initialize general use internal ram */
 
138
        move.l #0, %d0
 
139
        move.l #(ICACHE_STATUS), %a1    /* icache */
 
140
        move.l #(DCACHE_STATUS), %a2    /* icache */
 
141
        move.l %d0, (%a1)
 
142
        move.l %d0, (%a2)
 
143
 
 
144
        /* set stackpointer to end of internal ram to get some stackspace for the
 
145
           first c-code */
 
146
        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
 
147
        clr.l %sp@-
 
148
 
 
149
        move.l #__got_start, %a5        /* put relocation table address to a5 */
 
150
 
 
151
        jbsr cpu_init_f                 /* run low-level CPU init code (from flash) */
 
152
        jbsr board_init_f               /* run low-level board init code (from flash) */
 
153
 
 
154
        /* board_init_f() does not return */
 
155
 
 
156
/*------------------------------------------------------------------------------*/
 
157
 
 
158
/*
 
159
 * void relocate_code (addr_sp, gd, addr_moni)
 
160
 *
 
161
 * This "function" does not return, instead it continues in RAM
 
162
 * after relocating the monitor code.
 
163
 *
 
164
 * r3 = dest
 
165
 * r4 = src
 
166
 * r5 = length in bytes
 
167
 * r6 = cachelinesize
 
168
 */
 
169
        .globl  relocate_code
 
170
relocate_code:
 
171
        link.w %a6,#0
 
172
        move.l 8(%a6), %sp              /* set new stack pointer */
 
173
 
 
174
        move.l 12(%a6), %d0             /* Save copy of Global Data pointer */
 
175
        move.l 16(%a6), %a0             /* Save copy of Destination Address */
 
176
 
 
177
        move.l #CONFIG_SYS_MONITOR_BASE, %a1
 
178
        move.l #__init_end, %a2
 
179
        move.l %a0, %a3
 
180
 
 
181
        /* copy the code to RAM */
 
182
1:
 
183
        move.l (%a1)+, (%a3)+
 
184
        cmp.l  %a1,%a2
 
185
        bgt.s    1b
 
186
 
 
187
/*
 
188
 * We are done. Do not return, instead branch to second part of board
 
189
 * initialization, now running from RAM.
 
190
 */
 
191
        move.l  %a0, %a1
 
192
        add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
 
193
        jmp     (%a1)
 
194
 
 
195
in_ram:
 
196
 
 
197
clear_bss:
 
198
        /*
 
199
         * Now clear BSS segment
 
200
         */
 
201
        move.l  %a0, %a1
 
202
        add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
 
203
        move.l  %a0, %d1
 
204
        add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
 
205
6:
 
206
        clr.l   (%a1)+
 
207
        cmp.l   %a1,%d1
 
208
        bgt.s   6b
 
209
 
 
210
        /*
 
211
         * fix got table in RAM
 
212
         */
 
213
        move.l  %a0, %a1
 
214
        add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
 
215
        move.l  %a1,%a5         /* * fix got pointer register a5 */
 
216
 
 
217
        move.l  %a0, %a2
 
218
        add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
 
219
 
 
220
7:
 
221
        move.l  (%a1),%d1
 
222
        sub.l   #_start,%d1
 
223
        add.l   %a0,%d1
 
224
        move.l  %d1,(%a1)+
 
225
        cmp.l   %a2, %a1
 
226
        bne     7b
 
227
 
 
228
        /* calculate relative jump to board_init_r in ram */
 
229
        move.l %a0, %a1
 
230
        add.l #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
 
231
 
 
232
        /* set parameters for board_init_r */
 
233
        move.l %a0,-(%sp)               /* dest_addr */
 
234
        move.l %d0,-(%sp)               /* gd */
 
235
        jsr     (%a1)
 
236
 
 
237
/*------------------------------------------------------------------------------*/
 
238
/* exception code */
 
239
        .globl _fault
 
240
_fault:
 
241
        bra _fault
 
242
        .globl  _exc_handler
 
243
 
 
244
_exc_handler:
 
245
        SAVE_ALL
 
246
        movel   %sp,%sp@-
 
247
        bsr exc_handler
 
248
        addql   #4,%sp
 
249
        RESTORE_ALL
 
250
 
 
251
        .globl  _int_handler
 
252
_int_handler:
 
253
        SAVE_ALL
 
254
        movel   %sp,%sp@-
 
255
        bsr int_handler
 
256
        addql   #4,%sp
 
257
        RESTORE_ALL
 
258
 
 
259
/*------------------------------------------------------------------------------*/
 
260
 
 
261
        .globl  version_string
 
262
version_string:
 
263
        .ascii U_BOOT_VERSION_STRING, "\0"
 
264
        .align 4