| /* | |
| * linux/arch/sh/boot/compressed/head.S | |
| * | |
| * Copyright (C) 1999 Stuart Menefy | |
| * Copyright (C) 2003 SUGIOKA Toshinobu | |
| */ | |
| .text | |
| #include <asm/page.h> | |
| .global startup | |
| startup: | |
| /* Load initial status register */ | |
| mov.l init_sr, r1 | |
| ldc r1, sr | |
| /* Move myself to proper location if necessary */ | |
| mova 1f, r0 | |
| mov.l 1f, r2 | |
| cmp/eq r2, r0 | |
| bt clear_bss | |
| sub r0, r2 | |
| mov.l bss_start_addr, r0 | |
| mov #0xffffffe0, r1 | |
| and r1, r0 ! align cache line | |
| mov.l text_start_addr, r3 | |
| mov r0, r1 | |
| sub r2, r1 | |
| 3: | |
| mov.l @r1, r4 | |
| mov.l @(4,r1), r5 | |
| mov.l @(8,r1), r6 | |
| mov.l @(12,r1), r7 | |
| mov.l @(16,r1), r8 | |
| mov.l @(20,r1), r9 | |
| mov.l @(24,r1), r10 | |
| mov.l @(28,r1), r11 | |
| mov.l r4, @r0 | |
| mov.l r5, @(4,r0) | |
| mov.l r6, @(8,r0) | |
| mov.l r7, @(12,r0) | |
| mov.l r8, @(16,r0) | |
| mov.l r9, @(20,r0) | |
| mov.l r10, @(24,r0) | |
| mov.l r11, @(28,r0) | |
| #ifdef CONFIG_CPU_SH4 | |
| ocbwb @r0 | |
| #endif | |
| cmp/hi r3, r0 | |
| add #-32, r0 | |
| bt/s 3b | |
| add #-32, r1 | |
| mov.l 2f, r0 | |
| jmp @r0 | |
| nop | |
| .align 2 | |
| 1: .long 1b | |
| 2: .long clear_bss | |
| text_start_addr: | |
| .long startup | |
| /* Clear BSS */ | |
| clear_bss: | |
| mov.l end_addr, r1 | |
| mov.l bss_start_addr, r2 | |
| mov #0, r0 | |
| l1: | |
| mov.l r0, @-r1 | |
| cmp/eq r1,r2 | |
| bf l1 | |
| /* Set the initial pointer. */ | |
| mov.l init_stack_addr, r0 | |
| mov.l @r0, r15 | |
| /* Decompress the kernel */ | |
| mov.l decompress_kernel_addr, r0 | |
| jsr @r0 | |
| nop | |
| /* Jump to the start of the decompressed kernel */ | |
| mov.l kernel_start_addr, r0 | |
| jmp @r0 | |
| nop | |
| .align 2 | |
| bss_start_addr: | |
| .long __bss_start | |
| end_addr: | |
| .long _end | |
| init_sr: | |
| .long 0x500000F0 /* Privileged mode, Bank=0, Block=1, IMASK=0xF */ | |
| kexec_magic: | |
| .long 0x400000F0 /* magic used by kexec to parse zImage format */ | |
| init_stack_addr: | |
| .long stack_start | |
| decompress_kernel_addr: | |
| .long decompress_kernel | |
| kernel_start_addr: | |
| #ifdef CONFIG_32BIT | |
| .long ___pa(_text+PAGE_SIZE) | |
| #else | |
| .long _text+PAGE_SIZE | |
| #endif | |
| .align 9 | |
| fake_headers_as_bzImage: | |
| .word 0 | |
| .ascii "HdrS" ! header signature | |
| .word 0x0202 ! header version number (>= 0x0105) | |
| ! or else old loadlin-1.5 will fail) | |
| .word 0 ! default_switch | |
| .word 0 ! SETUPSEG | |
| .word 0x1000 | |
| .word 0 ! pointing to kernel version string | |
| .byte 0 ! = 0, old one (LILO, Loadlin, | |
| ! 0xTV: T=0 for LILO | |
| ! V = version | |
| .byte 1 ! Load flags bzImage=1 | |
| .word 0x8000 ! size to move, when setup is not | |
| .long 0x100000 ! 0x100000 = default for big kernel | |
| .long 0 ! address of loaded ramdisk image | |
| .long 0 # its size in bytes |