]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - arch/sh/kernel/relocate_kernel.S
2a6630be668c769f4d6da99e68a1f643d686bd7a
[linux-2.6-omap-h63xx.git] / arch / sh / kernel / relocate_kernel.S
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 #include <linux/linkage.h>
11 #include <asm/addrspace.h>
12 #include <asm/page.h>
13
14                 .globl relocate_new_kernel
15 relocate_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 */
28 0:
29         mov.l   @r4+,r0   /* cmd = *ind++ */
30
31 1:      /* 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
42 2:      /* else if(cmd & IND_INDIRECTION) ind = addr  */
43         tst     #2,r0
44         bt      3f
45         bra     0b
46         mov     r2,r4
47
48 3:      /* else if(cmd & IND_DONE) goto 6  */
49         tst     #4,r0
50         bt      4f
51         bra     6f
52         nop
53
54 4:      /* 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
61 5:
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
79 6:
80         jmp @r6
81         nop
82
83         .align 2
84 10:
85         .long   PAGE_SIZE
86
87 relocate_new_kernel_end:
88
89         .globl relocate_new_kernel_size
90 relocate_new_kernel_size:
91         .long relocate_new_kernel_end - relocate_new_kernel