mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.7 KiB
85 lines
1.7 KiB
/* |
|
* 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)
|
|
|