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 
24 ENTRY(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 
73 startup_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)
85 END(startup)
86