xref: /linux/arch/sh/kernel/relocate_kernel.S (revision f3d9478b2ce468c3115b02ecae7e975990697f15)
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
11#include <linux/config.h>
12#include <linux/linkage.h>
13
14#define PAGE_SIZE      4096 /* must be same value as in <asm/page.h> */
15
16
17		.globl relocate_new_kernel
18relocate_new_kernel:
19	/* r4 = indirection_page   */
20	/* r5 = reboot_code_buffer */
21	/* r6 = start_address      */
22	/* r7 = vbr_reg            */
23
24	mov.l	10f,r8	  /* 4096 */
25	mov.l	11f,r9    /* 0xa0000000 */
26
27	/*  stack setting */
28	add	r8,r5
29	mov	r5,r15
30
31	bra	1f
32	mov	r4,r0	  /* cmd = indirection_page */
330:
34	mov.l	@r4+,r0	  /* cmd = *ind++ */
35
361:	/* addr = (cmd | 0xa0000000) & 0xfffffff0 */
37	mov	r0,r2
38	or	r9,r2
39	mov	#-16,r1
40	and	r1,r2
41
42	/* if(cmd & IND_DESTINATION) dst = addr  */
43	tst	#1,r0
44	bt	2f
45	bra	0b
46	mov	r2,r5
47
482:	/* else if(cmd & IND_INDIRECTION) ind = addr  */
49	tst	#2,r0
50	bt	3f
51	bra	0b
52	mov	r2,r4
53
543:	/* else if(cmd & IND_DONE) goto 6  */
55	tst	#4,r0
56	bt	4f
57	bra	6f
58	nop
59
604:	/* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */
61	tst	#8,r0
62	bt	0b
63
64	mov	r8,r3
65	shlr2	r3
66	shlr2	r3
675:
68	dt	r3
69	mov.l	@r2+,r1   /*  16n+0 */
70	mov.l	r1,@r5
71	add	#4,r5
72	mov.l	@r2+,r1	  /*  16n+4 */
73	mov.l	r1,@r5
74	add	#4,r5
75	mov.l	@r2+,r1   /*  16n+8 */
76	mov.l	r1,@r5
77	add	#4,r5
78	mov.l	@r2+,r1   /*  16n+12 */
79	mov.l	r1,@r5
80	add	#4,r5
81	bf	5b
82
83	bra	0b
84	nop
856:
86#ifdef CONFIG_SH_STANDARD_BIOS
87	ldc   r7, vbr
88#endif
89	jmp @r6
90	nop
91
92	.align 2
9310:
94	.long	PAGE_SIZE
9511:
96	.long	0xa0000000
97
98relocate_new_kernel_end:
99
100	.globl relocate_new_kernel_size
101relocate_new_kernel_size:
102	.long relocate_new_kernel_end - relocate_new_kernel
103