68a1aed703
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>
125 lines
2.3 KiB
ArmAsm
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
|