linux/arch/sh/boot/compressed/head_32.S
Magnus Damm 68a1aed703 sh: boot kernel with SR.BL set
Update the SH kernel to keep SR.BL set until the VBR
register has been initialized. Useful to allow boot
of the kernel even though exceptions are pending.

Without this patch there is a window of time when
exceptions such as NMI are enabled but no exception
handlers are installed.

This patch modifies both the zImage loader and the
actual kernel to boot with BL=1, but the zImage
loader is modfied in such a way that the init_sr
value is unchanged to not break the zImage loader
provided by kexec.

Tested on sh7724 Ecovec and on the SH4AL-DSP core
included in sh7372.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
2010-09-30 09:43:32 +09:00

125 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