1/*
2 * Startup glue code to uncompress the kernel
3 *
4 *   (C) 2017 Helge Deller <deller@gmx.de>
5 */
6
7#include <linux/init.h>
8#include <linux/linkage.h>
9#include <asm/asm-offsets.h>
10#include <asm/page.h>
11#include <asm/psw.h>
12#include <asm/pdc.h>
13#include <asm/assembly.h>
14#include "sizes.h"
15
16#define BOOTADDR(x)	(x)
17
18#ifndef CONFIG_64BIT
19	.import	$global$		/* forward declaration */
20#endif /*!CONFIG_64BIT*/
21
22	__HEAD
23
24ENTRY(startup)
25	 .level PA_ASM_LEVEL
26
27#define PSW_W_SM	0x200
28#define PSW_W_BIT       36
29
30	;! nuke the W bit, saving original value
31	.level 2.0
32	rsm	PSW_W_SM, %r1
33
34	.level 1.1
35	extrw,u	%r1, PSW_W_BIT-32, 1, %r1
36	copy	%r1, %arg0
37
38	/* Make sure sr4-sr7 are set to zero for the kernel address space */
39	mtsp    %r0,%sr4
40	mtsp    %r0,%sr5
41	mtsp    %r0,%sr6
42	mtsp    %r0,%sr7
43
44	/* Clear BSS */
45
46	.import _bss,data
47	.import _ebss,data
48
49	load32	BOOTADDR(_bss),%r3
50	load32	BOOTADDR(_ebss),%r4
51	ldo	FRAME_SIZE(%r4),%sp	/* stack at end of bss */
52$bss_loop:
53	cmpb,<<,n %r3,%r4,$bss_loop
54	stw,ma	%r0,4(%r3)
55
56	/* Initialize the global data pointer */
57	loadgp
58
59	/* arg0..arg4 were set by palo. */
60	copy	%arg1, %r6		/* command line */
61	copy	%arg2, %r7		/* rd-start */
62	copy	%arg3, %r8		/* rd-end */
63	load32	BOOTADDR(decompress_kernel),%r3
64
65#ifdef CONFIG_64BIT
66	.level PA_ASM_LEVEL
67	ssm	PSW_W_SM, %r0		/* set W-bit */
68	depdi	0, 31, 32, %r3
69#endif
70	load32	BOOTADDR(startup_continue), %r2
71	bv,n	0(%r3)
72
73startup_continue:
74#ifdef CONFIG_64BIT
75	.level PA_ASM_LEVEL
76	rsm	PSW_W_SM, %r0		/* clear W-bit */
77#endif
78
79	load32	KERNEL_BINARY_TEXT_START, %arg0 /* free mem */
80	copy	%r6, %arg1		/* command line */
81	copy	%r7, %arg2		/* rd-start */
82	copy	%r8, %arg3		/* rd-end */
83
84	bv,n	0(%ret0)
85END(startup)
86