 68a1aed703
			
		
	
	
	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
 |