18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Startup glue code to uncompress the kernel 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * (C) 2017 Helge Deller <deller@gmx.de> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/init.h> 88c2ecf20Sopenharmony_ci#include <linux/linkage.h> 98c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h> 108c2ecf20Sopenharmony_ci#include <asm/page.h> 118c2ecf20Sopenharmony_ci#include <asm/psw.h> 128c2ecf20Sopenharmony_ci#include <asm/pdc.h> 138c2ecf20Sopenharmony_ci#include <asm/assembly.h> 148c2ecf20Sopenharmony_ci#include "sizes.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define BOOTADDR(x) (x) 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#ifndef CONFIG_64BIT 198c2ecf20Sopenharmony_ci .import $global$ /* forward declaration */ 208c2ecf20Sopenharmony_ci#endif /*!CONFIG_64BIT*/ 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci __HEAD 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ciENTRY(startup) 258c2ecf20Sopenharmony_ci .level PA_ASM_LEVEL 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define PSW_W_SM 0x200 288c2ecf20Sopenharmony_ci#define PSW_W_BIT 36 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci ;! nuke the W bit, saving original value 318c2ecf20Sopenharmony_ci .level 2.0 328c2ecf20Sopenharmony_ci rsm PSW_W_SM, %r1 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci .level 1.1 358c2ecf20Sopenharmony_ci extrw,u %r1, PSW_W_BIT-32, 1, %r1 368c2ecf20Sopenharmony_ci copy %r1, %arg0 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci /* Make sure sr4-sr7 are set to zero for the kernel address space */ 398c2ecf20Sopenharmony_ci mtsp %r0,%sr4 408c2ecf20Sopenharmony_ci mtsp %r0,%sr5 418c2ecf20Sopenharmony_ci mtsp %r0,%sr6 428c2ecf20Sopenharmony_ci mtsp %r0,%sr7 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci /* Clear BSS */ 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci .import _bss,data 478c2ecf20Sopenharmony_ci .import _ebss,data 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci load32 BOOTADDR(_bss),%r3 508c2ecf20Sopenharmony_ci load32 BOOTADDR(_ebss),%r4 518c2ecf20Sopenharmony_ci ldo FRAME_SIZE(%r4),%sp /* stack at end of bss */ 528c2ecf20Sopenharmony_ci$bss_loop: 538c2ecf20Sopenharmony_ci cmpb,<<,n %r3,%r4,$bss_loop 548c2ecf20Sopenharmony_ci stw,ma %r0,4(%r3) 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci /* Initialize the global data pointer */ 578c2ecf20Sopenharmony_ci loadgp 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci /* arg0..arg4 were set by palo. */ 608c2ecf20Sopenharmony_ci copy %arg1, %r6 /* command line */ 618c2ecf20Sopenharmony_ci copy %arg2, %r7 /* rd-start */ 628c2ecf20Sopenharmony_ci copy %arg3, %r8 /* rd-end */ 638c2ecf20Sopenharmony_ci load32 BOOTADDR(decompress_kernel),%r3 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT 668c2ecf20Sopenharmony_ci .level PA_ASM_LEVEL 678c2ecf20Sopenharmony_ci ssm PSW_W_SM, %r0 /* set W-bit */ 688c2ecf20Sopenharmony_ci depdi 0, 31, 32, %r3 698c2ecf20Sopenharmony_ci#endif 708c2ecf20Sopenharmony_ci load32 BOOTADDR(startup_continue), %r2 718c2ecf20Sopenharmony_ci bv,n 0(%r3) 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_cistartup_continue: 748c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT 758c2ecf20Sopenharmony_ci .level PA_ASM_LEVEL 768c2ecf20Sopenharmony_ci rsm PSW_W_SM, %r0 /* clear W-bit */ 778c2ecf20Sopenharmony_ci#endif 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci load32 KERNEL_BINARY_TEXT_START, %arg0 /* free mem */ 808c2ecf20Sopenharmony_ci copy %r6, %arg1 /* command line */ 818c2ecf20Sopenharmony_ci copy %r7, %arg2 /* rd-start */ 828c2ecf20Sopenharmony_ci copy %r8, %arg3 /* rd-end */ 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci bv,n 0(%ret0) 858c2ecf20Sopenharmony_ciEND(startup) 86