patch-2.2.18 linux/arch/arm/boot/compressed/head.S

Next file: linux/arch/arm/boot/compressed/ll_char_wr.S
Previous file: linux/arch/arm/boot/compressed/head-sa1100.S
Back to the patch index
Back to the overall index

diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.17/arch/arm/boot/compressed/head.S linux/arch/arm/boot/compressed/head.S
@@ -1,129 +1,253 @@
 /*
  * linux/arch/arm/boot/compressed/head.S
  *
- * Copyright (C) 1996,1997,1998 Russell King
+ * Copyright (C) 1996-1999 Russell King
  */
 #include <linux/linkage.h>
 
-		.text
+		.section ".start", #alloc, #execinstr
 /*
  * sort out different calling conventions
  */
 		.align
-		.globl	_start
-_start:
-start:		mov	r0, r0
-		mov	r0, r0
-		mov	r0, r0
-		mov	r0, r0
-		mov	r0, r0
-		mov	r0, r0
-		mov	r0, r0
+start:
+		.type	start,#function
+		.rept	8
 		mov	r0, r0
+		.endr
+
 		b	1f
-		.word	0x016f2818			@ Magic numbers to help the loader
-		.word	_start	
+		.word	0x016f2818		@ Magic numbers to help the loader
+		.word	start	
+1:
+
+		/*
+		 * some architecture specific code can
+		 * be inserted by the linker here
+		 */
+
+		.text
 1:		teq	r0, #0
-		beq	2f
-		mov	r4, #0x02000000
-		add	r4, r4, #0x7C000
-		mov	r3, #0x4000
-		sub	r3, r3, #4
-1:		ldmia	r0!, {r5 - r12}
-		stmia	r4!, {r5 - r12}
-		subs	r3, r3, #32
-		bpl	1b
-2:		adr	r2, LC0
-		ldmia	r2, {r2, r3, r4, r5, r6, sp}
-		add	r2, r2, #3
-		add	r3, r3, #3
-		add	sp, sp, #3
-		bic	r2, r2, #3
-		bic	r3, r3, #3
-		bic	sp, sp, #3
-		adr	r7, start
-		sub	r6, r7, r6
-/*
- * Relocate pointers
- */
-		add	r2, r2, r6
-		add	r3, r3, r6
-		add	r5, r5, r6
-		add	sp, sp, r6
-/*
- * Clear zero-init
- */
-		mov	r6, #0
-1:		str	r6, [r2], #4
+		bne	1b
+		mov	r7, r1			@ save architecture ID
+		mrc	p15, 0, r6, c0, c0	@ get processor ID
+		adr	r2, LC0
+		ldmia	r2, {r2, r3, r4, r5, sp}
+
+		mov	r0, #0
+1:		str	r0, [r2], #4		@ clear bss
+		str	r0, [r2], #4
+		str	r0, [r2], #4
+		str	r0, [r2], #4
 		cmp	r2, r3
 		blt	1b
-		str	r1, [r5]		@ save architecture
-/*
- * Uncompress the kernel
- */
-		mov	r1, #0x8000
-		add	r3, r2, r1, lsl #1	@ Add 64k for malloc
-		sub	r1, r1, #1
-		add	r3, r3, r1
-		bic	r5, r3, r1		@ decompress kernel to after end of the compressed
+
+		mov	r1, sp			@ malloc space above stack
+		add	r2, sp, #0x10000	@ 64k max
+
+		teq	r4, r5			@ will we overwrite ourselves?
+		moveq	r5, r2
+		movne	r5, r4
+
 		mov	r0, r5
-		mov	r1, r2
-		mov	r2, r0
+		mov	r3, r7
 		bl	SYMBOL_NAME(decompress_kernel)
-		add	r0, r0, #7
-		bic	r2, r0, #7
+
+		teq	r4, r5			@ do we need to relocate
+		beq	call_kernel		@ the kernel?
+
+		add	r0, r0, #127
+		bic	r0, r0, #127		@ align the kernel length
 /*
- * Now move the kernel to the correct location (r5 -> r4, len r0)
- */
-		mov	r0, r4			@ r0 = start of real kernel
-		mov	r1, r5			@ r1 = start of kernel image
-		add	r3, r5, r2		@ r3 = end of kernel
-		adr	r4, movecode
-		adr	r5, movecodeend
-1:		ldmia	r4!, {r6 - r12, lr}
-		stmia	r3!, {r6 - r12, lr}
-		cmp	r4, r5
+ * r0     = decompressed kernel length
+ * r1-r3  = unused
+ * r4     = kernel execution address
+ * r5     = decompressed kernel start
+ * r6     = processor ID
+ * r7     = architecture ID
+ * r8-r14 = unused
+ */
+		add	r1, r5, r0		@ end of decompressed kernel
+		adr	r2, reloc_start
+		adr	r3, reloc_end
+1:		ldmia	r2!, {r8 - r13}		@ copy relocation code
+		stmia	r1!, {r8 - r13}
+		ldmia	r2!, {r8 - r13}
+		stmia	r1!, {r8 - r13}
+		cmp	r2, r3
 		blt	1b
-		mrc	p15, 0, r5, c0, c0
-		eor	r5, r5, #0x44 << 24
-		eor	r5, r5, #0x01 << 16
-		eor	r5, r5, #0xa1 << 8
-		movs	r5, r5, lsr #4
-		mov	r5, #0
-		mcreq	p15, 0, r5, c7, c5, 0	@ flush I cache
-		ldr	r5, LC0 + 12		@ get architecture
-		ldr	r5, [r5]
-		add	pc, r1, r2		@ Call move code
+
+		eor	r1, r6, #0x44 << 24	@ SA-110?
+		eor	r1, r1, #0x01 << 16
+		eor	r1, r1, #0xa1 << 8
+		movs	r1, r1, lsr #4
+		mcreq	p15, 0, r1, c7, c7, 0	@ flush I & D-cache
+		mcreq	p15, 0, r1, c7, c10, 4	@ drain WB
+		add	pc, r5, r0		@ call relocation code
 
 /*
- * r0 = length, r1 = to, r2 = from
- */
-movecode:	add	r3, r1, r2
-		mov	r4, r0
-1:		ldmia	r1!, {r6 - r12, lr}
-		stmia	r0!, {r6 - r12, lr}
-		cmp	r1, r3
+ * r0     = decompressed kernel length
+ * r1-r3  = unused
+ * r4     = kernel execution address
+ * r5     = decompressed kernel start
+ * r6     = processor ID
+ * r7     = architecture ID
+ * r8-r14 = unused
+ */
+reloc_start:	add	r8, r5, r0
+#if 0
+	mov r0, #'\n'
+	bl putc
+	mov r0, r6
+	mov r1, #8
+	bl phex
+	mov r0, #':'
+	bl putc
+	mov r0, r5
+	mov r1, #8
+	bl phex
+	mov r0, #'-'
+	bl putc
+	mov r0, r8
+	mov r1, #8
+	bl phex
+	mov r0, #'>'
+	bl putc
+	mov r0, r4
+	mov r1, #8
+	bl phex
+	mov r0, #'\n'
+	bl putc
+#endif
+		mov	r0, r8
+		mov	r1, r4
+1:
+		.rept	4
+		ldmia	r5!, {r2, r3, r8 - r13}	@ relocate kernel
+		stmia	r1!, {r2, r3, r8 - r13}
+		.endr
+
+		cmp	r5, r0
 		blt	1b
-		mrc	p15, 0, r0, c0, c0
-		eor	r0, r0, #0x44 << 24
+#if 0
+	mov r8, r0
+	mov r0, r5
+	mov r1, #8
+	bl phex
+	mov r0, #'-'
+	bl putc
+	mov r0, r8
+	mov r1, #8
+	bl phex
+	mov r0, #'\n'
+	bl putc
+	mov r0, r4
+	bl  memdump
+#endif
+		eor	r0, r6, #0x44 << 24	@ SA-110?
 		eor	r0, r0, #0x01 << 16
 		eor	r0, r0, #0xa1 << 8
 		movs	r0, r0, lsr #4
+		mcreq	p15, 0, r0, c7, c7, 0	@ flush I cache
+		mcreq	p15, 0, r1, c7, c10, 4	@ drain WB
+
+call_kernel:	mov	r0, #0
+		mov	r1, r7			@ restore architecture number
+		mov	pc, r4			@ call kernel
+
+phexbuf:	.space	12
+
+#if 0
+		.macro	loadsp,	rb
+		mov	\rb, #0x7c000000
+		.endm
+
+		.macro	writeb,	rb
+		strb	\rb, [r3, #0x3f8]
+		.endm
+#else
+		.macro	loadsp,	rb
+		mov	\rb, #0x03000000
+		orr	\rb, \rb, #0x00010000
+		.endm
+
+		.macro	writeb,	rb
+		strb	\rb, [r3, #0x3f8 << 2]
+		.endm
+#endif
+
+phex:		adr	r3, phexbuf
+		mov	r2, #0
+		strb	r2, [r3, r1]
+1:		subs	r1, r1, #1
+		movmi	r0, r3
+		bmi	puts
+		and	r2, r0, #15
+		mov	r0, r0, lsr #4
+		cmp	r2, #10
+		addge	r2, r2, #7
+		add	r2, r2, #'0'
+		strb	r2, [r3, r1]
+		b	1b
+
+puts:		loadsp	r3
+1:		ldrb	r2, [r0], #1
+		teq	r2, #0
+		moveq	pc, lr
+2:		writeb	r2
+		mov	r1, #0x00020000
+3:		subs	r1, r1, #1
+		bne	3b
+		teq	r2, #'\n'
+		moveq	r2, #'\r'
+		beq	2b
+		teq	r0, #0
+		bne	1b
+		mov	pc, lr
+putc:
+		mov	r2, r0
 		mov	r0, #0
-		mcreq	p15, 0, r0, c7, c5, 0	@ flush I cache
-		mov	r1, r5			@ call kernel correctly
-		mov	pc, r4			@ call via EXEC entry
-movecodeend:
-
-LC0:		.word	SYMBOL_NAME(_edata)
-		.word	SYMBOL_NAME(_end)
-		.word	LOADADDR
-		.word	SYMBOL_NAME(architecture)
-		.word	start
-		.word	SYMBOL_NAME(user_stack)+4096
-		.align
+		loadsp	r3
+		b	2b
 
-		.bss
-SYMBOL_NAME(architecture):
-		.space	4
+memdump:	mov	r12, r0
+		mov	r10, lr
+		mov	r1, #8
+		bl	phex
+		mov	r0, #'\n'
+		bl	putc
+		mov	r11, #0
+2:		mov	r0, r11, lsl #2
+		mov	r1, #4
+		bl	phex
+		mov	r0, #':'
+		bl	putc
+1:		mov	r0, #' '
+		bl	putc
+		ldr	r0, [r12, r11, lsl #2]
+		mov	r1, #8
+		bl	phex
+		and	r0, r11, #7
+		teq	r0, #3
+		moveq	r0, #' '
+		bleq	putc
+		and	r0, r11, #7
+		add	r11, r11, #1
+		teq	r0, #7
+		bne	1b
+		mov	r0, #'\n'
+		bl	putc
+		cmp	r11, #64
+		blt	2b
+		mov	pc, r10
+reloc_end:
+
+LC0:		.word	__bss_start
+		.word	_end
+		.word	_load_addr
+		.word	_start
+		.word	user_stack+4096
 		.align
+
+		.section	".stack"
+user_stack:	.space	4096

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)