microblaze: Fix GDB issue caused by cache issue
Michal Simek [Fri, 28 May 2010 12:45:38 +0000 (14:45 +0200)]
Used the same solution as SH. Changed len to PAGE_SIZE
in copy_to_user_page macro.

Implement flush_cache_page macro.

Signed-off-by: Michal Simek <monstr@monstr.eu>

arch/microblaze/include/asm/cacheflush.h

index 7ebd955..5a5d835 100644 (file)
@@ -89,7 +89,9 @@ do { \
 #define flush_cache_vmap(start, end)                   do { } while (0)
 #define flush_cache_vunmap(start, end)                 do { } while (0)
 #define flush_cache_mm(mm)                     do { } while (0)
-#define flush_cache_page(vma, vmaddr, pfn)     do { } while (0)
+
+#define flush_cache_page(vma, vmaddr, pfn) \
+       flush_dcache_range(pfn << PAGE_SHIFT, (pfn << PAGE_SHIFT) + PAGE_SIZE);
 
 /* MS: kgdb code use this macro, wrong len with FLASH */
 #if 0
@@ -104,9 +106,13 @@ 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_dcache_range((unsigned) (addr), (unsigned) (addr) + (len));\
+       if (vma->vm_flags & VM_EXEC) {                                  \
+               invalidate_icache_range((unsigned) (addr),              \
+                                       (unsigned) (addr) + PAGE_SIZE); \
+               flush_dcache_range((unsigned) (addr),                   \
+                                       (unsigned) (addr) + PAGE_SIZE); \
+       }                                                               \
 } while (0)
 
 #define copy_from_user_page(vma, page, vaddr, dst, src, len)           \