diff options
author | Michal Simek | 2010-05-24 12:13:24 +0200 |
---|---|---|
committer | Michal Simek | 2010-08-04 10:22:31 +0200 |
commit | 6847ba91a190fe41d21779d6b382b47b2f4c50f4 (patch) | |
tree | a7d628c0f938259003a35e1b7d2316924768900a /arch/microblaze/include/asm/cacheflush.h | |
parent | microblaze: Sync noMMU and MMU setup_memory (diff) | |
download | kernel-qcow2-linux-6847ba91a190fe41d21779d6b382b47b2f4c50f4.tar.gz kernel-qcow2-linux-6847ba91a190fe41d21779d6b382b47b2f4c50f4.tar.xz kernel-qcow2-linux-6847ba91a190fe41d21779d6b382b47b2f4c50f4.zip |
microblaze: Fix copy_to_user_page macro
copy_to_user_page macro is used in mm/memory.c:access_process_vm
function. This function is called from ptrace code (POKETEXT, POKEDATA)
which write data to memory. Microblaze handle physical address for
caches that's why there is virt_to_phys conversion.
There is potential one location which can caused the problem on WB system.
The important is take a look at write PTRACEs requests
(POKE/TEXT, DATA, USR).
Note:
Majority of Microblaze PTRACE code is moved to generic location
in newer kernel version that's why this solution should work on
the newest kernel version too.
linux/io.h is in cacheflush because of mm/nommu.c
Tested on a WB system - hello world debugging.
Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze/include/asm/cacheflush.h')
-rw-r--r-- | arch/microblaze/include/asm/cacheflush.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/arch/microblaze/include/asm/cacheflush.h b/arch/microblaze/include/asm/cacheflush.h index e9bb567e1b0e..7ebd955460d9 100644 --- a/arch/microblaze/include/asm/cacheflush.h +++ b/arch/microblaze/include/asm/cacheflush.h @@ -103,8 +103,10 @@ do { \ #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ do { \ + u32 addr = virt_to_phys(dst); \ + invalidate_icache_range((unsigned) (addr), (unsigned) (addr) + (len));\ memcpy((dst), (src), (len)); \ - flush_icache_range((unsigned) (dst), (unsigned) (dst) + (len)); \ + flush_dcache_range((unsigned) (addr), (unsigned) (addr) + (len));\ } while (0) #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ |