Merge tag 'mips_5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
[sfrench/cifs-2.6.git] / arch / parisc / boot / compressed / head.S
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)