linux/arch/avr32/boot/u-boot/head.S
<<
>>
Prefs
   1/*
   2 * Startup code for use with the u-boot bootloader.
   3 *
   4 * Copyright (C) 2004-2006 Atmel Corporation
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10#include <asm/setup.h>
  11#include <asm/thread_info.h>
  12#include <asm/sysreg.h>
  13
  14        /*
  15         * The kernel is loaded where we want it to be and all caches
  16         * have just been flushed. We get two parameters from u-boot:
  17         *
  18         * r12 contains a magic number (ATAG_MAGIC)
  19         * r11 points to a tag table providing information about
  20         *     the system.
  21         */
  22        .section .init.text,"ax"
  23        .global _start
  24_start:
  25        /* Initialize .bss */
  26        lddpc   r2, bss_start_addr
  27        lddpc   r3, end_addr
  28        mov     r0, 0
  29        mov     r1, 0
  301:      st.d    r2++, r0
  31        cp      r2, r3
  32        brlo    1b
  33
  34        /* Initialize status register */
  35        lddpc   r0, init_sr
  36        mtsr    SYSREG_SR, r0
  37
  38        /* Set initial stack pointer */
  39        lddpc   sp, stack_addr
  40        sub     sp, -THREAD_SIZE
  41
  42#ifdef CONFIG_FRAME_POINTER
  43        /* Mark last stack frame */
  44        mov     lr, 0
  45        mov     r7, 0
  46#endif
  47
  48        /* Check if the boot loader actually provided a tag table */
  49        lddpc   r0, magic_number
  50        cp.w    r12, r0
  51        brne    no_tag_table
  52
  53        /*
  54         * Save the tag table address for later use. This must be done
  55         * _after_ .bss has been initialized...
  56         */
  57        lddpc   r0, tag_table_addr
  58        st.w    r0[0], r11
  59
  60        /* Jump to loader-independent setup code */
  61        rjmp    kernel_entry
  62
  63        .align  2
  64magic_number:
  65        .long   ATAG_MAGIC
  66tag_table_addr:
  67        .long   bootloader_tags
  68bss_start_addr:
  69        .long   __bss_start
  70end_addr:
  71        .long   _end
  72init_sr:
  73        .long   0x007f0000      /* Supervisor mode, everything masked */
  74stack_addr:
  75        .long   init_thread_union
  76panic_addr:
  77        .long   panic
  78
  79no_tag_table:
  80        sub     r12, pc, (. - 2f)
  81        /* branch to panic() which can be far away with that construct */
  82        lddpc   pc, panic_addr
  832:      .asciz  "Boot loader didn't provide correct magic number\n"
  84