12f3c7b81SHelge Deller/* 22f3c7b81SHelge Deller * Startup glue code to uncompress the kernel 32f3c7b81SHelge Deller * 42f3c7b81SHelge Deller * (C) 2017 Helge Deller <deller@gmx.de> 52f3c7b81SHelge Deller */ 62f3c7b81SHelge Deller 72f3c7b81SHelge Deller#include <linux/init.h> 82f3c7b81SHelge Deller#include <linux/linkage.h> 92f3c7b81SHelge Deller#include <asm/asm-offsets.h> 102f3c7b81SHelge Deller#include <asm/page.h> 112f3c7b81SHelge Deller#include <asm/psw.h> 122f3c7b81SHelge Deller#include <asm/pdc.h> 132f3c7b81SHelge Deller#include <asm/assembly.h> 142f3c7b81SHelge Deller#include "sizes.h" 152f3c7b81SHelge Deller 162f3c7b81SHelge Deller#define BOOTADDR(x) (x) 172f3c7b81SHelge Deller 182f3c7b81SHelge Deller#ifndef CONFIG_64BIT 192f3c7b81SHelge Deller .import $global$ /* forward declaration */ 202f3c7b81SHelge Deller#endif /*!CONFIG_64BIT*/ 212f3c7b81SHelge Deller 222f3c7b81SHelge Deller __HEAD 232f3c7b81SHelge Deller 242f3c7b81SHelge DellerENTRY(startup) 25*bdca5d64SHelge Deller .level PA_ASM_LEVEL 262f3c7b81SHelge Deller 272f3c7b81SHelge Deller#define PSW_W_SM 0x200 282f3c7b81SHelge Deller#define PSW_W_BIT 36 292f3c7b81SHelge Deller 302f3c7b81SHelge Deller ;! nuke the W bit, saving original value 312f3c7b81SHelge Deller .level 2.0 322f3c7b81SHelge Deller rsm PSW_W_SM, %r1 332f3c7b81SHelge Deller 342f3c7b81SHelge Deller .level 1.1 352f3c7b81SHelge Deller extrw,u %r1, PSW_W_BIT-32, 1, %r1 362f3c7b81SHelge Deller copy %r1, %arg0 372f3c7b81SHelge Deller 382f3c7b81SHelge Deller /* Make sure sr4-sr7 are set to zero for the kernel address space */ 392f3c7b81SHelge Deller mtsp %r0,%sr4 402f3c7b81SHelge Deller mtsp %r0,%sr5 412f3c7b81SHelge Deller mtsp %r0,%sr6 422f3c7b81SHelge Deller mtsp %r0,%sr7 432f3c7b81SHelge Deller 442f3c7b81SHelge Deller /* Clear BSS */ 452f3c7b81SHelge Deller 462f3c7b81SHelge Deller .import _bss,data 472f3c7b81SHelge Deller .import _ebss,data 482f3c7b81SHelge Deller 492f3c7b81SHelge Deller load32 BOOTADDR(_bss),%r3 502f3c7b81SHelge Deller load32 BOOTADDR(_ebss),%r4 512f3c7b81SHelge Deller ldo FRAME_SIZE(%r4),%sp /* stack at end of bss */ 522f3c7b81SHelge Deller$bss_loop: 532f3c7b81SHelge Deller cmpb,<<,n %r3,%r4,$bss_loop 542f3c7b81SHelge Deller stw,ma %r0,4(%r3) 552f3c7b81SHelge Deller 562f3c7b81SHelge Deller /* Initialize the global data pointer */ 572f3c7b81SHelge Deller loadgp 582f3c7b81SHelge Deller 592f3c7b81SHelge Deller /* arg0..arg4 were set by palo. */ 602f3c7b81SHelge Deller copy %arg1, %r6 /* command line */ 612f3c7b81SHelge Deller copy %arg2, %r7 /* rd-start */ 622f3c7b81SHelge Deller copy %arg3, %r8 /* rd-end */ 632f3c7b81SHelge Deller load32 BOOTADDR(decompress_kernel),%r3 642f3c7b81SHelge Deller 652f3c7b81SHelge Deller#ifdef CONFIG_64BIT 66*bdca5d64SHelge Deller .level PA_ASM_LEVEL 672f3c7b81SHelge Deller ssm PSW_W_SM, %r0 /* set W-bit */ 682f3c7b81SHelge Deller depdi 0, 31, 32, %r3 692f3c7b81SHelge Deller#endif 702f3c7b81SHelge Deller load32 BOOTADDR(startup_continue), %r2 712f3c7b81SHelge Deller bv,n 0(%r3) 722f3c7b81SHelge Deller 732f3c7b81SHelge Dellerstartup_continue: 742f3c7b81SHelge Deller#ifdef CONFIG_64BIT 75*bdca5d64SHelge Deller .level PA_ASM_LEVEL 762f3c7b81SHelge Deller rsm PSW_W_SM, %r0 /* clear W-bit */ 772f3c7b81SHelge Deller#endif 782f3c7b81SHelge Deller 792f3c7b81SHelge Deller load32 KERNEL_BINARY_TEXT_START, %arg0 /* free mem */ 802f3c7b81SHelge Deller copy %r6, %arg1 /* command line */ 812f3c7b81SHelge Deller copy %r7, %arg2 /* rd-start */ 822f3c7b81SHelge Deller copy %r8, %arg3 /* rd-end */ 832f3c7b81SHelge Deller 842f3c7b81SHelge Deller bv,n 0(%ret0) 852f3c7b81SHelge DellerEND(startup) 86