| // Arm assembly to copy the Gemini kernel on Storlink reference |
| // designs and derived devices with the same flash layout and |
| // boot loader. |
| // |
| // This will execute at 0x01600000 |
| // |
| // Copies the kernel from two fragments (originally zImage |
| // and initramdisk) to 0x00400000 making space for a kernel |
| // image of up to 8 MB except for these 512 bytes used for |
| // this bootstrap. |
| // |
| // 0x01600200 .. 0x017fffff -> 0x00400000 .. 0x005ffdff |
| // 0x00800000 .. 0x00dfffff -> 0x005ffe00 .. 0x00bffdff |
| |
| // Memory used for this bootstrap |
| .equ BOOT_HEADROOM, 0x200 |
| |
| .global _start // Stand-alone assembly code |
| _start: |
| mov r1, #0x01600000 |
| mov r2, #0x00400000 |
| mov r3, #0x00200000 |
| add r1, r1, #BOOT_HEADROOM |
| sub r3, r3, #BOOT_HEADROOM |
| copyloop1: |
| ldr r0, [r1] |
| str r0, [r2] |
| add r1, r1, #4 |
| add r2, r2, #4 |
| sub r3, r3, #4 |
| cmp r3, #0 |
| bne copyloop1 |
| mov r1, #0x00800000 |
| mov r3, #0x00600000 |
| copyloop2: |
| ldr r0, [r1] |
| str r0, [r2] |
| add r1, r1, #4 |
| add r2, r2, #4 |
| sub r3, r3, #4 |
| cmp r3, #0 |
| bne copyloop2 |
| mov r0, #0x00400000 |
| // Let's go |
| mov pc, r0 |