uboot/arch/m68k/cpu/mcf530x/start.S
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2015  Angelo Dureghello <angelo@sysam.it>
   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
  21.macro  SAVE_ALL
  22        move.w  #0x2700,%sr;            /* disable intrs */
  23        subl    #60,%sp;                /* space for 15 regs */
  24        moveml  %d0-%d7/%a0-%a6,%sp@
  25.endm
  26
  27.macro  RESTORE_ALL
  28        moveml  %sp@,%d0-%d7/%a0-%a6;
  29        addl    #60,%sp;                /* space for 15 regs */
  30        rte
  31.endm
  32
  33/* If we come from a pre-loader we don't need an initial exception
  34 * table.
  35 */
  36#if !defined(CONFIG_MONITOR_IS_IN_RAM)
  37
  38.text
  39/*
  40 *      Vector table. This is used for initial platform startup.
  41 *      These vectors are to catch any un-intended traps.
  42 */
  43_vectors:
  44
  45/* Flash offset is 0 until we setup CS0 */
  46.long   0x00000000
  47#if defined(CONFIG_M5307) && \
  48           (CONFIG_SYS_TEXT_BASE == CONFIG_SYS_INT_FLASH_BASE)
  49.long   _start - CONFIG_SYS_TEXT_BASE
  50#else
  51.long   _START
  52#endif
  53
  54.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  55.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  56.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  57.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  58.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  59.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  60.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  61.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  62
  63.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  64.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  65.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  66.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  67.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  68.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  69.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  70.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  71
  72.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  73.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  74.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  75.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  76.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  77.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  78.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  79.long   _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT, _FAULT
  80
  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.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
  90#endif
  91
  92        .text
  93        .globl  _start
  94_start:
  95        nop
  96        nop
  97        move.w  #0x2700,%sr
  98
  99        /* set MBAR address + valid flag */
 100        move.l  #(CONFIG_SYS_MBAR + 1), %d0
 101        move.c  %d0, %MBAR
 102
 103        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + 1), %d0
 104        move.c  %d0, %RAMBAR
 105
 106        /* DS 4.8.2 (Cache Organization) invalidate and disable cache */
 107        move.l  #CF_CACR_CINVA, %d0
 108        movec   %d0, %CACR
 109        move.l  #0, %d0
 110        movec   %d0, %ACR0
 111        movec   %d0, %ACR1
 112
 113        /*
 114         * if we come from a pre-loader we have no exception table and
 115         * therefore no VBR to set
 116         */
 117#if !defined(CONFIG_MONITOR_IS_IN_RAM)
 118        move.l  #CONFIG_SYS_FLASH_BASE, %d0
 119        movec   %d0, %VBR
 120#endif
 121
 122        /* initialize general use internal ram */
 123        move.l  #0, %d0
 124        move.l  #(ICACHE_STATUS), %a1   /* icache */
 125        move.l  #(DCACHE_STATUS), %a2   /* dcache */
 126        move.l  %d0, (%a1)
 127        move.l  %d0, (%a2)
 128
 129        /*
 130         * set stackpointer to internal sram end - 80
 131         * (global data struct size + some bytes)
 132         * get some stackspace for the first c-code,
 133         */
 134        move.l  #(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET), %sp
 135        clr.l   %sp@-
 136
 137        /* put relocation table address to a5 */
 138        move.l #__got_start, %a5
 139
 140        /* run low-level CPU init code (from flash) */
 141        bsr cpu_init_f
 142
 143        /* run low-level board init code (from flash) */
 144        bsr board_init_f
 145
 146        /* board_init_f() does not return */
 147
 148/*--------------------------------------------------------------------------*/
 149
 150/*
 151 * void relocate_code (addr_sp, gd, addr_moni)
 152 *
 153 * This "function" does not return, instead it continues in RAM
 154 * after relocating the monitor code.
 155 *
 156 */
 157        .globl  relocate_code
 158relocate_code:
 159        link.w  %a6,#0
 160        move.l  8(%a6), %sp     /* set new stack pointer */
 161        move.l  12(%a6), %d0    /* Save copy of Global Data pointer */
 162        move.l  16(%a6), %a0    /* Save copy of Destination Address */
 163
 164        move.l  #CONFIG_SYS_MONITOR_BASE, %a1
 165        move.l  #__init_end, %a2
 166        move.l  %a0, %a3
 167        /* copy the code to RAM */
 1681:
 169        move.l  (%a1)+, (%a3)+
 170        cmp.l   %a1,%a2
 171        bgt.s   1b
 172
 173/*
 174 * We are done. Do not return, instead branch to second part of board
 175 * initialization, now running from RAM.
 176 */
 177        move.l  %a0, %a1
 178        add.l   #(in_ram - CONFIG_SYS_MONITOR_BASE), %a1
 179        jmp     (%a1)
 180
 181in_ram:
 182
 183clear_bss:
 184        /*
 185         * Now clear BSS segment
 186         */
 187        move.l  %a0, %a1
 188        add.l   #(_sbss - CONFIG_SYS_MONITOR_BASE), %a1
 189        move.l  %a0, %d1
 190        add.l   #(_ebss - CONFIG_SYS_MONITOR_BASE), %d1
 1916:
 192        clr.l   (%a1)+
 193        cmp.l   %a1,%d1
 194        bgt.s   6b
 195
 196        /*
 197         * fix got table in RAM
 198         */
 199        move.l  %a0, %a1
 200        add.l   #(__got_start - CONFIG_SYS_MONITOR_BASE), %a1
 201        /* * fix got pointer register a5 */
 202        move.l  %a1,%a5
 203
 204        move.l  %a0, %a2
 205        add.l   #(__got_end - CONFIG_SYS_MONITOR_BASE), %a2
 206
 2077:
 208        move.l  (%a1),%d1
 209        sub.l   #_start, %d1
 210        add.l   %a0,%d1
 211        move.l  %d1,(%a1)+
 212        cmp.l   %a2, %a1
 213        bne     7b
 214
 215        /* calculate relative jump to board_init_r in ram */
 216        move.l  %a0, %a1
 217        add.l   #(board_init_r - CONFIG_SYS_MONITOR_BASE), %a1
 218
 219        /* set parameters for board_init_r */
 220        move.l  %a0,-(%sp)      /* dest_addr */
 221        move.l  %d0,-(%sp)      /* gd */
 222#if defined(DEBUG) && (CONFIG_SYS_TEXT_BASE!=CONFIG_SYS_INT_FLASH_BASE) && \
 223    defined(CONFIG_SYS_HALT_BEFOR_RAM_JUMP)
 224        halt
 225#endif
 226        jsr     (%a1)
 227
 228/*--------------------------------------------------------------------------*/
 229/* exception code */
 230        .globl _fault
 231_fault:
 232        bra     _fault
 233
 234        .globl  _exc_handler
 235_exc_handler:
 236        SAVE_ALL
 237        movel   %sp,%sp@-
 238        bsr     exc_handler
 239        addql   #4,%sp
 240        RESTORE_ALL
 241
 242        .globl  _int_handler
 243_int_handler:
 244        SAVE_ALL
 245        movel   %sp,%sp@-
 246        bsr     int_handler
 247        addql   #4,%sp
 248        RESTORE_ALL
 249
 250/*--------------------------------------------------------------------------*/
 251
 252        .globl  version_string
 253version_string:
 254        .ascii  U_BOOT_VERSION
 255        .ascii  " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
 256        .ascii  CONFIG_IDENT_STRING, "\0"
 257        .align  4
 258