1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * linux/arch/sh/boot/compressed/head.S 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 1999 Stuart Menefy 6*4882a593Smuzhiyun * Copyright (C) 2003 SUGIOKA Toshinobu 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun.text 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun#include <asm/page.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun .global startup 14*4882a593Smuzhiyunstartup: 15*4882a593Smuzhiyun /* Load initial status register */ 16*4882a593Smuzhiyun mov.l init_sr, r1 17*4882a593Smuzhiyun ldc r1, sr 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* Move myself to proper location if necessary */ 20*4882a593Smuzhiyun mova 1f, r0 21*4882a593Smuzhiyun mov.l 1f, r2 22*4882a593Smuzhiyun cmp/eq r2, r0 23*4882a593Smuzhiyun bt clear_bss 24*4882a593Smuzhiyun sub r0, r2 25*4882a593Smuzhiyun mov.l bss_start_addr, r0 26*4882a593Smuzhiyun mov #0xffffffe0, r1 27*4882a593Smuzhiyun and r1, r0 ! align cache line 28*4882a593Smuzhiyun mov.l text_start_addr, r3 29*4882a593Smuzhiyun mov r0, r1 30*4882a593Smuzhiyun sub r2, r1 31*4882a593Smuzhiyun3: 32*4882a593Smuzhiyun mov.l @r1, r4 33*4882a593Smuzhiyun mov.l @(4,r1), r5 34*4882a593Smuzhiyun mov.l @(8,r1), r6 35*4882a593Smuzhiyun mov.l @(12,r1), r7 36*4882a593Smuzhiyun mov.l @(16,r1), r8 37*4882a593Smuzhiyun mov.l @(20,r1), r9 38*4882a593Smuzhiyun mov.l @(24,r1), r10 39*4882a593Smuzhiyun mov.l @(28,r1), r11 40*4882a593Smuzhiyun mov.l r4, @r0 41*4882a593Smuzhiyun mov.l r5, @(4,r0) 42*4882a593Smuzhiyun mov.l r6, @(8,r0) 43*4882a593Smuzhiyun mov.l r7, @(12,r0) 44*4882a593Smuzhiyun mov.l r8, @(16,r0) 45*4882a593Smuzhiyun mov.l r9, @(20,r0) 46*4882a593Smuzhiyun mov.l r10, @(24,r0) 47*4882a593Smuzhiyun mov.l r11, @(28,r0) 48*4882a593Smuzhiyun#ifdef CONFIG_CPU_SH4 49*4882a593Smuzhiyun ocbwb @r0 50*4882a593Smuzhiyun#endif 51*4882a593Smuzhiyun cmp/hi r3, r0 52*4882a593Smuzhiyun add #-32, r0 53*4882a593Smuzhiyun bt/s 3b 54*4882a593Smuzhiyun add #-32, r1 55*4882a593Smuzhiyun mov.l 2f, r0 56*4882a593Smuzhiyun jmp @r0 57*4882a593Smuzhiyun nop 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun .align 2 60*4882a593Smuzhiyun1: .long 1b 61*4882a593Smuzhiyun2: .long clear_bss 62*4882a593Smuzhiyuntext_start_addr: 63*4882a593Smuzhiyun .long startup 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* Clear BSS */ 66*4882a593Smuzhiyunclear_bss: 67*4882a593Smuzhiyun mov.l end_addr, r1 68*4882a593Smuzhiyun mov.l bss_start_addr, r2 69*4882a593Smuzhiyun mov #0, r0 70*4882a593Smuzhiyunl1: 71*4882a593Smuzhiyun mov.l r0, @-r1 72*4882a593Smuzhiyun cmp/eq r1,r2 73*4882a593Smuzhiyun bf l1 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Set the initial pointer. */ 76*4882a593Smuzhiyun mov.l init_stack_addr, r0 77*4882a593Smuzhiyun mov.l @r0, r15 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* Decompress the kernel */ 80*4882a593Smuzhiyun mov.l decompress_kernel_addr, r0 81*4882a593Smuzhiyun jsr @r0 82*4882a593Smuzhiyun nop 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* Jump to the start of the decompressed kernel */ 85*4882a593Smuzhiyun mov.l kernel_start_addr, r0 86*4882a593Smuzhiyun jmp @r0 87*4882a593Smuzhiyun nop 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun .align 2 90*4882a593Smuzhiyunbss_start_addr: 91*4882a593Smuzhiyun .long __bss_start 92*4882a593Smuzhiyunend_addr: 93*4882a593Smuzhiyun .long _end 94*4882a593Smuzhiyuninit_sr: 95*4882a593Smuzhiyun .long 0x500000F0 /* Privileged mode, Bank=0, Block=1, IMASK=0xF */ 96*4882a593Smuzhiyunkexec_magic: 97*4882a593Smuzhiyun .long 0x400000F0 /* magic used by kexec to parse zImage format */ 98*4882a593Smuzhiyuninit_stack_addr: 99*4882a593Smuzhiyun .long stack_start 100*4882a593Smuzhiyundecompress_kernel_addr: 101*4882a593Smuzhiyun .long decompress_kernel 102*4882a593Smuzhiyunkernel_start_addr: 103*4882a593Smuzhiyun#ifdef CONFIG_32BIT 104*4882a593Smuzhiyun .long ___pa(_text+PAGE_SIZE) 105*4882a593Smuzhiyun#else 106*4882a593Smuzhiyun .long _text+PAGE_SIZE 107*4882a593Smuzhiyun#endif 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun .align 9 110*4882a593Smuzhiyunfake_headers_as_bzImage: 111*4882a593Smuzhiyun .word 0 112*4882a593Smuzhiyun .ascii "HdrS" ! header signature 113*4882a593Smuzhiyun .word 0x0202 ! header version number (>= 0x0105) 114*4882a593Smuzhiyun ! or else old loadlin-1.5 will fail) 115*4882a593Smuzhiyun .word 0 ! default_switch 116*4882a593Smuzhiyun .word 0 ! SETUPSEG 117*4882a593Smuzhiyun .word 0x1000 118*4882a593Smuzhiyun .word 0 ! pointing to kernel version string 119*4882a593Smuzhiyun .byte 0 ! = 0, old one (LILO, Loadlin, 120*4882a593Smuzhiyun ! 0xTV: T=0 for LILO 121*4882a593Smuzhiyun ! V = version 122*4882a593Smuzhiyun .byte 1 ! Load flags bzImage=1 123*4882a593Smuzhiyun .word 0x8000 ! size to move, when setup is not 124*4882a593Smuzhiyun .long 0x100000 ! 0x100000 = default for big kernel 125*4882a593Smuzhiyun .long 0 ! address of loaded ramdisk image 126*4882a593Smuzhiyun .long 0 # its size in bytes 127