1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *  linux/arch/sh/boot/compressed/head.S
4  *
5  *  Copyright (C) 1999 Stuart Menefy
6  *  Copyright (C) 2003 SUGIOKA Toshinobu
7  */
8 
9 .text
10 
11 #include <asm/page.h>
12 
13 	.global	startup
14 startup:
15 	/* Load initial status register */
16 	mov.l   init_sr, r1
17 	ldc     r1, sr
18 
19 	/* Move myself to proper location if necessary */
20 	mova	1f, r0
21 	mov.l	1f, r2
22 	cmp/eq	r2, r0
23 	bt	clear_bss
24 	sub	r0, r2
25 	mov.l	bss_start_addr, r0
26 	mov	#0xffffffe0, r1
27 	and	r1, r0			! align cache line
28 	mov.l	text_start_addr, r3
29 	mov	r0, r1
30 	sub	r2, r1
31 3:
32 	mov.l	@r1, r4
33 	mov.l	@(4,r1), r5
34 	mov.l	@(8,r1), r6
35 	mov.l	@(12,r1), r7
36 	mov.l	@(16,r1), r8
37 	mov.l	@(20,r1), r9
38 	mov.l	@(24,r1), r10
39 	mov.l	@(28,r1), r11
40 	mov.l	r4, @r0
41 	mov.l	r5, @(4,r0)
42 	mov.l	r6, @(8,r0)
43 	mov.l	r7, @(12,r0)
44 	mov.l	r8, @(16,r0)
45 	mov.l	r9, @(20,r0)
46 	mov.l	r10, @(24,r0)
47 	mov.l	r11, @(28,r0)
48 #ifdef CONFIG_CPU_SH4
49 	ocbwb	@r0
50 #endif
51 	cmp/hi	r3, r0
52 	add	#-32, r0
53 	bt/s	3b
54 	 add	#-32, r1
55 	mov.l	2f, r0
56 	jmp	@r0
57 	 nop
58 
59 	.align 2
60 1:	.long	1b
61 2:	.long	clear_bss
62 text_start_addr:
63 	.long	startup
64 
65 	/* Clear BSS */
66 clear_bss:
67 	mov.l	end_addr, r1
68 	mov.l	bss_start_addr, r2
69 	mov	#0, r0
70 l1:
71 	mov.l	r0, @-r1
72 	cmp/eq	r1,r2
73 	bf	l1
74 
75 	/* Set the initial pointer. */
76 	mov.l	init_stack_addr, r0
77 	mov.l	@r0, r15
78 
79 	/* Decompress the kernel */
80 	mov.l	decompress_kernel_addr, r0
81 	jsr	@r0
82 	nop
83 
84 	/* Jump to the start of the decompressed kernel */
85 	mov.l	kernel_start_addr, r0
86 	jmp	@r0
87 	nop
88 
89 	.align	2
90 bss_start_addr:
91 	.long	__bss_start
92 end_addr:
93 	.long	_end
94 init_sr:
95 	.long	0x500000F0	/* Privileged mode, Bank=0, Block=1, IMASK=0xF */
96 kexec_magic:
97 	.long	0x400000F0	/* magic used by kexec to parse zImage format */
98 init_stack_addr:
99 	.long	stack_start
100 decompress_kernel_addr:
101 	.long	decompress_kernel
102 kernel_start_addr:
103 #ifdef CONFIG_32BIT
104 	.long	___pa(_text+PAGE_SIZE)
105 #else
106 	.long	_text+PAGE_SIZE
107 #endif
108 
109 	.align	9
110 fake_headers_as_bzImage:
111 	.word	0
112 	.ascii	"HdrS"		! header signature
113 	.word	0x0202		! header version number (>= 0x0105)
114 				! or else old loadlin-1.5 will fail)
115 	.word	0		! default_switch
116 	.word	0		! SETUPSEG
117 	.word	0x1000
118 	.word	0		! pointing to kernel version string
119 	.byte	0		! = 0, old one (LILO, Loadlin,
120 				! 0xTV: T=0 for LILO
121 				!       V = version
122 	.byte	1		! Load flags bzImage=1
123 	.word	0x8000		! size to move, when setup is not
124 	.long	0x100000	! 0x100000 = default for big kernel
125 	.long	0		! address of loaded ramdisk image
126 	.long	0		# its size in bytes
127