浏览代码

[POWERPC] Fix hang in start_ldr if _end or _edata is unaligned

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@aepfle.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Olaf Hering 18 年之前
父节点
当前提交
fb20f65a01
共有 1 个文件被更改,包括 3 次插入3 次删除
  1. 3 3
      arch/ppc/boot/simple/relocate.S

+ 3 - 3
arch/ppc/boot/simple/relocate.S

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