Pull bugzilla-5966 into release branch
[linux-2.6] / 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         /* r7 = vbr_reg            */
20
21         mov.l   10f,r8    /* PAGE_SIZE */
22         mov.l   11f,r9    /* P2SEG */
23
24         /*  stack setting */
25         add     r8,r5
26         mov     r5,r15
27
28         bra     1f
29         mov     r4,r0     /* cmd = indirection_page */
30 0:
31         mov.l   @r4+,r0   /* cmd = *ind++ */
32
33 1:      /* addr = (cmd | P2SEG) & 0xfffffff0 */
34         mov     r0,r2
35         or      r9,r2
36         mov     #-16,r1
37         and     r1,r2
38
39         /* if(cmd & IND_DESTINATION) dst = addr  */
40         tst     #1,r0
41         bt      2f
42         bra     0b
43         mov     r2,r5
44
45 2:      /* else if(cmd & IND_INDIRECTION) ind = addr  */
46         tst     #2,r0
47         bt      3f
48         bra     0b
49         mov     r2,r4
50
51 3:      /* else if(cmd & IND_DONE) goto 6  */
52         tst     #4,r0
53         bt      4f
54         bra     6f
55         nop
56
57 4:      /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */
58         tst     #8,r0
59         bt      0b
60
61         mov     r8,r3
62         shlr2   r3
63         shlr2   r3
64 5:
65         dt      r3
66         mov.l   @r2+,r1   /*  16n+0 */
67         mov.l   r1,@r5
68         add     #4,r5
69         mov.l   @r2+,r1   /*  16n+4 */
70         mov.l   r1,@r5
71         add     #4,r5
72         mov.l   @r2+,r1   /*  16n+8 */
73         mov.l   r1,@r5
74         add     #4,r5
75         mov.l   @r2+,r1   /*  16n+12 */
76         mov.l   r1,@r5
77         add     #4,r5
78         bf      5b
79
80         bra     0b
81         nop
82 6:
83 #ifdef CONFIG_SH_STANDARD_BIOS
84         ldc   r7, vbr
85 #endif
86         jmp @r6
87         nop
88
89         .align 2
90 10:
91         .long   PAGE_SIZE
92 11:
93         .long   P2SEG
94
95 relocate_new_kernel_end:
96
97         .globl relocate_new_kernel_size
98 relocate_new_kernel_size:
99         .long relocate_new_kernel_end - relocate_new_kernel