162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/sh/boot/compressed/head.S
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 1999 Stuart Menefy
662306a36Sopenharmony_ci *  Copyright (C) 2003 SUGIOKA Toshinobu
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci.text
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <asm/page.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci	.global	startup
1462306a36Sopenharmony_cistartup:
1562306a36Sopenharmony_ci	/* Load initial status register */
1662306a36Sopenharmony_ci	mov.l   init_sr, r1
1762306a36Sopenharmony_ci	ldc     r1, sr
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	/* Move myself to proper location if necessary */
2062306a36Sopenharmony_ci	mova	1f, r0
2162306a36Sopenharmony_ci	mov.l	1f, r2
2262306a36Sopenharmony_ci	cmp/eq	r2, r0
2362306a36Sopenharmony_ci	bt	clear_bss
2462306a36Sopenharmony_ci	sub	r0, r2
2562306a36Sopenharmony_ci	mov.l	bss_start_addr, r0
2662306a36Sopenharmony_ci	mov	#0xffffffe0, r1
2762306a36Sopenharmony_ci	and	r1, r0			! align cache line
2862306a36Sopenharmony_ci	mov.l	text_start_addr, r3
2962306a36Sopenharmony_ci	mov	r0, r1
3062306a36Sopenharmony_ci	sub	r2, r1
3162306a36Sopenharmony_ci3:
3262306a36Sopenharmony_ci	mov.l	@r1, r4
3362306a36Sopenharmony_ci	mov.l	@(4,r1), r5
3462306a36Sopenharmony_ci	mov.l	@(8,r1), r6
3562306a36Sopenharmony_ci	mov.l	@(12,r1), r7
3662306a36Sopenharmony_ci	mov.l	@(16,r1), r8
3762306a36Sopenharmony_ci	mov.l	@(20,r1), r9
3862306a36Sopenharmony_ci	mov.l	@(24,r1), r10
3962306a36Sopenharmony_ci	mov.l	@(28,r1), r11
4062306a36Sopenharmony_ci	mov.l	r4, @r0
4162306a36Sopenharmony_ci	mov.l	r5, @(4,r0)
4262306a36Sopenharmony_ci	mov.l	r6, @(8,r0)
4362306a36Sopenharmony_ci	mov.l	r7, @(12,r0)
4462306a36Sopenharmony_ci	mov.l	r8, @(16,r0)
4562306a36Sopenharmony_ci	mov.l	r9, @(20,r0)
4662306a36Sopenharmony_ci	mov.l	r10, @(24,r0)
4762306a36Sopenharmony_ci	mov.l	r11, @(28,r0)
4862306a36Sopenharmony_ci#ifdef CONFIG_CPU_SH4
4962306a36Sopenharmony_ci	ocbwb	@r0
5062306a36Sopenharmony_ci#endif
5162306a36Sopenharmony_ci	cmp/hi	r3, r0
5262306a36Sopenharmony_ci	add	#-32, r0
5362306a36Sopenharmony_ci	bt/s	3b
5462306a36Sopenharmony_ci	 add	#-32, r1
5562306a36Sopenharmony_ci	mov.l	2f, r0
5662306a36Sopenharmony_ci	jmp	@r0
5762306a36Sopenharmony_ci	 nop
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	.align 2
6062306a36Sopenharmony_ci1:	.long	1b
6162306a36Sopenharmony_ci2:	.long	clear_bss
6262306a36Sopenharmony_citext_start_addr:
6362306a36Sopenharmony_ci	.long	startup
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	/* Clear BSS */
6662306a36Sopenharmony_ciclear_bss:
6762306a36Sopenharmony_ci	mov.l	end_addr, r1
6862306a36Sopenharmony_ci	mov.l	bss_start_addr, r2
6962306a36Sopenharmony_ci	mov	#0, r0
7062306a36Sopenharmony_cil1:
7162306a36Sopenharmony_ci	mov.l	r0, @-r1
7262306a36Sopenharmony_ci	cmp/eq	r1,r2
7362306a36Sopenharmony_ci	bf	l1
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	/* Set the initial pointer. */
7662306a36Sopenharmony_ci	mov.l	init_stack_addr, r0
7762306a36Sopenharmony_ci	mov.l	@r0, r15
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	/* Decompress the kernel */
8062306a36Sopenharmony_ci	mov.l	decompress_kernel_addr, r0
8162306a36Sopenharmony_ci	jsr	@r0
8262306a36Sopenharmony_ci	nop
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	/* Jump to the start of the decompressed kernel */
8562306a36Sopenharmony_ci	mov.l	kernel_start_addr, r0
8662306a36Sopenharmony_ci	jmp	@r0
8762306a36Sopenharmony_ci	nop
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	.align	2
9062306a36Sopenharmony_cibss_start_addr:
9162306a36Sopenharmony_ci	.long	__bss_start
9262306a36Sopenharmony_ciend_addr:
9362306a36Sopenharmony_ci	.long	_end
9462306a36Sopenharmony_ciinit_sr:
9562306a36Sopenharmony_ci	.long	0x500000F0	/* Privileged mode, Bank=0, Block=1, IMASK=0xF */
9662306a36Sopenharmony_cikexec_magic:
9762306a36Sopenharmony_ci	.long	0x400000F0	/* magic used by kexec to parse zImage format */
9862306a36Sopenharmony_ciinit_stack_addr:
9962306a36Sopenharmony_ci	.long	stack_start
10062306a36Sopenharmony_cidecompress_kernel_addr:
10162306a36Sopenharmony_ci	.long	decompress_kernel
10262306a36Sopenharmony_cikernel_start_addr:
10362306a36Sopenharmony_ci#ifdef CONFIG_32BIT
10462306a36Sopenharmony_ci	.long	___pa(_text+PAGE_SIZE)
10562306a36Sopenharmony_ci#else
10662306a36Sopenharmony_ci	.long	_text+PAGE_SIZE
10762306a36Sopenharmony_ci#endif
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	.align	9
11062306a36Sopenharmony_cifake_headers_as_bzImage:
11162306a36Sopenharmony_ci	.word	0
11262306a36Sopenharmony_ci	.ascii	"HdrS"		! header signature
11362306a36Sopenharmony_ci	.word	0x0202		! header version number (>= 0x0105)
11462306a36Sopenharmony_ci				! or else old loadlin-1.5 will fail)
11562306a36Sopenharmony_ci	.word	0		! default_switch
11662306a36Sopenharmony_ci	.word	0		! SETUPSEG
11762306a36Sopenharmony_ci	.word	0x1000
11862306a36Sopenharmony_ci	.word	0		! pointing to kernel version string
11962306a36Sopenharmony_ci	.byte	0		! = 0, old one (LILO, Loadlin,
12062306a36Sopenharmony_ci				! 0xTV: T=0 for LILO
12162306a36Sopenharmony_ci				!       V = version
12262306a36Sopenharmony_ci	.byte	1		! Load flags bzImage=1
12362306a36Sopenharmony_ci	.word	0x8000		! size to move, when setup is not
12462306a36Sopenharmony_ci	.long	0x100000	! 0x100000 = default for big kernel
12562306a36Sopenharmony_ci	.long	0		! address of loaded ramdisk image
12662306a36Sopenharmony_ci	.long	0		# its size in bytes
127