SPDX: Convert all of our single license tags to Linux Kernel style
[platform/kernel/u-boot.git] / arch / m68k / cpu / mcf5445x / start.S
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (C) 2003   Josef Baumgartner <josef.baumgartner@telex.de>
4  * Based on code from Bernhard Kuhn <bkuhn@metrowerks.com>
5  *
6  * Copyright 2010-2012 Freescale Semiconductor, Inc.
7  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
8  */
9
10 #include <common.h>
11 #include <asm-offsets.h>
12 #include <config.h>
13 #include <timestamp.h>
14 #include "version.h"
15 #include <asm/cache.h>
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 #if defined(CONFIG_SERIAL_BOOT)
31 #define ASM_DRAMINIT    (asm_dram_init - CONFIG_SYS_TEXT_BASE + \
32         CONFIG_SYS_INIT_RAM_ADDR)
33 #define ASM_DRAMINIT_N  (asm_dram_init - CONFIG_SYS_TEXT_BASE)
34 #define ASM_SBF_IMG_HDR (asm_sbf_img_hdr - CONFIG_SYS_TEXT_BASE + \
35         CONFIG_SYS_INIT_RAM_ADDR)
36 #endif
37
38 .text
39
40 /*
41  * Vector table. This is used for initial platform startup.
42  * These vectors are to catch any un-intended traps.
43  */
44 _vectors:
45 #if defined(CONFIG_SERIAL_BOOT)
46
47 INITSP: .long   0                       /* Initial SP   */
48 #ifdef CONFIG_CF_SBF
49 INITPC: .long   ASM_DRAMINIT            /* Initial PC   */
50 #endif
51 #ifdef CONFIG_SYS_NAND_BOOT
52 INITPC: .long   ASM_DRAMINIT_N          /* Initial PC   */
53 #endif
54
55 #else
56
57 INITSP: .long   0                       /* Initial SP   */
58 INITPC: .long   _START                  /* Initial PC   */
59
60 #endif
61
62 vector02_0F:
63 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
64 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
65
66 /* Reserved */
67 vector10_17:
68 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
69
70 vector18_1F:
71 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
72
73 #if !defined(CONFIG_SERIAL_BOOT)
74
75 /* TRAP #0 - #15 */
76 vector20_2F:
77 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
78 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
79
80 /* Reserved     */
81 vector30_3F:
82 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
83 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
84
85 vector64_127:
86 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
87 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
95 vector128_191:
96 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
97 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
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
105 vector192_255:
106 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
107 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
108 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
109 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
110 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
111 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
112 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
113 .long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
114 #endif
115
116 #if defined(CONFIG_SERIAL_BOOT)
117         /* Image header: chksum 4 bytes, len 4 bytes, img dest 4 bytes */
118 asm_sbf_img_hdr:
119         .long   0x00000000              /* checksum, not yet implemented */
120         .long   0x00040000              /* image length */
121         .long   CONFIG_SYS_TEXT_BASE    /* image to be relocated at */
122
123 asm_dram_init:
124         move.w  #0x2700,%sr             /* Mask off Interrupt */
125
126 #ifdef CONFIG_SYS_NAND_BOOT
127         /* for assembly stack */
128         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
129         movec   %d0, %RAMBAR1
130
131         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
132         clr.l   %sp@-
133 #endif
134
135 #ifdef CONFIG_CF_SBF
136         move.l  #CONFIG_SYS_INIT_RAM_ADDR, %d0
137         movec   %d0, %VBR
138
139         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
140         movec   %d0, %RAMBAR1
141
142         /* initialize general use internal ram */
143         move.l  #0, %d0
144         move.l  #(ICACHE_STATUS), %a1   /* icache */
145         move.l  #(DCACHE_STATUS), %a2   /* dcache */
146         move.l  %d0, (%a1)
147         move.l  %d0, (%a2)
148
149         /* invalidate and disable cache */
150         move.l  #(CONFIG_SYS_ICACHE_INV + CONFIG_SYS_DCACHE_INV), %d0
151         movec   %d0, %CACR              /* Invalidate cache */
152         move.l  #0, %d0
153         movec   %d0, %ACR0
154         movec   %d0, %ACR1
155         movec   %d0, %ACR2
156         movec   %d0, %ACR3
157
158         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
159         clr.l   %sp@-
160
161 #ifdef CONFIG_SYS_CS0_BASE
162         /* Must disable global address */
163         move.l  #0xFC008000, %a1
164         move.l  #(CONFIG_SYS_CS0_BASE), (%a1)
165         move.l  #0xFC008008, %a1
166         move.l  #(CONFIG_SYS_CS0_CTRL), (%a1)
167         move.l  #0xFC008004, %a1
168         move.l  #(CONFIG_SYS_CS0_MASK), (%a1)
169 #endif
170 #endif /* CONFIG_CF_SBF */
171
172 #ifdef CONFIG_MCF5441x
173         /* TC: enable all peripherals,
174         in the future only enable certain peripherals */
175         move.l  #0xFC04002D, %a1
176
177 #if defined(CONFIG_CF_SBF)
178         move.b  #23, (%a1)              /* dspi */
179 #endif
180 #endif  /* CONFIG_MCF5441x */
181
182         /* mandatory board level ddr-sdram init,
183          * for both 5441x and 5445x
184          */
185         bsr     sbf_dram_init
186
187 #ifdef CONFIG_CF_SBF
188         /*
189          * DSPI Initialization
190          * a0 - general, sram - 0x80008000 - 32, see M54455EVB.h
191          * a1 - dspi status
192          * a2 - dtfr
193          * a3 - drfr
194          * a4 - Dst addr
195          */
196         /* Enable pins for DSPI mode - chip-selects are enabled later */
197 asm_dspi_init:
198 #ifdef CONFIG_MCF5441x
199         move.l  #0xEC09404E, %a1
200         move.l  #0xEC09404F, %a2
201         move.b  #0xFF, (%a1)
202         move.b  #0x80, (%a2)
203 #endif
204
205 #ifdef CONFIG_MCF5445x
206         move.l  #0xFC0A4063, %a0
207         move.b  #0x7F, (%a0)
208 #endif
209         /* Configure DSPI module */
210         move.l  #0xFC05C000, %a0
211         move.l  #0x80FF0C00, (%a0)      /* Master, clear TX/RX FIFO */
212
213         move.l  #0xFC05C00C, %a0
214 #ifdef CONFIG_MCF5441x
215         move.l  #0x3E000016, (%a0)
216 #endif
217 #ifdef CONFIG_MCF5445x
218         move.l  #0x3E000011, (%a0)
219 #endif
220
221         move.l  #0xFC05C034, %a2        /* dtfr */
222         move.l  #0xFC05C03B, %a3        /* drfr */
223
224         move.l  #(ASM_SBF_IMG_HDR + 4), %a1
225         move.l  (%a1)+, %d5
226         move.l  (%a1), %a4
227
228         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_SBFHDR_DATA_OFFSET), %a0
229         move.l  #(CONFIG_SYS_SBFHDR_SIZE), %d4
230
231         move.l  #0xFC05C02C, %a1        /* dspi status */
232
233         /* Issue commands and address */
234         move.l  #0x8002000B, %d2        /* Fast Read Cmd */
235         jsr     asm_dspi_wr_status
236         jsr     asm_dspi_rd_status
237
238         move.l  #0x80020000, %d2        /* Address byte 2 */
239         jsr     asm_dspi_wr_status
240         jsr     asm_dspi_rd_status
241
242         move.l  #0x80020000, %d2        /* Address byte 1 */
243         jsr     asm_dspi_wr_status
244         jsr     asm_dspi_rd_status
245
246         move.l  #0x80020000, %d2        /* Address byte 0 */
247         jsr     asm_dspi_wr_status
248         jsr     asm_dspi_rd_status
249
250         move.l  #0x80020000, %d2        /* Dummy Wr and Rd */
251         jsr     asm_dspi_wr_status
252         jsr     asm_dspi_rd_status
253
254         /* Transfer serial boot header to sram */
255 asm_dspi_rd_loop1:
256         move.l  #0x80020000, %d2
257         jsr     asm_dspi_wr_status
258         jsr     asm_dspi_rd_status
259
260         move.b  %d1, (%a0)              /* read, copy to dst */
261
262         add.l   #1, %a0                 /* inc dst by 1 */
263         sub.l   #1, %d4                 /* dec cnt by 1 */
264         bne     asm_dspi_rd_loop1
265
266         /* Transfer u-boot from serial flash to memory */
267 asm_dspi_rd_loop2:
268         move.l  #0x80020000, %d2
269         jsr     asm_dspi_wr_status
270         jsr     asm_dspi_rd_status
271
272         move.b  %d1, (%a4)              /* read, copy to dst */
273
274         add.l   #1, %a4                 /* inc dst by 1 */
275         sub.l   #1, %d5                 /* dec cnt by 1 */
276         bne     asm_dspi_rd_loop2
277
278         move.l  #0x00020000, %d2        /* Terminate */
279         jsr     asm_dspi_wr_status
280         jsr     asm_dspi_rd_status
281
282         /* jump to memory and execute */
283         move.l  #(CONFIG_SYS_TEXT_BASE + 0x400), %a0
284         jmp     (%a0)
285
286 asm_dspi_wr_status:
287         move.l  (%a1), %d0              /* status */
288         and.l   #0x0000F000, %d0
289         cmp.l   #0x00003000, %d0
290         bgt     asm_dspi_wr_status
291
292         move.l  %d2, (%a2)
293         rts
294
295 asm_dspi_rd_status:
296         move.l  (%a1), %d0              /* status */
297         and.l   #0x000000F0, %d0
298         lsr.l   #4, %d0
299         cmp.l   #0, %d0
300         beq     asm_dspi_rd_status
301
302         move.b  (%a3), %d1
303         rts
304 #endif /* CONFIG_CF_SBF */
305
306 #ifdef CONFIG_SYS_NAND_BOOT
307         /* copy 4 boot pages to dram as soon as possible */
308         /* each page is 996 bytes (1056 total with 60 ECC bytes */
309         move.l  #0x00000000, %a1        /* src */
310         move.l  #CONFIG_SYS_TEXT_BASE, %a2              /* dst */
311         move.l  #0x3E0, %d0             /* sz in long */
312
313 asm_boot_nand_copy:
314         move.l  (%a1)+, (%a2)+
315         subq.l  #1, %d0
316         bne     asm_boot_nand_copy
317
318         /* jump to memory and execute */
319         move.l  #(asm_nand_init), %a0
320         jmp     (%a0)
321
322 asm_nand_init:
323         /* exit nand boot-mode */
324         move.l  #0xFC0FFF30, %a1
325         or.l    #0x00000040, %d1
326         move.l  %d1, (%a1)
327
328         /* initialize general use internal ram */
329         move.l  #0, %d0
330         move.l  #(CACR_STATUS), %a1     /* CACR */
331         move.l  #(ICACHE_STATUS), %a2   /* icache */
332         move.l  #(DCACHE_STATUS), %a3   /* dcache */
333         move.l  %d0, (%a1)
334         move.l  %d0, (%a2)
335         move.l  %d0, (%a3)
336
337         /* invalidate and disable cache */
338         move.l  #0x01004100, %d0        /* Invalidate cache cmd */
339         movec   %d0, %CACR              /* Invalidate cache */
340         move.l  #0, %d0
341         movec   %d0, %ACR0
342         movec   %d0, %ACR1
343         movec   %d0, %ACR2
344         movec   %d0, %ACR3
345
346 #ifdef CONFIG_SYS_CS0_BASE
347         /* Must disable global address */
348         move.l  #0xFC008000, %a1
349         move.l  #(CONFIG_SYS_CS0_BASE), (%a1)
350         move.l  #0xFC008008, %a1
351         move.l  #(CONFIG_SYS_CS0_CTRL), (%a1)
352         move.l  #0xFC008004, %a1
353         move.l  #(CONFIG_SYS_CS0_MASK), (%a1)
354 #endif
355
356         /* NAND port configuration */
357         move.l  #0xEC094048, %a1
358         move.b  #0xFD, (%a1)+
359         move.b  #0x5F, (%a1)+
360         move.b  #0x04, (%a1)+
361
362         /* reset nand */
363         move.l  #0xFC0FFF38, %a1        /* isr */
364         move.l  #0x000e0000, (%a1)
365         move.l  #0xFC0FFF08, %a2
366         move.l  #0x00000000, (%a2)+     /* car */
367         move.l  #0x11000000, (%a2)+     /* rar */
368         move.l  #0x00000000, (%a2)+     /* rpt */
369         move.l  #0x00000000, (%a2)+     /* rai */
370         move.l  #0xFC0FFF2c, %a2        /* cfg */
371         move.l  #0x00000000, (%a2)+     /* secsz */
372         move.l  #0x000e0681, (%a2)+
373         move.l  #0xFC0FFF04, %a2        /* cmd2 */
374         move.l  #0xFF404001, (%a2)
375         move.l  #0x000e0000, (%a1)
376
377         move.l  #0x2000, %d1
378         bsr     asm_delay
379
380         /* setup nand */
381         move.l  #0xFC0FFF00, %a1
382         move.l  #0x30700000, (%a1)+     /* cmd1 */
383         move.l  #0x007EF000, (%a1)+     /* cmd2 */
384
385         move.l  #0xFC0FFF2C, %a1
386         move.l  #0x00000841, (%a1)+     /* secsz */
387         move.l  #0x000e0681, (%a1)+     /* cfg */
388
389         move.l  #100, %d4               /* 100 pages ~200KB */
390         move.l  #4, %d2                 /* start at 4 */
391         move.l  #0xFC0FFF04, %a0        /* cmd2 */
392         move.l  #0xFC0FFF0C, %a1        /* rar */
393         move.l  #(CONFIG_SYS_TEXT_BASE + 0xF80), %a2
394
395 asm_nand_read:
396         move.l  #0x11000000, %d0        /* rar */
397         or.l    %d2, %d0
398         move.l  %d0, (%a1)
399         add.l   #1, %d2
400
401         move.l  (%a0), %d0              /* cmd2 */
402         or.l    #1, %d0
403         move.l  %d0, (%a0)
404
405         move.l  #0x200, %d1
406         bsr     asm_delay
407
408 asm_nand_chk_status:
409         move.l  #0xFC0FFF38, %a4        /* isr */
410         move.l  (%a4), %d0
411         and.l   #0x40000000, %d0
412         tst.l   %d0
413         beq     asm_nand_chk_status
414
415         move.l  #0xFC0FFF38, %a4        /* isr */
416         move.l  (%a4), %d0
417         or.l    #0x000E0000, %d0
418         move.l  %d0, (%a4)
419
420         move.l  #0x200, %d3
421         move.l  #0xFC0FC000, %a3        /* buf 1 */
422 asm_nand_copy:
423         move.l  (%a3)+, (%a2)+
424         subq.l  #1, %d3
425         bgt     asm_nand_copy
426
427         subq.l  #1, %d4
428         bgt     asm_nand_read
429
430         /* jump to memory and execute */
431         move.l  #(CONFIG_SYS_TEXT_BASE + 0x400), %a0
432         jmp     (%a0)
433
434 #endif                  /* CONFIG_SYS_NAND_BOOT */
435
436 .globl asm_delay
437 asm_delay:
438         nop
439         subq.l  #1, %d1
440         bne     asm_delay
441         rts
442 #endif                  /* CONFIG_CF_SBF || CONFIG_NAND_U_BOOT */
443
444 .text
445         . = 0x400
446 .globl _start
447 _start:
448 #if !defined(CONFIG_SERIAL_BOOT)
449         nop
450         nop
451         move.w  #0x2700,%sr             /* Mask off Interrupt */
452
453         /* Set vector base register at the beginning of the Flash */
454         move.l  #CONFIG_SYS_FLASH_BASE, %d0
455         movec   %d0, %VBR
456
457         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
458         movec   %d0, %RAMBAR1
459
460         /* initialize general use internal ram */
461         move.l  #0, %d0
462         move.l  #(ICACHE_STATUS), %a1   /* icache */
463         move.l  #(DCACHE_STATUS), %a2   /* dcache */
464         move.l  %d0, (%a1)
465         move.l  %d0, (%a2)
466
467         /* invalidate and disable cache */
468         move.l  #(CONFIG_SYS_ICACHE_INV + CONFIG_SYS_DCACHE_INV), %d0
469         movec   %d0, %CACR              /* Invalidate cache */
470         move.l  #0, %d0
471         movec   %d0, %ACR0
472         movec   %d0, %ACR1
473         movec   %d0, %ACR2
474         movec   %d0, %ACR3
475 #else
476         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_CTRL), %d0
477         movec   %d0, %RAMBAR1
478 #endif
479
480         /* put relocation table address to a5 */
481         move.l  #__got_start, %a5
482
483         /* setup stack initially on top of internal static ram  */
484         move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE), %sp
485
486         /*
487          * if configured, malloc_f arena will be reserved first,
488          * then (and always) gd struct space will be reserved
489          */
490         move.l  %sp, -(%sp)
491         move.l  #board_init_f_alloc_reserve, %a1
492         jsr     (%a1)
493
494         /* update stack and frame-pointers */
495         move.l  %d0, %sp
496         move.l  %sp, %fp
497
498         /* initialize reserved area */
499         move.l  %d0, -(%sp)
500         move.l  #board_init_f_init_reserve, %a1
501         jsr     (%a1)
502
503         /* run low-level CPU init code (from flash) */
504         move.l  #cpu_init_f, %a1
505         jsr     (%a1)
506
507         /* run low-level board init code (from flash) */
508         clr.l   %sp@-
509         move.l  #board_init_f, %a1
510         jsr     (%a1)
511
512         /* board_init_f() does not return */
513
514 /******************************************************************************/
515
516 /*
517  * void relocate_code (addr_sp, gd, addr_moni)
518  *
519  * This "function" does not return, instead it continues in RAM
520  * after relocating the monitor code.
521  *
522  * r3 = dest
523  * r4 = src
524  * r5 = length in bytes
525  * r6 = cachelinesize
526  */
527 .globl relocate_code
528 relocate_code:
529         link.w  %a6,#0
530         move.l  8(%a6), %sp             /* set new stack pointer */
531
532         move.l  12(%a6), %d0            /* Save copy of Global Data pointer */
533         move.l  16(%a6), %a0            /* Save copy of Destination Address */
534
535         move.l  #CONFIG_SYS_MONITOR_BASE, %a1
536         move.l  #__init_end, %a2
537         move.l  %a0, %a3
538
539         /* copy the code to RAM */
540 1:
541         move.l  (%a1)+, (%a3)+
542         cmp.l   %a1,%a2
543         bgt.s   1b
544
545 /*
546  * We are done. Do not return, instead branch to second part of board
547  * initialization, now running from RAM.
548  */
549         move.l  %a0, %a1
550         add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
551         jmp     (%a1)
552
553 in_ram:
554
555 clear_bss:
556         /*
557          * Now clear BSS segment
558          */
559         move.l  %a0, %a1
560         add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE),%a1
561         move.l  %a0, %d1
562         add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE),%d1
563 6:
564         clr.l   (%a1)+
565         cmp.l   %a1,%d1
566         bgt.s   6b
567
568         /*
569          * fix got table in RAM
570          */
571         move.l  %a0, %a1
572         add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE),%a1
573         move.l  %a1,%a5                 /* fix got pointer register a5 */
574
575         move.l  %a0, %a2
576         add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE),%a2
577
578 7:
579         move.l  (%a1),%d1
580         sub.l   #_start,%d1
581         add.l   %a0,%d1
582         move.l  %d1,(%a1)+
583         cmp.l   %a2, %a1
584         bne     7b
585
586         /* calculate relative jump to board_init_r in ram */
587         move.l  %a0, %a1
588         add.l   #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
589
590         /* set parameters for board_init_r */
591         move.l  %a0,-(%sp)              /* dest_addr */
592         move.l  %d0,-(%sp)              /* gd */
593         jsr     (%a1)
594
595 /******************************************************************************/
596
597 /* exception code */
598 .globl _fault
599 _fault:
600         bra     _fault
601
602 .globl _exc_handler
603 _exc_handler:
604         SAVE_ALL
605         movel   %sp,%sp@-
606         bsr     exc_handler
607         addql   #4,%sp
608         RESTORE_ALL
609
610 .globl _int_handler
611 _int_handler:
612         SAVE_ALL
613         movel   %sp,%sp@-
614         bsr     int_handler
615         addql   #4,%sp
616         RESTORE_ALL
617
618 /******************************************************************************/
619
620 .globl version_string
621 version_string:
622 .ascii U_BOOT_VERSION_STRING, "\0"
623 .align 4