linux/arch/nios2/boot/compressed/head.S
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2009 Thomas Chou <thomas@wytron.com.tw>
   3 *
   4 * Based on arch/nios2/kernel/head.S
   5 *
   6 * This file is subject to the terms and conditions of the GNU General Public
   7 * License. See the file "COPYING" in the main directory of this archive
   8 * for more details.
   9 *
  10 */
  11
  12/*
  13 *  This code can be loaded anywhere, eg FLASH ROM as reset vector,
  14 *  as long as output does not overlap it.
  15 */
  16
  17#include <linux/linkage.h>
  18#include <asm/cache.h>
  19
  20        .text
  21        .set noat
  22ENTRY(_start)
  23        wrctl   status, r0              /* disable interrupt */
  24        /* invalidate all instruction cache */
  25        movia   r1, NIOS2_ICACHE_SIZE
  26        movui   r2, NIOS2_ICACHE_LINE_SIZE
  271:      initi   r1
  28        sub     r1, r1, r2
  29        bgt     r1, r0, 1b
  30        /* invalidate all data cache */
  31        movia   r1, NIOS2_DCACHE_SIZE
  32        movui   r2, NIOS2_DCACHE_LINE_SIZE
  331:      initd   0(r1)
  34        sub     r1, r1, r2
  35        bgt     r1, r0, 1b
  36
  37        nextpc  r1                      /* Find out where we are */
  38chkadr:
  39        movia   r2, chkadr
  40        beq     r1, r2, finish_move     /* We are running in correct address,
  41                                           done */
  42        /* move code, r1: src, r2: dest, r3: last dest */
  43        addi    r1, r1, (_start - chkadr)       /* Source */
  44        movia   r2, _start              /* Destination */
  45        movia   r3, __bss_start         /* End of copy */
  461:      ldw     r8, 0(r1)               /* load a word from [r1] */
  47        stw     r8, 0(r2)               /* stort a word to dest [r2] */
  48        addi    r1, r1, 4               /* inc the src addr */
  49        addi    r2, r2, 4               /* inc the dest addr */
  50        blt     r2, r3, 1b
  51        /* flush the data cache after moving */
  52        movia   r1, NIOS2_DCACHE_SIZE
  53        movui   r2, NIOS2_DCACHE_LINE_SIZE
  541:      flushd  0(r1)
  55        sub     r1, r1, r2
  56        bgt     r1, r0, 1b
  57        movia   r1, finish_move
  58        jmp     r1                      /* jmp to linked address */
  59
  60finish_move:
  61        /* zero out the .bss segment (uninitialized common data) */
  62        movia   r2, __bss_start         /* presume nothing is between */
  63        movia   r1, _end                /* the .bss and _end. */
  641:      stb     r0, 0(r2)
  65        addi    r2, r2, 1
  66        bne     r1, r2, 1b
  67        /*
  68         * set up the stack pointer, some where higher than _end.
  69         * The stack space must be greater than 32K for decompress.
  70         */
  71        movia   sp, 0x10000
  72        add     sp, sp, r1
  73        /* save args passed from u-boot, maybe */
  74        addi    sp, sp, -16
  75        stw     r4, 0(sp)
  76        stw     r5, 4(sp)
  77        stw     r6, 8(sp)
  78        stw     r7, 12(sp)
  79        /* decompress the kernel */
  80        call    decompress_kernel
  81        /* pass saved args to kernel */
  82        ldw     r4, 0(sp)
  83        ldw     r5, 4(sp)
  84        ldw     r6, 8(sp)
  85        ldw     r7, 12(sp)
  86
  87        /* flush all data cache after decompressing */
  88        movia   r1, NIOS2_DCACHE_SIZE
  89        movui   r2, NIOS2_DCACHE_LINE_SIZE
  901:      flushd  0(r1)
  91        sub     r1, r1, r2
  92        bgt     r1, r0, 1b
  93        /* flush all instruction cache */
  94        movia   r1, NIOS2_ICACHE_SIZE
  95        movui   r2, NIOS2_ICACHE_LINE_SIZE
  961:      flushi  r1
  97        sub     r1, r1, r2
  98        bgt     r1, r0, 1b
  99        flushp
 100        /* jump to start real kernel */
 101        movia   r1, (CONFIG_NIOS2_MEM_BASE | CONFIG_NIOS2_KERNEL_REGION_BASE)
 102        jmp     r1
 103
 104        .balign 512
 105fake_headers_as_bzImage:
 106        .short  0
 107        .ascii  "HdrS"
 108        .short  0x0202
 109        .short  0
 110        .short  0
 111        .byte   0x00, 0x10
 112        .short  0
 113        .byte   0
 114        .byte   1
 115        .byte   0x00, 0x80
 116        .long   0
 117        .long   0
 118