[PATCH] stop infinite loop in start_ldr due to unaligned sections

Olaf Hering olaf at aepfle.de
Fri Oct 20 23:57:15 EST 2006

Quick fix for lack of memset(__bss_start,0,_end-__bss_start) in load_kernel()
If edata is unaligned, the loop will overwrite all memory because
r3 and r4 will never be equal.

Signed-off-by: Olaf Hering <olaf at aepfle.de>

 arch/ppc/boot/simple/relocate.S |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Index: linux-2.6.19-rc2/arch/ppc/boot/simple/relocate.S
--- linux-2.6.19-rc2.orig/arch/ppc/boot/simple/relocate.S
+++ linux-2.6.19-rc2/arch/ppc/boot/simple/relocate.S
@@ -154,8 +154,8 @@ do_relocate_out:
 /* Clear all of BSS and set up stack for C calls */
-	lis	r3,edata at h
-	ori	r3,r3,edata at l
+	lis	r3,__bss_start at h
+	ori	r3,r3,__bss_start at l
 	lis	r4,end at h
 	ori	r4,r4,end at l
 	subi	r3,r3,4
@@ -163,7 +163,7 @@ start_ldr:
 	li	r0,0
 50:	stwu	r0,4(r3)
 	cmpw	cr0,r3,r4
-	bne	50b
+	blt	50b
 90:	mr	r9,r1		/* Save old stack pointer (in case it matters) */
 	lis	r1,.stack at h
 	ori	r1,r1,.stack at l

More information about the Linuxppc-dev mailing list