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