126 lines
2.3 KiB
ArmAsm
126 lines
2.3 KiB
ArmAsm
|
/*
|
||
|
* 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
|