| /* | |
| * Startup glue code to uncompress the kernel | |
| * | |
| * (C) 2017 Helge Deller <deller@gmx.de> | |
| */ | |
| #include <linux/init.h> | |
| #include <linux/linkage.h> | |
| #include <asm/asm-offsets.h> | |
| #include <asm/page.h> | |
| #include <asm/psw.h> | |
| #include <asm/pdc.h> | |
| #include <asm/assembly.h> | |
| #include "sizes.h" | |
| #define BOOTADDR(x) (x) | |
| #ifndef CONFIG_64BIT | |
| .import $global$ /* forward declaration */ | |
| #endif /*!CONFIG_64BIT*/ | |
| __HEAD | |
| ENTRY(startup) | |
| .level PA_ASM_LEVEL | |
| #define PSW_W_SM 0x200 | |
| #define PSW_W_BIT 36 | |
| ;! nuke the W bit, saving original value | |
| .level 2.0 | |
| rsm PSW_W_SM, %r1 | |
| .level 1.1 | |
| extrw,u %r1, PSW_W_BIT-32, 1, %r1 | |
| copy %r1, %arg0 | |
| /* Make sure sr4-sr7 are set to zero for the kernel address space */ | |
| mtsp %r0,%sr4 | |
| mtsp %r0,%sr5 | |
| mtsp %r0,%sr6 | |
| mtsp %r0,%sr7 | |
| /* Clear BSS */ | |
| .import _bss,data | |
| .import _ebss,data | |
| load32 BOOTADDR(_bss),%r3 | |
| load32 BOOTADDR(_ebss),%r4 | |
| ldo FRAME_SIZE(%r4),%sp /* stack at end of bss */ | |
| $bss_loop: | |
| cmpb,<<,n %r3,%r4,$bss_loop | |
| stw,ma %r0,4(%r3) | |
| /* Initialize the global data pointer */ | |
| loadgp | |
| /* arg0..arg4 were set by palo. */ | |
| copy %arg1, %r6 /* command line */ | |
| copy %arg2, %r7 /* rd-start */ | |
| copy %arg3, %r8 /* rd-end */ | |
| load32 BOOTADDR(decompress_kernel),%r3 | |
| #ifdef CONFIG_64BIT | |
| .level PA_ASM_LEVEL | |
| ssm PSW_W_SM, %r0 /* set W-bit */ | |
| depdi 0, 31, 32, %r3 | |
| #endif | |
| load32 BOOTADDR(startup_continue), %r2 | |
| bv,n 0(%r3) | |
| startup_continue: | |
| #ifdef CONFIG_64BIT | |
| .level PA_ASM_LEVEL | |
| rsm PSW_W_SM, %r0 /* clear W-bit */ | |
| #endif | |
| load32 KERNEL_BINARY_TEXT_START, %arg0 /* free mem */ | |
| copy %r6, %arg1 /* command line */ | |
| copy %r7, %arg2 /* rd-start */ | |
| copy %r8, %arg3 /* rd-end */ | |
| bv,n 0(%ret0) | |
| END(startup) |