/* * 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)