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>
This commit is contained in:
committed by
Benjamin Herrenschmidt
parent
ea3cc330ac
commit
14d757520a
@@ -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
|
||||||
|
Reference in New Issue
Block a user