162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Startup glue code to uncompress the kernel 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * (C) 2017 Helge Deller <deller@gmx.de> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/init.h> 862306a36Sopenharmony_ci#include <linux/linkage.h> 962306a36Sopenharmony_ci#include <asm/asm-offsets.h> 1062306a36Sopenharmony_ci#include <asm/page.h> 1162306a36Sopenharmony_ci#include <asm/psw.h> 1262306a36Sopenharmony_ci#include <asm/pdc.h> 1362306a36Sopenharmony_ci#include <asm/assembly.h> 1462306a36Sopenharmony_ci#include "sizes.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define BOOTADDR(x) (x) 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef CONFIG_64BIT 1962306a36Sopenharmony_ci .import $global$ /* forward declaration */ 2062306a36Sopenharmony_ci#endif /*!CONFIG_64BIT*/ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci __HEAD 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ciENTRY(startup) 2562306a36Sopenharmony_ci .level PA_ASM_LEVEL 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define PSW_W_SM 0x200 2862306a36Sopenharmony_ci#define PSW_W_BIT 36 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci ;! nuke the W bit, saving original value 3162306a36Sopenharmony_ci .level 2.0 3262306a36Sopenharmony_ci rsm PSW_W_SM, %r1 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci .level 1.1 3562306a36Sopenharmony_ci extrw,u %r1, PSW_W_BIT-32, 1, %r1 3662306a36Sopenharmony_ci copy %r1, %arg0 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci /* Make sure sr4-sr7 are set to zero for the kernel address space */ 3962306a36Sopenharmony_ci mtsp %r0,%sr4 4062306a36Sopenharmony_ci mtsp %r0,%sr5 4162306a36Sopenharmony_ci mtsp %r0,%sr6 4262306a36Sopenharmony_ci mtsp %r0,%sr7 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci /* Clear BSS */ 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci .import _bss,data 4762306a36Sopenharmony_ci .import _ebss,data 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci load32 BOOTADDR(_bss),%r3 5062306a36Sopenharmony_ci load32 BOOTADDR(_ebss),%r4 5162306a36Sopenharmony_ci ldo FRAME_SIZE(%r4),%sp /* stack at end of bss */ 5262306a36Sopenharmony_ci$bss_loop: 5362306a36Sopenharmony_ci cmpb,<<,n %r3,%r4,$bss_loop 5462306a36Sopenharmony_ci stw,ma %r0,4(%r3) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci /* Initialize the global data pointer */ 5762306a36Sopenharmony_ci loadgp 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci /* arg0..arg4 were set by palo. */ 6062306a36Sopenharmony_ci copy %arg1, %r6 /* command line */ 6162306a36Sopenharmony_ci copy %arg2, %r7 /* rd-start */ 6262306a36Sopenharmony_ci copy %arg3, %r8 /* rd-end */ 6362306a36Sopenharmony_ci load32 BOOTADDR(decompress_kernel),%r3 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#ifdef CONFIG_64BIT 6662306a36Sopenharmony_ci .level PA_ASM_LEVEL 6762306a36Sopenharmony_ci ssm PSW_W_SM, %r0 /* set W-bit */ 6862306a36Sopenharmony_ci depdi 0, 31, 32, %r3 6962306a36Sopenharmony_ci#endif 7062306a36Sopenharmony_ci load32 BOOTADDR(startup_continue), %r2 7162306a36Sopenharmony_ci bv,n 0(%r3) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistartup_continue: 7462306a36Sopenharmony_ci#ifdef CONFIG_64BIT 7562306a36Sopenharmony_ci .level PA_ASM_LEVEL 7662306a36Sopenharmony_ci rsm PSW_W_SM, %r0 /* clear W-bit */ 7762306a36Sopenharmony_ci#endif 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci load32 KERNEL_BINARY_TEXT_START, %arg0 /* free mem */ 8062306a36Sopenharmony_ci copy %r6, %arg1 /* command line */ 8162306a36Sopenharmony_ci copy %r7, %arg2 /* rd-start */ 8262306a36Sopenharmony_ci copy %r8, %arg3 /* rd-end */ 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci bv,n 0(%ret0) 8562306a36Sopenharmony_ciEND(startup) 86