162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/sh/boot/compressed/head.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1999 Stuart Menefy 662306a36Sopenharmony_ci * Copyright (C) 2003 SUGIOKA Toshinobu 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci.text 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <asm/page.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci .global startup 1462306a36Sopenharmony_cistartup: 1562306a36Sopenharmony_ci /* Load initial status register */ 1662306a36Sopenharmony_ci mov.l init_sr, r1 1762306a36Sopenharmony_ci ldc r1, sr 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci /* Move myself to proper location if necessary */ 2062306a36Sopenharmony_ci mova 1f, r0 2162306a36Sopenharmony_ci mov.l 1f, r2 2262306a36Sopenharmony_ci cmp/eq r2, r0 2362306a36Sopenharmony_ci bt clear_bss 2462306a36Sopenharmony_ci sub r0, r2 2562306a36Sopenharmony_ci mov.l bss_start_addr, r0 2662306a36Sopenharmony_ci mov #0xffffffe0, r1 2762306a36Sopenharmony_ci and r1, r0 ! align cache line 2862306a36Sopenharmony_ci mov.l text_start_addr, r3 2962306a36Sopenharmony_ci mov r0, r1 3062306a36Sopenharmony_ci sub r2, r1 3162306a36Sopenharmony_ci3: 3262306a36Sopenharmony_ci mov.l @r1, r4 3362306a36Sopenharmony_ci mov.l @(4,r1), r5 3462306a36Sopenharmony_ci mov.l @(8,r1), r6 3562306a36Sopenharmony_ci mov.l @(12,r1), r7 3662306a36Sopenharmony_ci mov.l @(16,r1), r8 3762306a36Sopenharmony_ci mov.l @(20,r1), r9 3862306a36Sopenharmony_ci mov.l @(24,r1), r10 3962306a36Sopenharmony_ci mov.l @(28,r1), r11 4062306a36Sopenharmony_ci mov.l r4, @r0 4162306a36Sopenharmony_ci mov.l r5, @(4,r0) 4262306a36Sopenharmony_ci mov.l r6, @(8,r0) 4362306a36Sopenharmony_ci mov.l r7, @(12,r0) 4462306a36Sopenharmony_ci mov.l r8, @(16,r0) 4562306a36Sopenharmony_ci mov.l r9, @(20,r0) 4662306a36Sopenharmony_ci mov.l r10, @(24,r0) 4762306a36Sopenharmony_ci mov.l r11, @(28,r0) 4862306a36Sopenharmony_ci#ifdef CONFIG_CPU_SH4 4962306a36Sopenharmony_ci ocbwb @r0 5062306a36Sopenharmony_ci#endif 5162306a36Sopenharmony_ci cmp/hi r3, r0 5262306a36Sopenharmony_ci add #-32, r0 5362306a36Sopenharmony_ci bt/s 3b 5462306a36Sopenharmony_ci add #-32, r1 5562306a36Sopenharmony_ci mov.l 2f, r0 5662306a36Sopenharmony_ci jmp @r0 5762306a36Sopenharmony_ci nop 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci .align 2 6062306a36Sopenharmony_ci1: .long 1b 6162306a36Sopenharmony_ci2: .long clear_bss 6262306a36Sopenharmony_citext_start_addr: 6362306a36Sopenharmony_ci .long startup 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci /* Clear BSS */ 6662306a36Sopenharmony_ciclear_bss: 6762306a36Sopenharmony_ci mov.l end_addr, r1 6862306a36Sopenharmony_ci mov.l bss_start_addr, r2 6962306a36Sopenharmony_ci mov #0, r0 7062306a36Sopenharmony_cil1: 7162306a36Sopenharmony_ci mov.l r0, @-r1 7262306a36Sopenharmony_ci cmp/eq r1,r2 7362306a36Sopenharmony_ci bf l1 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* Set the initial pointer. */ 7662306a36Sopenharmony_ci mov.l init_stack_addr, r0 7762306a36Sopenharmony_ci mov.l @r0, r15 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci /* Decompress the kernel */ 8062306a36Sopenharmony_ci mov.l decompress_kernel_addr, r0 8162306a36Sopenharmony_ci jsr @r0 8262306a36Sopenharmony_ci nop 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* Jump to the start of the decompressed kernel */ 8562306a36Sopenharmony_ci mov.l kernel_start_addr, r0 8662306a36Sopenharmony_ci jmp @r0 8762306a36Sopenharmony_ci nop 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci .align 2 9062306a36Sopenharmony_cibss_start_addr: 9162306a36Sopenharmony_ci .long __bss_start 9262306a36Sopenharmony_ciend_addr: 9362306a36Sopenharmony_ci .long _end 9462306a36Sopenharmony_ciinit_sr: 9562306a36Sopenharmony_ci .long 0x500000F0 /* Privileged mode, Bank=0, Block=1, IMASK=0xF */ 9662306a36Sopenharmony_cikexec_magic: 9762306a36Sopenharmony_ci .long 0x400000F0 /* magic used by kexec to parse zImage format */ 9862306a36Sopenharmony_ciinit_stack_addr: 9962306a36Sopenharmony_ci .long stack_start 10062306a36Sopenharmony_cidecompress_kernel_addr: 10162306a36Sopenharmony_ci .long decompress_kernel 10262306a36Sopenharmony_cikernel_start_addr: 10362306a36Sopenharmony_ci#ifdef CONFIG_32BIT 10462306a36Sopenharmony_ci .long ___pa(_text+PAGE_SIZE) 10562306a36Sopenharmony_ci#else 10662306a36Sopenharmony_ci .long _text+PAGE_SIZE 10762306a36Sopenharmony_ci#endif 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci .align 9 11062306a36Sopenharmony_cifake_headers_as_bzImage: 11162306a36Sopenharmony_ci .word 0 11262306a36Sopenharmony_ci .ascii "HdrS" ! header signature 11362306a36Sopenharmony_ci .word 0x0202 ! header version number (>= 0x0105) 11462306a36Sopenharmony_ci ! or else old loadlin-1.5 will fail) 11562306a36Sopenharmony_ci .word 0 ! default_switch 11662306a36Sopenharmony_ci .word 0 ! SETUPSEG 11762306a36Sopenharmony_ci .word 0x1000 11862306a36Sopenharmony_ci .word 0 ! pointing to kernel version string 11962306a36Sopenharmony_ci .byte 0 ! = 0, old one (LILO, Loadlin, 12062306a36Sopenharmony_ci ! 0xTV: T=0 for LILO 12162306a36Sopenharmony_ci ! V = version 12262306a36Sopenharmony_ci .byte 1 ! Load flags bzImage=1 12362306a36Sopenharmony_ci .word 0x8000 ! size to move, when setup is not 12462306a36Sopenharmony_ci .long 0x100000 ! 0x100000 = default for big kernel 12562306a36Sopenharmony_ci .long 0 ! address of loaded ramdisk image 12662306a36Sopenharmony_ci .long 0 # its size in bytes 127