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 | |