1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *  linux/arch/sh/boot/romimage/head.S
4  *
5  * Board specific setup code, executed before zImage loader
6  */
7 
8 .text
9 	#include <asm/page.h>
10 
11 	.global	romstart
12 romstart:
13 	/* include board specific setup code */
14 #include <mach/romimage.h>
15 
16 #ifdef CONFIG_ROMIMAGE_MMCIF
17 	/* load the romImage to above the empty zero page */
18 	mov.l	empty_zero_page_dst, r4
19 	mov.l	empty_zero_page_dst_adj, r5
20 	add	r5, r4
21 	mov.l	bytes_to_load, r5
22 	mov.l	loader_function, r7
23 	jsr	@r7
24 	 mov	r4, r15
25 
26 	mov.l	empty_zero_page_dst, r4
27 	mov.l	empty_zero_page_dst_adj, r5
28 	add	r5, r4
29 	mov.l	loaded_code_offs, r5
30 	add	r5, r4
31 	jmp	@r4
32 	 nop
33 
34 	.balign 4
35 empty_zero_page_dst_adj:
36 	.long	PAGE_SIZE
37 bytes_to_load:
38 	.long	end_data - romstart
39 loader_function:
40 	.long	mmcif_loader
41 loaded_code_offs:
42 	.long	loaded_code - romstart
43 loaded_code:
44 #endif /* CONFIG_ROMIMAGE_MMCIF */
45 
46 	/* copy the empty_zero_page contents to where vmlinux expects it */
47 	mova	extra_data_pos, r0
48 	mov.l	extra_data_size, r1
49 	add	r1, r0
50 	mov.l	empty_zero_page_dst, r1
51 	mov	#(PAGE_SHIFT - 4), r4
52 	mov	#1, r3
53 	shld	r4, r3 /* r3 = PAGE_SIZE / 16 */
54 
55 1:
56 	mov.l	@r0, r4
57 	mov.l	@(4, r0), r5
58 	mov.l	@(8, r0), r6
59 	mov.l	@(12, r0), r7
60 	add	#16,r0
61 	mov.l	r4, @r1
62 	mov.l	r5, @(4, r1)
63 	mov.l	r6, @(8, r1)
64 	mov.l	r7, @(12, r1)
65 	dt	r3
66 	add	#16,r1
67 	bf	1b
68 
69 	/* jump to the zImage entry point located after the zero page data */
70 	mov	#PAGE_SHIFT, r4
71 	mov	#1, r1
72 	shld	r4, r1
73 	mova	extra_data_pos, r0
74 	add	r1, r0
75 	mov.l	extra_data_size, r1
76 	add	r1, r0
77 	jmp	@r0
78 	 nop
79 
80 	.align 2
81 empty_zero_page_dst:
82 	.long	_text
83 extra_data_pos:
84 extra_data_size:
85 	.long	zero_page_pos - extra_data_pos
86