1/* 2 * relocate_kernel.S - put the kernel image in place to boot 3 * 2005.9.17 kogiidena@eggplant.ddo.jp 4 * 5 * LANDISK/sh4 is supported. Maybe, SH archtecture works well. 6 * 7 * This source code is licensed under the GNU General Public License, 8 * Version 2. See the file COPYING for more details. 9 */ 10 11#include <linux/config.h> 12#include <linux/linkage.h> 13 14#define PAGE_SIZE 4096 /* must be same value as in <asm/page.h> */ 15 16 17 .globl relocate_new_kernel 18relocate_new_kernel: 19 /* r4 = indirection_page */ 20 /* r5 = reboot_code_buffer */ 21 /* r6 = start_address */ 22 /* r7 = vbr_reg */ 23 24 mov.l 10f,r8 /* 4096 */ 25 mov.l 11f,r9 /* 0xa0000000 */ 26 27 /* stack setting */ 28 add r8,r5 29 mov r5,r15 30 31 bra 1f 32 mov r4,r0 /* cmd = indirection_page */ 330: 34 mov.l @r4+,r0 /* cmd = *ind++ */ 35 361: /* addr = (cmd | 0xa0000000) & 0xfffffff0 */ 37 mov r0,r2 38 or r9,r2 39 mov #-16,r1 40 and r1,r2 41 42 /* if(cmd & IND_DESTINATION) dst = addr */ 43 tst #1,r0 44 bt 2f 45 bra 0b 46 mov r2,r5 47 482: /* else if(cmd & IND_INDIRECTION) ind = addr */ 49 tst #2,r0 50 bt 3f 51 bra 0b 52 mov r2,r4 53 543: /* else if(cmd & IND_DONE) goto 6 */ 55 tst #4,r0 56 bt 4f 57 bra 6f 58 nop 59 604: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */ 61 tst #8,r0 62 bt 0b 63 64 mov r8,r3 65 shlr2 r3 66 shlr2 r3 675: 68 dt r3 69 mov.l @r2+,r1 /* 16n+0 */ 70 mov.l r1,@r5 71 add #4,r5 72 mov.l @r2+,r1 /* 16n+4 */ 73 mov.l r1,@r5 74 add #4,r5 75 mov.l @r2+,r1 /* 16n+8 */ 76 mov.l r1,@r5 77 add #4,r5 78 mov.l @r2+,r1 /* 16n+12 */ 79 mov.l r1,@r5 80 add #4,r5 81 bf 5b 82 83 bra 0b 84 nop 856: 86#ifdef CONFIG_SH_STANDARD_BIOS 87 ldc r7, vbr 88#endif 89 jmp @r6 90 nop 91 92 .align 2 9310: 94 .long PAGE_SIZE 9511: 96 .long 0xa0000000 97 98relocate_new_kernel_end: 99 100 .globl relocate_new_kernel_size 101relocate_new_kernel_size: 102 .long relocate_new_kernel_end - relocate_new_kernel 103