xref: /linux-6.15/arch/sh/kernel/relocate_kernel.S (revision e4e063d0)
1/*
2 * relocate_kernel.S - put the kernel image in place to boot
3 * 2005.9.17 [email protected]
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
15relocate_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 */
280:
29	mov.l	@r4+,r0	  /* cmd = *ind++ */
30
311:	/* 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
422:	/* else if(cmd & IND_INDIRECTION) ind = addr  */
43	tst	#2,r0
44	bt	3f
45	bra	0b
46	mov	r2,r4
47
483:	/* else if(cmd & IND_DONE) goto 6  */
49	tst	#4,r0
50	bt	4f
51	bra	6f
52	nop
53
544:	/* 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
615:
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
796:
80	jmp @r6
81	nop
82
83	.align 2
8410:
85	.long	PAGE_SIZE
86
87relocate_new_kernel_end:
88
89	.globl relocate_new_kernel_size
90relocate_new_kernel_size:
91	.long relocate_new_kernel_end - relocate_new_kernel
92