浏览代码

powerpc: Fix __flush_icache_range on 44x

The ptrace POKETEXT interface allows a process to modify the text pages of
a child process being ptraced, usually to insert breakpoints via trap
instructions.  The kernel eventually calls copy_to_user_page, which in turn
calls __flush_icache_range to invalidate the icache lines for the child
process.

However, this function does not work on 44x due to the icache being virtually
indexed.  This was noticed by a breakpoint being triggered after it had been
cleared by ltrace on a 440EPx board.  The convenient solution is to do a
flash invalidate of the icache in the __flush_icache_range function.

Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Josh Boyer 16 年之前
父节点
当前提交
14d757520a
共有 1 个文件被更改,包括 7 次插入0 次删除
  1. 7 0
      arch/powerpc/kernel/misc_32.S

+ 7 - 0
arch/powerpc/kernel/misc_32.S

@@ -342,10 +342,17 @@ END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
 	addi	r3,r3,L1_CACHE_BYTES
 	addi	r3,r3,L1_CACHE_BYTES
 	bdnz	1b
 	bdnz	1b
 	sync				/* wait for dcbst's to get to ram */
 	sync				/* wait for dcbst's to get to ram */
+#ifndef CONFIG_44x
 	mtctr	r4
 	mtctr	r4
 2:	icbi	0,r6
 2:	icbi	0,r6
 	addi	r6,r6,L1_CACHE_BYTES
 	addi	r6,r6,L1_CACHE_BYTES
 	bdnz	2b
 	bdnz	2b
+#else
+	/* Flash invalidate on 44x because we are passed kmapped addresses and
+	   this doesn't work for userspace pages due to the virtually tagged
+	   icache.  Sigh. */
+	iccci	0, r0
+#endif
 	sync				/* additional sync needed on g4 */
 	sync				/* additional sync needed on g4 */
 	isync
 	isync
 	blr
 	blr