blob: 2a6630be668c769f4d6da99e68a1f643d686bd7a [file] [log] [blame]
kogiidena9d441902006-01-16 22:14:10 -08001/*
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 */
kogiidena9d441902006-01-16 22:14:10 -080010#include <linux/linkage.h>
Paul Mundt510c72ad2006-11-27 12:06:26 +090011#include <asm/addrspace.h>
12#include <asm/page.h>
kogiidena9d441902006-01-16 22:14:10 -080013
14 .globl relocate_new_kernel
15relocate_new_kernel:
16 /* r4 = indirection_page */
17 /* r5 = reboot_code_buffer */
18 /* r6 = start_address */
kogiidena9d441902006-01-16 22:14:10 -080019
Paul Mundt510c72ad2006-11-27 12:06:26 +090020 mov.l 10f,r8 /* PAGE_SIZE */
kogiidena9d441902006-01-16 22:14:10 -080021
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
Magnus Damme4e063d2009-03-18 08:49:45 +0000311: /* addr = cmd & 0xfffffff0 */
kogiidena9d441902006-01-16 22:14:10 -080032 mov r0,r2
kogiidena9d441902006-01-16 22:14:10 -080033 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:
kogiidena9d441902006-01-16 22:14:10 -080080 jmp @r6
81 nop
82
83 .align 2
8410:
85 .long PAGE_SIZE
kogiidena9d441902006-01-16 22:14:10 -080086
87relocate_new_kernel_end:
88
89 .globl relocate_new_kernel_size
90relocate_new_kernel_size:
91 .long relocate_new_kernel_end - relocate_new_kernel