linux/arch/xtensa/boot/boot-redboot/bootstrap.S
<<
>>
Prefs
   1#include <variant/core.h>
   2#include <asm/regs.h>
   3#include <asm/asmmacro.h>
   4#include <asm/cacheasm.h>
   5        /*
   6         * RB-Data: RedBoot data/bss
   7         * P:       Boot-Parameters
   8         * L:       Kernel-Loader
   9         *
  10         * The Linux-Kernel image including the loader must be loaded
  11         * to a position so that the kernel and the boot parameters
  12         * can fit in the space before the load address.
  13         *  ______________________________________________________
  14         * |_RB-Data_|_P_|__________|_L_|___Linux-Kernel___|______|
  15         *                          ^
  16         *                          ^ Load address
  17         *  ______________________________________________________
  18         * |___Linux-Kernel___|_P_|_L_|___________________________|
  19         *
  20         * The loader copies the parameter to the position that will
  21         * be the end of the kernel and itself to the end of the
  22         * parameter list.
  23         */
  24
  25/* Make sure we have enough space for the 'uncompressor' */
  26
  27#define STACK_SIZE 32768
  28#define HEAP_SIZE (131072*4)
  29
  30        # a2: Parameter list
  31        # a3: Size of parameter list
  32
  33        .section .start, "ax"
  34
  35        .globl __start
  36        /* this must be the first byte of the loader! */
  37__start:
  38        entry   sp, 32          # we do not intend to return
  39        _call0  _start
  40__start_a0:
  41        .align 4
  42
  43        .section .text, "ax"
  44        .begin literal_prefix .text
  45
  46        /* put literals in here! */
  47
  48        .globl _start
  49_start:
  50
  51        /* 'reset' window registers */
  52
  53        movi    a4, 1
  54        wsr     a4, ps
  55        rsync
  56
  57        rsr     a5, windowbase
  58        ssl     a5
  59        sll     a4, a4
  60        wsr     a4, windowstart
  61        rsync
  62
  63        movi    a4, 0x00040000
  64        wsr     a4, ps
  65        rsync
  66
  67        /* copy the loader to its address
  68         * Note: The loader itself is a very small piece, so we assume we
  69         *       don't partially overlap. We also assume (even more important)
  70         *       that the kernel image is out of the way. Usually, when the
  71         *       load address of this image is not at an arbitrary address,
  72         *       but aligned to some 10K's we shouldn't overlap.
  73         */
  74
  75        /* Note: The assembler cannot relax "addi a0, a0, ..." to an
  76           l32r, so we load to a4 first. */
  77
  78        # addi  a4, a0, __start - __start_a0
  79        # mov   a0, a4
  80
  81        movi    a4, __start
  82        movi    a5, __start_a0
  83        add     a4, a0, a4
  84        sub     a0, a4, a5
  85
  86        movi    a4, __start
  87        movi    a5, __reloc_end
  88
  89        # a0: address where this code has been loaded
  90        # a4: compiled address of __start
  91        # a5: compiled end address
  92
  93        mov.n   a7, a0
  94        mov.n   a8, a4
  95
  961:
  97        l32i    a10, a7, 0
  98        l32i    a11, a7, 4
  99        s32i    a10, a8, 0
 100        s32i    a11, a8, 4
 101        l32i    a10, a7, 8
 102        l32i    a11, a7, 12
 103        s32i    a10, a8, 8
 104        s32i    a11, a8, 12
 105        addi    a8, a8, 16
 106        addi    a7, a7, 16
 107        blt     a8, a5, 1b
 108
 109
 110        /* We have to flush and invalidate the caches here before we jump. */
 111
 112#if XCHAL_DCACHE_IS_WRITEBACK
 113
 114        ___flush_dcache_all a5 a6
 115
 116#endif
 117
 118        ___invalidate_icache_all a5 a6
 119        isync
 120
 121        movi    a11, _reloc
 122        jx      a11
 123
 124        .globl _reloc
 125_reloc:
 126
 127        /* RedBoot is now at the end of the memory, so we don't have
 128         * to copy the parameter list. Keep the code around; in case
 129         * we need it again. */
 130#if 0
 131        # a0: load address
 132        # a2: start address of parameter list
 133        # a3: length of parameter list
 134        # a4: __start
 135
 136        /* copy the parameter list out of the way */
 137
 138        movi    a6, _param_start
 139        add     a3, a2, a3
 1402:
 141        l32i    a8, a2, 0
 142        s32i    a8, a6, 0
 143        addi    a2, a2, 4
 144        addi    a6, a6, 4
 145        blt     a2, a3, 2b
 146#endif
 147
 148        /* clear BSS section */
 149        movi    a6, __bss_start
 150        movi    a7, __bss_end
 151        movi.n  a5, 0
 1523:
 153        s32i    a5, a6, 0
 154        addi    a6, a6, 4
 155        blt     a6, a7, 3b
 156
 157        movi    a5, -16
 158        movi    a1, _stack + STACK_SIZE
 159        and     a1, a1, a5
 160
 161        /* Uncompress the kernel */
 162
 163        # a0: load address
 164        # a2: boot parameter
 165        # a4: __start
 166
 167        movi    a3, __image_load
 168        sub     a4, a3, a4
 169        add     a8, a0, a4
 170
 171        # a1  Stack
 172        # a8(a4)  Load address of the image
 173
 174        movi    a6, _image_start
 175        movi    a10, _image_end
 176        movi    a7, 0x1000000
 177        sub     a11, a10, a6
 178        movi    a9, complen
 179        s32i    a11, a9, 0
 180
 181        movi    a0, 0
 182
 183        # a6 destination
 184        # a7 maximum size of destination
 185        # a8 source
 186        # a9 ptr to length
 187
 188        .extern gunzip
 189        movi    a4, gunzip
 190        beqz    a4, 1f
 191
 192        callx4  a4
 193
 194        j       2f
 195
 196
 197        # a6 destination start
 198        # a7 maximum size of destination
 199        # a8 source start
 200        # a9 ptr to length
 201        # a10 destination end
 202
 2031:
 204        l32i    a9, a8, 0
 205        l32i    a11, a8, 4
 206        s32i    a9, a6, 0
 207        s32i    a11, a6, 4
 208        l32i    a9, a8, 8
 209        l32i    a11, a8, 12
 210        s32i    a9, a6, 8
 211        s32i    a11, a6, 12
 212        addi    a6, a6, 16
 213        addi    a8, a8, 16
 214        blt     a6, a10, 1b
 215
 216
 217        /* jump to the kernel */
 2182:
 219#if XCHAL_DCACHE_IS_WRITEBACK
 220
 221        ___flush_dcache_all a5 a6
 222
 223#endif
 224
 225        ___invalidate_icache_all a5 a6
 226
 227        isync
 228
 229        # a2  Boot parameter list
 230
 231        movi    a0, _image_start
 232        jx      a0
 233
 234        .align 16
 235        .data
 236        .globl avail_ram
 237avail_ram:
 238        .long   _heap
 239        .globl end_avail
 240end_avail:
 241        .long   _heap + HEAP_SIZE
 242
 243        .comm _stack, STACK_SIZE
 244        .comm _heap, HEAP_SIZE
 245
 246        .globl end_avail
 247        .comm complen, 4
 248
 249        .end    literal_prefix
 250