^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Startup glue code to uncompress the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * (C) 2017 Helge Deller <deller@gmx.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/asm-offsets.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/psw.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/pdc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/assembly.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "sizes.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define BOOTADDR(x) (x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #ifndef CONFIG_64BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .import $global$ /* forward declaration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #endif /*!CONFIG_64BIT*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) __HEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ENTRY(startup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) .level PA_ASM_LEVEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define PSW_W_SM 0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define PSW_W_BIT 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ;! nuke the W bit, saving original value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .level 2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) rsm PSW_W_SM, %r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .level 1.1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) extrw,u %r1, PSW_W_BIT-32, 1, %r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) copy %r1, %arg0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* Make sure sr4-sr7 are set to zero for the kernel address space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) mtsp %r0,%sr4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) mtsp %r0,%sr5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) mtsp %r0,%sr6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) mtsp %r0,%sr7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* Clear BSS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .import _bss,data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .import _ebss,data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) load32 BOOTADDR(_bss),%r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) load32 BOOTADDR(_ebss),%r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ldo FRAME_SIZE(%r4),%sp /* stack at end of bss */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) $bss_loop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) cmpb,<<,n %r3,%r4,$bss_loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) stw,ma %r0,4(%r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* Initialize the global data pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) loadgp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* arg0..arg4 were set by palo. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) copy %arg1, %r6 /* command line */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) copy %arg2, %r7 /* rd-start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) copy %arg3, %r8 /* rd-end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) load32 BOOTADDR(decompress_kernel),%r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #ifdef CONFIG_64BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .level PA_ASM_LEVEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) ssm PSW_W_SM, %r0 /* set W-bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) depdi 0, 31, 32, %r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) load32 BOOTADDR(startup_continue), %r2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) bv,n 0(%r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) startup_continue:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #ifdef CONFIG_64BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .level PA_ASM_LEVEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) rsm PSW_W_SM, %r0 /* clear W-bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) load32 KERNEL_BINARY_TEXT_START, %arg0 /* free mem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) copy %r6, %arg1 /* command line */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) copy %r7, %arg2 /* rd-start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) copy %r8, %arg3 /* rd-end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) bv,n 0(%ret0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) END(startup)