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