162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Startup glue code to uncompress the kernel
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci *   (C) 2017 Helge Deller <deller@gmx.de>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/init.h>
862306a36Sopenharmony_ci#include <linux/linkage.h>
962306a36Sopenharmony_ci#include <asm/asm-offsets.h>
1062306a36Sopenharmony_ci#include <asm/page.h>
1162306a36Sopenharmony_ci#include <asm/psw.h>
1262306a36Sopenharmony_ci#include <asm/pdc.h>
1362306a36Sopenharmony_ci#include <asm/assembly.h>
1462306a36Sopenharmony_ci#include "sizes.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define BOOTADDR(x)	(x)
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#ifndef CONFIG_64BIT
1962306a36Sopenharmony_ci	.import	$global$		/* forward declaration */
2062306a36Sopenharmony_ci#endif /*!CONFIG_64BIT*/
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	__HEAD
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciENTRY(startup)
2562306a36Sopenharmony_ci	 .level PA_ASM_LEVEL
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define PSW_W_SM	0x200
2862306a36Sopenharmony_ci#define PSW_W_BIT       36
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	;! nuke the W bit, saving original value
3162306a36Sopenharmony_ci	.level 2.0
3262306a36Sopenharmony_ci	rsm	PSW_W_SM, %r1
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	.level 1.1
3562306a36Sopenharmony_ci	extrw,u	%r1, PSW_W_BIT-32, 1, %r1
3662306a36Sopenharmony_ci	copy	%r1, %arg0
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	/* Make sure sr4-sr7 are set to zero for the kernel address space */
3962306a36Sopenharmony_ci	mtsp    %r0,%sr4
4062306a36Sopenharmony_ci	mtsp    %r0,%sr5
4162306a36Sopenharmony_ci	mtsp    %r0,%sr6
4262306a36Sopenharmony_ci	mtsp    %r0,%sr7
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	/* Clear BSS */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	.import _bss,data
4762306a36Sopenharmony_ci	.import _ebss,data
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	load32	BOOTADDR(_bss),%r3
5062306a36Sopenharmony_ci	load32	BOOTADDR(_ebss),%r4
5162306a36Sopenharmony_ci	ldo	FRAME_SIZE(%r4),%sp	/* stack at end of bss */
5262306a36Sopenharmony_ci$bss_loop:
5362306a36Sopenharmony_ci	cmpb,<<,n %r3,%r4,$bss_loop
5462306a36Sopenharmony_ci	stw,ma	%r0,4(%r3)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	/* Initialize the global data pointer */
5762306a36Sopenharmony_ci	loadgp
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	/* arg0..arg4 were set by palo. */
6062306a36Sopenharmony_ci	copy	%arg1, %r6		/* command line */
6162306a36Sopenharmony_ci	copy	%arg2, %r7		/* rd-start */
6262306a36Sopenharmony_ci	copy	%arg3, %r8		/* rd-end */
6362306a36Sopenharmony_ci	load32	BOOTADDR(decompress_kernel),%r3
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#ifdef CONFIG_64BIT
6662306a36Sopenharmony_ci	.level PA_ASM_LEVEL
6762306a36Sopenharmony_ci	ssm	PSW_W_SM, %r0		/* set W-bit */
6862306a36Sopenharmony_ci	depdi	0, 31, 32, %r3
6962306a36Sopenharmony_ci#endif
7062306a36Sopenharmony_ci	load32	BOOTADDR(startup_continue), %r2
7162306a36Sopenharmony_ci	bv,n	0(%r3)
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cistartup_continue:
7462306a36Sopenharmony_ci#ifdef CONFIG_64BIT
7562306a36Sopenharmony_ci	.level PA_ASM_LEVEL
7662306a36Sopenharmony_ci	rsm	PSW_W_SM, %r0		/* clear W-bit */
7762306a36Sopenharmony_ci#endif
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	load32	KERNEL_BINARY_TEXT_START, %arg0 /* free mem */
8062306a36Sopenharmony_ci	copy	%r6, %arg1		/* command line */
8162306a36Sopenharmony_ci	copy	%r7, %arg2		/* rd-start */
8262306a36Sopenharmony_ci	copy	%r8, %arg3		/* rd-end */
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	bv,n	0(%ret0)
8562306a36Sopenharmony_ciEND(startup)
86