| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* | 
					
						
							|  |  |  |  *  linux/arch/sh/boot/compressed/head.S | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Copyright (C) 1999 Stuart Menefy | 
					
						
							|  |  |  |  *  Copyright (C) 2003 SUGIOKA Toshinobu | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .text | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-12-12 08:53:29 +09:00
										 |  |  | #include <asm/page.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.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 | 
					
						
							| 
									
										
										
										
											2009-08-24 17:09:53 +09:00
										 |  |  | 	mov	#0xffffffe0, r1 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	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: | 
					
						
							| 
									
										
										
										
											2010-09-24 09:05:38 +00:00
										 |  |  | 	.long	0x500000F0	/* Privileged mode, Bank=0, Block=1, IMASK=0xF */ | 
					
						
							|  |  |  | kexec_magic: | 
					
						
							|  |  |  | 	.long	0x400000F0	/* magic used by kexec to parse zImage format */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | init_stack_addr: | 
					
						
							|  |  |  | 	.long	stack_start
 | 
					
						
							|  |  |  | decompress_kernel_addr: | 
					
						
							|  |  |  | 	.long	decompress_kernel
 | 
					
						
							|  |  |  | kernel_start_addr: | 
					
						
							| 
									
										
										
										
											2010-04-24 13:28:20 +01:00
										 |  |  | #ifdef CONFIG_32BIT | 
					
						
							|  |  |  | 	.long	___pa(_text+PAGE_SIZE) | 
					
						
							|  |  |  | #else | 
					
						
							| 
									
										
										
										
											2006-12-12 08:53:29 +09:00
										 |  |  | 	.long	_text+PAGE_SIZE | 
					
						
							| 
									
										
										
										
											2010-04-24 13:28:20 +01:00
										 |  |  | #endif | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	.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 |