1/* 2 * relocate_kernel.S - put the kernel image in place to boot 3 * 2005.9.17 [email protected] 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#include <linux/linkage.h> 11#include <asm/addrspace.h> 12#include <asm/page.h> 13 14 .globl relocate_new_kernel 15relocate_new_kernel: 16 /* r4 = indirection_page */ 17 /* r5 = reboot_code_buffer */ 18 /* r6 = start_address */ 19 20 mov.l 10f,r8 /* PAGE_SIZE */ 21 22 /* stack setting */ 23 add r8,r5 24 mov r5,r15 25 26 bra 1f 27 mov r4,r0 /* cmd = indirection_page */ 280: 29 mov.l @r4+,r0 /* cmd = *ind++ */ 30 311: /* addr = cmd & 0xfffffff0 */ 32 mov r0,r2 33 mov #-16,r1 34 and r1,r2 35 36 /* if(cmd & IND_DESTINATION) dst = addr */ 37 tst #1,r0 38 bt 2f 39 bra 0b 40 mov r2,r5 41 422: /* else if(cmd & IND_INDIRECTION) ind = addr */ 43 tst #2,r0 44 bt 3f 45 bra 0b 46 mov r2,r4 47 483: /* else if(cmd & IND_DONE) goto 6 */ 49 tst #4,r0 50 bt 4f 51 bra 6f 52 nop 53 544: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */ 55 tst #8,r0 56 bt 0b 57 58 mov r8,r3 59 shlr2 r3 60 shlr2 r3 615: 62 dt r3 63 mov.l @r2+,r1 /* 16n+0 */ 64 mov.l r1,@r5 65 add #4,r5 66 mov.l @r2+,r1 /* 16n+4 */ 67 mov.l r1,@r5 68 add #4,r5 69 mov.l @r2+,r1 /* 16n+8 */ 70 mov.l r1,@r5 71 add #4,r5 72 mov.l @r2+,r1 /* 16n+12 */ 73 mov.l r1,@r5 74 add #4,r5 75 bf 5b 76 77 bra 0b 78 nop 796: 80 jmp @r6 81 nop 82 83 .align 2 8410: 85 .long PAGE_SIZE 86 87relocate_new_kernel_end: 88 89 .globl relocate_new_kernel_size 90relocate_new_kernel_size: 91 .long relocate_new_kernel_end - relocate_new_kernel 92