Merge branch 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / sh / kernel / relocate_kernel.S
CommitLineData
9d44190e 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 */
9d44190e 10#include <linux/linkage.h>
510c72ad
PM
11#include <asm/addrspace.h>
12#include <asm/page.h>
9d44190e 13
14 .globl relocate_new_kernel
15relocate_new_kernel:
16 /* r4 = indirection_page */
17 /* r5 = reboot_code_buffer */
18 /* r6 = start_address */
19 /* r7 = vbr_reg */
20
510c72ad
PM
21 mov.l 10f,r8 /* PAGE_SIZE */
22 mov.l 11f,r9 /* P2SEG */
9d44190e 23
24 /* stack setting */
25 add r8,r5
26 mov r5,r15
27
28 bra 1f
29 mov r4,r0 /* cmd = indirection_page */
300:
31 mov.l @r4+,r0 /* cmd = *ind++ */
32
510c72ad 331: /* addr = (cmd | P2SEG) & 0xfffffff0 */
9d44190e 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
452: /* else if(cmd & IND_INDIRECTION) ind = addr */
46 tst #2,r0
47 bt 3f
48 bra 0b
49 mov r2,r4
50
513: /* else if(cmd & IND_DONE) goto 6 */
52 tst #4,r0
53 bt 4f
54 bra 6f
55 nop
56
574: /* 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
645:
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
826:
83#ifdef CONFIG_SH_STANDARD_BIOS
84 ldc r7, vbr
85#endif
86 jmp @r6
87 nop
88
89 .align 2
9010:
91 .long PAGE_SIZE
9211:
510c72ad 93 .long P2SEG
9d44190e 94
95relocate_new_kernel_end:
96
97 .globl relocate_new_kernel_size
98relocate_new_kernel_size:
99 .long relocate_new_kernel_end - relocate_new_kernel