86 lines
1.7 KiB
ArmAsm
86 lines
1.7 KiB
ArmAsm
|
/*
|
||
|
* 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)
|